SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

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

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

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


  • X ポスト
  • このエントリーをはてなブックマークに追加

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

次のページ
ロジスティック回帰による分類

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
IBM Bluemix User Group(BMXUG)リレー寄稿連載記事一覧

もっと読む

この記事の著者

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

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

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/9626 2021/03/25 21:20

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング