SHOEISHA iD

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

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

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

Pythonによるデータ解析入門

定番のPython機械学習ライブラリ「scikit-learn」ではじめての学習モデル作成から改善まで

scikit-learnによる、はじめてのPython機械学習(1)

 scikit-learnを使って機械学習を行う方法を紹介します。データを読み込み、データを俯瞰した後、変数を探索してmatplotlibのグラフを描きます。scikit-learnは機械学習のための統一された操作インターフェイス、APIを提供する使いやすいライブラリです。

 今回はアルゴリズムとして線形回帰を中心に用います。線形回帰は機械学習の中でも基本的な学習アルゴリズムです。基本的と言ってもシンプルで強力なため、さまざまな応用ができます。

準備

 Pythonによるデータ解析を進める環境としてJupyter Notebookを使います。導入方法や基本的な使用方法は連載の第1回記事を参照してください。

 記事の各コードは、Jupyter Notebookのセルに入力し、結果を確認する使い方を想定しています。

 今回は対象のデータとして、自前で生成したデータを用いることにします。事前に正解であるモデルを準備し、学習により正解モデルを予測します。

ライブラリの導入とデータロード

 まず必要なライブラリをインポートします。

 NumPyPandasmatplotlibと今回はscikit-learnをインポートします。

import numpy as np
import sklearn.linear_model as lm
import matplotlib.pyplot as plt
%matplotlib inline

 scikit-learnの線形回帰学習を行うlinear_modelを(lmというエイリアスで)インポートしました。

 まず、学習のためのモデルを作ります。NumPyにより非線形の関数をモデルとして定義します。これを正解モデルとでも呼んでおきましょう。今回の目的はこの”未知の”正解モデルを学習により機械(≒プログラム)に予測させることです。

def correct_function(x):
    return np.exp(3 * x) + 10

 正解モデルの曲線にそってx,yの値を作ります。xは[0,2]の範囲で、yは正解モデルの返り値です。

x_target = np.linspace(0., 2, 200)
y_target = correct_function(x_target)

 [0,1]の範囲で学習に用いるデータを作ります。ランダムに値を取るようにします。NumPyのrandamモジュールを使います。このデータにより学習モデルを訓練するので、訓練データと呼ばれます。

np.random.seed(0)
x = np.random.rand(10)
y = correct_function(x) + 2 * np.random.randn(len(x))

 np.random.seed(0)の記述により、実行するたびに値が変更されないようにしています。いったん図にして確認してみましょう。matplotlibを使います。

fig, ax = plt.subplots(1, 1, figsize=(8, 4 ))
ax.plot(x_target, y_target, '--k')
ax.plot(x, y, 'or', ms=10)
ax.set_xlim(0, 1.6)
ax.set_ylim(0, 100)
ax.set_title('Correct Model')

  Text(0.5,1,'Correct Model')

正解モデル
正解モデル

 図では点線が正解モデル、赤の丸が訓練データを表しています。

はじめての学習と予測

 ではscikit-learn を使いましょう。線形モデルをデータに合わせられるように作りたいと思います。ステップは3つです。

  1. モデルを作る
  2. データを使ってモデルを訓練する
  3. 訓練済みモデルを使って値を予測する
# モデルの生成
lr = lm.LinearRegression()

# 訓練データでモデルの訓練
lr.fit(x[:, np.newaxis], y)

#学習済みモデルで予測
y_lr = lr.predict(x_target[:, np.newaxis])

 ここではxとx_targetを縦行列に直しています。[:, np.newaxis]は横を縦にするテクニックです。scikit-learnでは学習の値を各行におさめることになっています。

 結果をプロットします。線形モデルの訓練データによる学習結果を見てみましょう。緑の線の回帰直線が今回得た結果です。

fig, ax = plt.subplots(1, 1, figsize=(7, 4))
ax.plot(x_target, y_target, '--k')
ax.plot(x_target, y_lr, 'g')
ax.plot(x, y, 'or', ms=10)
ax.set_xlim(0, 1.5)
ax.set_ylim(0, 90)
ax.set_title("Linear regression")
線型モデル
線形モデル

 訓練データは指数関数である正解モデルを基にしたデータです。そのため線形モデルではうまく正解に合う予測ができません。

次のページ
scikit-learnによる、はじめてのPython機械学習(2)

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

Pythonによるデータ解析入門連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 西 潤史郎(ニシ ジュンシロウ)

WINGSプロジェクト について>有限会社 WINGSプロジェクト が運営する、テクニカル執筆コミュニティ(代表 山田...

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

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/11252 2018/12/12 14:00

イベント

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

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

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

メールバックナンバー