こんにちは、Habr!
前回 、
Apache Sparkツールに出会いました。これは最近、ビッグデータ、特に
大規模機械学習を処理するためのほぼ最も人気のあるツールになりました。 今日は、
MlLibライブラリを詳しく見て
いきます。つまり、機械学習の問題(分類、回帰、クラスタリング、協調フィルタリング)を解決する方法を示します。 さらに、新しい機能を選択して強調表示するために機能を調査する方法を示します(
以前に説明した 、「
機能エンジニアリング 」と呼ばれる、
複数回 )。
計画
まず、トレーニングセットのオブジェクトを保存する方法、属性の基本統計を読み取る方法、次に機械学習アルゴリズム(分類、回帰、クラスタリング)を確認し、最後に推奨システムの構築例を検討します(いわゆる) 協調フィルタリング方法、またはより正確には-最も一般的なALSアルゴリズムの1つ。
ベクトル
単純な
「密」ベクトルの場合、特別なクラス
Vector.denseがあります。
from pyspark.mllib.linalg import Vectors my_vec = Vectors.dence ([1.12, 4.10, 1.5, -2.7, 3.5, 10.7, 0.7])
「疎」ベクトルの場合、
Vectors.sparseクラスが
使用されます。
from pyspark.mllib.linalg import Vectors my_vec = Vectors.sparse(10, [0,2,4,9], [-1.2, 3.05, -4.08, 0.46])
ここで、最初の引数はフィーチャの数(ベクトルの長さ)で、リストの後に非ゼロフィーチャの数が続き、次にフィーチャ自体の値が続きます。
マークされたベクトル
Sparkでマークされたポイントには、特別な
LabeledPointクラスがあります。
from pyspark.mllib.regression import LabeledPoint my_point = LabeledPoint(1.0, my_vec)
LabeledPointクラスには、
LabeledPoint.featuresが上記のベクトルのいずれかであり、
LabeledPoint.labelは、回帰タスクと値
[0.0,1.0,2.0、...]の場合に実際の値を取ることができるラベル
です。 -分類タスク用
タグを使用する
多くの場合、優れた機械学習アルゴリズムを構築するために、兆候を見て、最も関連性の高いものから選択するか、新しいものを考え出すことは秘密ではありません。 この目的のために、sparkクラス、
Statisticsクラスで、これらのすべてを実行できます。たとえば、次のとおりです。
from pyspark.mllib.stat import Statistics summary = Statistics.colStats(features)
さらに、Sparkには、サンプリング、標準機能(テキスト用のTF-IDFなど)の生成、スケーリング機能などの重要な追加機能などの膨大な数の追加機能があります(読者は、この記事を読んだ後、ドキュメントでこれを参照してください)。 後者の場合、特別な
スケーラークラスがあります。
from pyspark.mllib.feature import StandardScaler scaler = StandardScaler(withMean=True, withStd=True).fit(features) scaler.transform (features.map(lambda x:x.toArray()))
覚えておくべき唯一のことは、スパースベクトルの場合、これは機能せず、特定のタスクに対してスケーリング戦略を検討する必要があるということです。 次に、機械学習の問題に直接目を向けます。
分類と回帰
線形法
最も一般的な方法は、
いつものように、線形分類器です。 線形分類器を学習すると、重みベクトルの汎関数の凸最小化の問題になります。 違いは、損失関数、正則化関数、反復回数、および他の多くのパラメーターの選択にあります。 たとえば、損失のロジスティック関数(および、それに応じて、いわゆるロジスティック回帰の方法)、500回の反復、およびL2-正則化について検討します。
import pyspark.mllib.classification as cls model = cls.LogisticRegressionWithSGD.train(train, iterations=500, regType="l2")
同様に、線形回帰が行われます:
import pyspark.mllib.regression as regr model = regr.RidgeRegressionWithSGD.train(train)
ナイーブベイズ
この場合、学習アルゴリズムは入力として2つのパラメーターのみを取ります-トレーニングサンプル自体と平滑化パラメーター:
from pyspark.mllib.classification import NaiveBayes model = NaiveBayes.train(train, 8.5) model.predict(test.features)
決定的な木
他の多くのパッケージと同様に、スパークでは、回帰ツリーと分類ツリーが実装されています。 学習アルゴリズムは、多くのクラス、最大ツリー深度など、多くのパラメーターを入力として受け取ります。 アルゴリズムは、どのカテゴリがカテゴリ機能を備えているか、および他の多くのパラメータも示す必要があります。 ただし、ツリーを学習するときに最も重要なものの1つは、いわゆる不
純度 -いわゆる
情報ゲインを計算するための基準であり、通常は次の値を取ることができます:
エントロピーと
ジニ -分類問題、
分散 -回帰問題 例として、以下で定義されているパラメーターを使用したバイナリ分類を考えます。
from pyspark.mllib.tree import DecisionTree model = DecisionTree.trainClassifier(train, numClasses=2, impurity='gini', maxDepth=5) model.predict(test.map(lambda x: x.features))
ランダムフォレスト
ご存じのように、ランダムフォレストは普遍的なアルゴリズムの1つであり、このツールで実装されることが期待されます。 上記のツリーを使用します。 ここにはメソッド
trainClassifierと
trainRegressionもあり
ます -それぞれ分類子と回帰関数をトレーニングするためです。 最も重要なパラメーターの1つは、フォレスト内のツリーの数、既知の
不純物 、および
featureSubsetStrategyです。ツリーの次のノードでブレークするときに考慮される属性の数です(値の詳細については、ドキュメントを参照してください)。 したがって、以下は50ツリーを使用したバイナリ分類の例です。
from pyspark.mllib.tree import RandomForest model = RandomForest.trainClassifier(train, numClasses=2, numTrees=50, featureSubsetStrategy="auto", impurity='gini', maxDepth=20, seed=12) model.predict(test.map(lambda x:x.features))
クラスタリング
他の場所と同様に、スパークはよく知られている
KMeansアルゴリズムを実装します。
このアルゴリズムのトレーニングは、データセット、クラスター数、反復数、および初期クラスター中心を選択するための戦略(デフォルトは
k-means 、
ランダム値):
from pyspark.mllib.clustering import KMeans clusters = KMeans.train(features, 3, maxIterations=100, runs=5, initializationMode="random") clusters.predict(x.features))
協調フィルタリング
ビッグデータを使用する最も有名な例がレコメンダーシステムであることを考えると、最も単純なアルゴリズムが多くのパッケージに実装されていない場合は奇妙です。 これはSparkにも当てはまります。
ALSアルゴリズム
(代替最小二乗) -おそらく最も有名な協調フィルタリングアルゴリズムの1つを実装します。 アルゴリズム自体の説明は、別の記事に値します。 ここでは、アルゴリズムが実際にフィードバックマトリックス(行はユーザー、列は製品)を実際に
製品トピックと
トピックユーザーマトリックスに分解し、トピックはいくつかの隠された変数であり、その意味はしばしば明確ではないことを簡単に言います(
ALSアルゴリズムの魅力は、トピック自体とその価値を正確に見つけることにあります)。 これらのトピックの本質は、各ユーザーと各映画が一連の特徴によって特徴付けられることであり、これらのベクトルのスカラー積は特定のユーザーの映画の評価です。 このアルゴリズムのトレーニングサンプルは、テーブル
userID-> productID-> ratingの形式で設定されます。 その後、モデルはALSを使用してトレーニングされます(他のアルゴリズムと同様に、入力として多くのパラメーターを使用します。読者はこれらのパラメーターについて読むように招待されています)
from pyspark.mllib.recommendation import ALS model = ALS.train (ratings, 20, 60) predictions = model.predictAll(ratings.map (lambda x: (x[0],x[1])))
おわりに
そこで、ビッグデータの分散処理用に開発されたApache Sparkフレームワークの
MlLibライブラリを簡単に確認し
ました 。
前述のように 、このツールの主な利点は、データをRAMにキャッシュできることです。これにより、機械学習アルゴリズムの大部分である反復アルゴリズムの場合、計算を大幅に高速化できます。