scikit-learnによる、はじめてのPython機械学習(1)
scikit-learnを使って機械学習を行う方法を紹介します。データを読み込み、データを俯瞰した後、変数を探索してmatplotlibのグラフを描きます。scikit-learnは機械学習のための統一された操作インターフェイス、APIを提供する使いやすいライブラリです。
今回はアルゴリズムとして線形回帰を中心に用います。線形回帰は機械学習の中でも基本的な学習アルゴリズムです。基本的と言ってもシンプルで強力なため、さまざまな応用ができます。
準備
Pythonによるデータ解析を進める環境としてJupyter Notebookを使います。導入方法や基本的な使用方法は連載の第1回記事を参照してください。
記事の各コードは、Jupyter Notebookのセルに入力し、結果を確認する使い方を想定しています。
今回は対象のデータとして、自前で生成したデータを用いることにします。事前に正解であるモデルを準備し、学習により正解モデルを予測します。
ライブラリの導入とデータロード
まず必要なライブラリをインポートします。
NumPy、Pandas、matplotlibと今回は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つです。
- モデルを作る
- データを使ってモデルを訓練する
- 訓練済みモデルを使って値を予測する
# モデルの生成 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")
訓練データは指数関数である正解モデルを基にしたデータです。そのため線形モデルではうまく正解に合う予測ができません。
