CodeZine(コードジン)

特集ページ一覧

Apache Sparkによるスケーラブル機械学習入門

IBM Bluemix User Group(BMXUG)リレー寄稿 第5回

  • LINEで送る
  • このエントリーをはてなブックマークに追加

目次

Sparkによる機械学習

 機械学習のアルゴリズムは大きく分けて3つに分類されます。

  • 回帰分析
  • 分類
  • クラスタリング

 本稿では回帰分析と分類のサンプルプログラムを用意し、Sparkの機械学習ライブラリを用いた実装方法を紹介します。

線形回帰による回帰分析

 機械学習における「回帰分析」では、教師データからその背景にある関数をモデル化し、既存の教師データに含まれていない未知の入力に対して予期される結果を推定します。今回は、先日MLB通算3000本安打の偉業を達成したイチロー選手の2017年度の打率を推定してみましょう。BASEBALL-REFERENCE.comから取得した2001年から2016年までの打率を教師データとして、spark.mlパッケージのLinearRegressionを用いてモデルを構築します。

fig9. BASEBALL-REFERENCE.com
fig9. BASEBALL-REFERENCE.com

 サンプルプログラムの全コードを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のようです。

list3
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))
list4
Predicted Batting Average on 2017 is 0.264875

  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:IBM Bluemix User Group(BMXUG)リレー寄稿

著者プロフィール

  • 小峰 央志(Bluemix User Group)(コミネ ヒサシ)

    MNU Co., Ltd. 取締役。 サーバサイドアプリケーション開発、Webフロントエンド開発、DevOps、スクラムなど広く浅く取り組む。最近は機械学習を利用したアプリケーション開発に興味があり、主にSemantic Image Segmentationについて勉強しているが敷居の高さに苦戦中...

あなたにオススメ

All contents copyright © 2005-2022 Shoeisha Co., Ltd. All rights reserved. ver.1.5