「Pythonにおけるサンプリング技術と比較の実践」

「Pythonによるサンプリング技術の実践とその比較」

Pythonを使用してデータセットを効率的にサンプリングする方法のステップバイステップチュートリアル

筆者による画像

妻と一緒にクリスマスツリーを飾りました。地下室に行って、ツリーを持ち上げて、階段を上がって、ツリーを組み立て始めました。いつも魔法の瞬間です🎄

それからツリーにボールをつけるという時が来ました。そして、すぐに考えました:ツリーにボールをつける方法は少なくとも3つあります。

  • 均等に:ボールを均等にツリーにつける、こんな感じです
筆者による画像, Freepikを使用して作成
  • ランダムに:目を閉じて、どこでもいいと思う所にボールをつける、(私はこれを始めたところ、妻は激怒しました)
筆者による画像, Freepikを使用して作成
  • ラテンハイパーキューブ:ツリーをNのセクションに分割し、それぞれのセクションをランダムに抽出します。コードを実行せずに描くのは非常に難しいですが、可能なラテンハイパーキューブはこのようになります。
筆者による画像, Freepikを使用して作成

私はこれを妻に見せようと試みました。彼女は笑って「どうでもいいわ」と言いましたので、あなたの反応がもう少し満足のいくものになることを願ってコンピュータに向かいました 😤

冗談はさておき、機械学習の問題を扱う際には2つの異なるシナリオがあります:

  1. データセットに何の制御もありません。クライアントや会社からデータセットが提供されます。それが必要な(場合によっては)再訓練が予定されるまで対処する必要があるものです。

例えば、ニューヨーク市では与えられた特徴に基づいて家の価格を予測したい場合です。データセットを渡され、興味のある家の特徴に基づいて価格を予測できるAIソフトウェアを作成するように求められます。

2. 実験デザインを構築できます。これは、常に実行できるフォワードモデルまたは現実の実験がある場合です。

例えば、研究室で実験セットアップに基づいて物理信号を予測したい場合です。常に研究室に行って新しいデータを生成することができます。

これらの2つの場合について考慮すべき点はまったく異なります。

最初の場合では、特徴量がバランスを欠いているかもしれず、入力値の欠損や目標値の偏った分布があることを予想できます。これらのことに対処するために、データ拡張、データフィルタリング、欠損値の補完、ANOVAテストなどを行います。2番目の場合では、入力の観点からデータセットの進行状況を完全に制御することができます。つまり、NaN値がある場合は実験を繰り返すことができ、複数のNaN値がある場合はデータセットの奇妙な領域を調査することができ、特定の特徴の疑わしい大きな値がある場合は、設定の幻覚ではないことを確認するために実験を繰り返すことができます。

このように私たちはこの量の制御を持っているので、入力パラメータ空間を効率的にカバーする必要があります。たとえば、3つのパラメータがある場合、境界を知っている場合

作者による画像

iが1から3(またはPythonが好きなら0から2まで)の範囲であることを思い出してください。この場合、x_iはi番目の変数であり、常にx_i^L(下限)より大きく、常にx_i^U(上限)より小さくなります。

私たちは3次元の立方体を持っています。

作者による画像

さて、私たちはデータセットを完全に制御できることを忘れないでください。どのようにサンプリングしますか?つまり、どの点を選択して、フォワードモデル(実験またはシミュレーション)を実行し、目標値を取得しますか?

おそらく、これを行うための複数の方法があることは想像できるでしょう。それぞれの方法には利点と欠点があります。この研究では、それらについて議論し、それらの背後にある理論を示し、コードを表示して、サンプリングの美しい世界について詳しく理解できるようにします。🙂

まずは一様サンプリングから始めましょう:

1. 一様サンプリング

一様サンプリング法はおそらくもっともシンプルで有名な方法です。

それは単純に各パラメータ(または次元)ごとにステップで区切ることについてです。3つのステップが各次元に対してあり、2つの次元に対して行われたと仮定しましょう。各次元は0から1までの範囲にあります(すぐにこれを拡張します)。これがサンプリングです:

  • (0,0)
  • (0,0.5)
  • (0,1)
  • (0.5,0)
  • (0.5,0.5)
  • (0.5,1)
  • (1,0)
  • (1,0.5)
  • (1,1)

つまり、一度に1つの変数を固定し、ステップごとに増やしていきます。非常にシンプルです。コードを書きましょう:

1.1 一様サンプリングのコード

どのように行うのでしょうか?このような構造を避けましょう:

  • 次元1についてのループa
  • 次元2についてのループb
  • 次元の数だけ文字の最後のアルファベットに対してのループ:X.append([a,b,…,アルファベットの最後の文字])

次元ごとに変数を定義する必要があり、面倒であるため、これは望ましくありません。代わりに魔法のnumpyを使いましょう。

質問np.meshgrid(*points)は、forループを使用して行うことと同じことを、最適化された方法で行います。パラメータ辞書は、各パラメータの最小値と最大値を示す辞書であることが意図されています。

このコードの一部を使用すると、0/1の立方体と3つの異なる次元(たとえば、最初の次元は-5から1、2番目の次元は0から10、3番目の次元は-1から1)を生成します:

3つの次元を持っていますが、最初の2つをプロットしましょう:

1.2 利点と欠点

利点: この方法は2つの理由で非常に知られています。最初の理由は、実装が非常に簡単であることです。変数間でのforループです。2つ目の理由は、もちろん、パラメータ空間を均等にカバーしているため、重要な部分を見逃さないようにするためです

デメリット: この方法の巨大な問題は、指数的な依存関係です。次元数が固定されていると仮定すると(たとえば6とします)、steps = 10のデザインではすでに100万ポイントの実現が必要になります。そして問題は、再び指数関数的なものです。ステップ数を2倍に増やす場合(10ではなく20ステップ)、64Mポイントの問題になります。

2. ランダムサンプリング

一様サンプリングの代わりにランダムサンプリングがあります。これはどのように機能するのでしょうか?非常にシンプルです。対象の立方体内で、境界線上でランダムに点を選択するだけです。

2.1 ランダムサンプリングコード

ランダムサンプリング方法は非常にシンプルにコーディングできます。0-1の立方体やカスタム境界の立方体の両方に適用できます。以下がコードの例です:

Let’s plot this:

2.2 利点と欠点

利点: ランダムサンプリングも理解しやすく、コーディングも簡単です(先ほどご覧いただいたように)。また、この方法は特に大きな次元に対して一様サンプリングよりも出力空間の複雑さを捉えることができます。

デメリット: サンプリングの固有のランダム性が問題です。これにより、クラスターや探索の少ない領域が発生する可能性があります。

もう少し詳しく説明すると、Pedergnana et alによる論文(非常に優れたもの)では、これらの2つの方法と他の方法、特に高次元の場合の違いが比較されています。

3. ラテンハイパーキューブサンプリング

通常、「均等にランダム化されたサンプリング」と定義されるラテンハイパーキューブサンプリングです。とても美しい定義だと思います。アイデアを説明します。

LHSのキーアイデアは、各次元に沿って等しく確率的な間隔でパラメータスペースを分割し、各間隔内では1つのサンプルのみが取得されるようにすることです。これにより、層別化されて均等に分散したサンプルが得られ、パラメータスペース全体をカバーします。

ラテンハイパーキューブの素晴らしいところは、最小距離を最大化するための最適化手法などを使用して、点とその間隔内のランダムな位置に配置できることです。

3.1 ラテンハイパーキューブのコード

この方法は、Surrogate Modelling Toolbox (smt)というカスタムインストールを必要とします。

pip install smt

とても簡単です:

3.2 利点と欠点

ラテンハイパーキューブは、ランダムサンプリングと外観上は似ていますが、複数の次元では均等サンプリングの制約のない形式の規則性を保持するのに役立ちます。この方法は、次元数が多くサンプル数が少ない場合(最も難しいケース)に最適です。この方法の欠点は、実装と説明がはるかに複雑であり、ドメイン知識と実際の経験が必要です。

4. 結論

このブログ記事では、機械学習の入力パラメータの制御が可能な場合の3つの実験デザインまたはサンプリング手法を見ました。具体的には、以下のものを見ました:

  • 一様(グリッド)サンプリング: N次元グリッドを構築する方法で、Nは次元数です。使用は簡単ですが、特に大きな次元では詳細性が不足しています。
  • ランダムサンプリングはN次元の立方体を定義し、立方体内でランダムな値を抽出する方法です。一様サンプリングよりも機能が向上していますが、クラスターや密集した領域を作成する可能性がまだあります。
  • ラテンハイパーキューブサンプリングは、N次元のハイパーキューブの異なるセクションに少なくとも1つの点がサンプリングされることを強制することで、ランダムサンプリングを正規化する方法です。次元数が大きく、サンプルが少ない場合に最適ですが、ドメイン知識と最適化手法が必要です。

ユニタリーキューブ(各変数の0から1まで)および各変数のカスタム制限の両方について、コーディング例を示しました。

どの方法も完璧ではありませんし、どちらを採用するかは最終目標に依存します。この記事が、どの実験デザインが最適かを選ぶ際に少しの枠組みを提供できればと思います 🙂

5. 結論

もしこの記事が気に入った場合や、機械学習についてさらに知りたい場合、または何か質問がある場合は以下の方法で連絡できます:

A. Linkedinで私のストーリーをすべて見るためにフォローしてください。
B. ニュースレターに登録してください。新しい記事の情報を受け取り、修正や疑問がある場合はテキストで直接連絡できます。
C. 紹介されたメンバーになると、月間の「最大ストーリー数」の制限がなくなり、最新の技術について私(および他の数千の機械学習とデータサイエンスのトップライター)が書く記事を読むことができます。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more