Sparkによる機械学習
機械学習のアルゴリズムは大きく分けて3つに分類されます。
- 回帰分析
- 分類
- クラスタリング
本稿では回帰分析と分類のサンプルプログラムを用意し、Sparkの機械学習ライブラリを用いた実装方法を紹介します。
線形回帰による回帰分析
機械学習における「回帰分析」では、教師データからその背景にある関数をモデル化し、既存の教師データに含まれていない未知の入力に対して予期される結果を推定します。今回は、先日MLB通算3000本安打の偉業を達成したイチロー選手の2017年度の打率を推定してみましょう。BASEBALL-REFERENCE.comから取得した2001年から2016年までの打率を教師データとして、spark.mlパッケージのLinearRegressionを用いてモデルを構築します。
サンプルプログラムの全コードをlist3に記載します。まず、必要なモジュールをインポートし、年度と打率のタプルからなる教師用およびテスト用配列データを定義します。次に教師用およびテスト用配列データをRDDに変換するメソッドcreateTrainDataFrame()およびcreateTestDataFrame()を定義し、実行します。ここで生成されるRDDはDataFrameと呼ばれるスキーマ情報を持ったRDDで、createTrainDataFrame()では、打率をラベル、年度を特徴ベクトルとするDataFrameを、createTestDataFrame()では年度の特徴ベクトルのみを持つDataFrameを生成しています。
次に、生成した教師用DataFrameであるtrain_dfをLinearRegression.fit()メソッドに与え、教師データとの二乗誤差を最小化するモデルの推定を行います。なお、train_dfは学習過程で繰り返し参照されるため、cache()メソッドを呼び出してキャッシュを生成しています。fit()メソッドから得られるモデルはLinearRegressionModelクラスのインスタンスであり、transform()メソッドにテストデータを渡して呼び出すことで、推定結果であるpredictionカラムを持つDataFrameを得ることができます。こうして得られたDataFrameをcollect()メソッドで収集してprint文で出力することで、最終的にlist4のような結果が得られます。推定によれば2017年度の予想打率は0.265のようです。
from pyspark.ml.regression import LinearRegression from pyspark.mllib.linalg import Vectors train = [ (2001, 0.35), (2002, 0.321), (2003, 0.312), (2004, 0.372), (2005, 0.303), (2006, 0.322), (2007, 0.351), (2008, 0.31), (2009, 0.352), (2010, 0.315), (2011, 0.272), (2012, 0.283), (2013, 0.262), (2014, 0.284), (2015, 0.229), (2016, 0.310), ] test = [ 2017, ] def createTrainDataFrame(data): return sqlContext.createDataFrame( [(y, Vectors.dense(x)) for (x, y) in data], ["label", "features"] ) def createTestDataFrame(data): return sqlContext.createDataFrame( [(Vectors.dense(x),) for x in data], ["features"] ) train_df = createTrainDataFrame(train) test_df = createTestDataFrame(test) model = LinearRegression().fit(train_df.cache()) for y in model.transform(test_df).collect(): print("Predicted Batting Average on %d is %f" % (y.features[0], y.prediction))
Predicted Batting Average on 2017 is 0.264875