データが非常に少ない場合の自動関連性決定または機械学習

機械学習に関しては、通常、大量のデータ-数百万または数十億のトランザクションを意味します。そこから、ユーザー、顧客または任意のデバイス(ロボット、車、ドローンまたは機械)の動作、関心、または現在の状態について難しい結論を出す必要があります。

ただし、普通の会社自体の普通のアナリストの生活では、大量のデータは一般的ではありません。 それどころか、文字通り数十または数百のレコードのデータがほとんど、またはほとんどありません。 ただし、分析を行う必要があります。 分析だけでなく、高品質で信頼性の高いものです。







多くの場合、各レコードに対して多くの符号を簡単に生成できるため、状況はさらに悪化します(多くの場合、多項式、前の値と昨年の値との差、カテゴリ符号のワンホットエンコードなど)。 どれが本当に有用で、どのモデルがモデルを複雑にし、あなたの予後の間違いを増やすかを見つけるのは簡単ではありません。







これを行うには、 自動関連性決定などのベイジアン統計法を使用できます。 これは、1992年にDavid Mackayによって提案された比較的新しい方法です(すべて博士論文(PDF)から始まりました)。 このPDFプレゼンテーションでは、メソッドの非常に短いが理解できない要約を見つけることができます。 明確だが過度に詳細な説明はここにあります









それが非常に単純な場合、各係数のARDに事後分散推定値が表示され、小さな分散を持つ係数がゼロになります。







実際にどのように機能するかを見てみましょう。 したがって、初期データは30ポイントのみです(たとえば、30店舗のデータ)。 さらに、各店舗には30の標識があります。 そして、タスクは回帰モデルを作成することです(たとえば、店舗の場所、形式、販売エリア、構成、人員、およびその他のパラメーターによって売上を予測する)。

そのような条件下で従来の線形回帰を構築することは、純粋な狂気です。 5つの兆候だけが実際に重要であり、残りは完全に無関係なデータであるという事実によって、問題をさらに悪化させましょう。







したがって、実際の依存関係を式Y = w * X + eで表します。ここで、 eはランダムな正規誤差であり、係数wは[1、2、3、4、5、0、0、....、0]です。つまり、最初の5つの係数のみが非ゼロであり、6から30までの符号はYの実際の値にまったく影響しません。 ただし、これはわかりません。 データ-XY-のみがあり、係数wを計算する必要があります。







ARDを実行します。







import numpy as np from sklearn.linear_model import ARDRegression N = 30 #    (   ) X = np.random.random(size=(N,N)) * 10 + 1 #   [1 2 3 4 5 0 0 ... 0] w = np.zeros(N) w[:5] = np.arange(5) + 1 #    e = np.random.normal(0, 1, size=N) #    Y = np.dot(X, w) + e ard = ARDRegression() ard.fit(X, Y) print ard.coef_
      
      





そして、印象的な結果が得られます。







 array([ 1.01, 2.14, 2.95, 3.89, 4.79, 0., 0., 0., 0., 0.01, 0., 0., 0.31, 0.04, -0.05, 0. , 0., 0.01, 0., 0., 0., 0., 0.01, 0., 0., 0., 0., 0.17, 0., 0. ])
      
      





実係数は次と等しいことを思い出させてください。







 array([ 1., 2., 3., 4., 5., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0. ])
      
      





したがって、30次元空間に30個のポイントしかないため、実際の依存関係をほぼ正確に繰り返すモデルを構築できました。







比較のために、従来の線形回帰を使用して計算された係数を示します。







 array([ 0.39 2.07 3.16 2.86 4.8 -0.21 -0.13 0.42 0.6 -0.21 -0.96 0.03 -0.46 0.57 0.89 0.15 0.24 0.11 -0.38 -0.36 -0.28 -0.01 0.43 -1.22 0.23 0.15 0.12 0.43 -1.11 -0.3 ])
      
      





L2正則化による線形回帰:







 array([-0.36 1.48 2.67 3.44 3.99 -0.4 1.01 0.58 -0.81 0.78 -0.13 -0.23 -0.26 -0.24 -0.38 -0.24 -0.38 -0.25 0.54 -0.31 -0.21 -0.42 0.14 0.88 1.09 0.66 0.12 -0.07 0.08 -0.58])
      
      





そして、彼らは両方とも批判に耐えません。







しかし、L1正則化による線形回帰でも同様の結果が得られます。







 array([ 0.68 1.9 2.88 3.86 4.88 -0.05 0.09 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.01 0. 0. 0. 0. 0. 0. 0. ])
      
      





ご覧のとおり、L1正規化は重要でない係数をさらに無効にしますが、わずかに大きな誤差で重要な係数を計算できます。







一般に、ARDは素晴らしい方法ですが、微妙な違いがあります。 多くの(ほぼすべての)ベイジアン法と同様に、ARDは非常に計算が複雑です(ただし、並列性は優れています)。 そのため、数万ポイント(1秒の小数部)のデータですばやく動作し、数千(数十から数百秒)でゆっくりと、数万から数十万(分と時間)で非常にゆっくりと動作します。 さらに、彼は膨大な量のRAMを必要とします。







しかし、これはそれほど怖くない。 大量のデータがある場合は、古典的な統計手法を安全に使用でき、かなり良い結果が得られます。 深刻な問題は、データがほとんどないときに始まり、従来の方法は機能しなくなります。 そして、ベイズは救助に来ます。







ARDは、Relevance Vector Machine(RVM)などのさまざまなカーネルメソッドで積極的に使用されています。これは、ARDとともにサポートベクターマシン(SVM)です。 また、既存の記号の重要性を評価する必要がある場合、分類器で便利です。 一般的には、試してみてください。








All Articles