社内研修:scikit-learn基礎

f:id:monozukuri-bu:20200507165114j:plain

こんにちは、kanaiです。
社内でScikit-learnハンズオン講座を受けたので、その内容を一部ご紹介したいと思います。

scikit-learn とは

scikit-learnとはPython機械学習を行うためのオープンソースライブラリです。
回帰、分類、クラスタリングなどを行うための様々なアルゴリズムを提供しています。

動作環境

以下の環境で動作確認しています。

Python : 3.7.3
Jupyter Lab : 1.0.2
scikit-learn : 0.21.2
タスクの種類

今回の社内研修で、scikit-learnで実装したのは「回帰」と「分類」でした。

回帰(Regression)

説明変数xを用いて、xと相関関係のある目的変数yの値を説明・予測すること。

分類(Classifier)

母集団のどのクラスに分類されるか予測すること。

線形回帰

xを体重、yを身長とした時に、線形回帰を使えば以下のような式により、xの値からyの値を予測することができます。
(もちろん、身長を体重のみで説明することはできません。)


y=ax+b

このとき、それぞれの値は次のように呼ばれます。
x:説明変数
y:目的変数
a:重み
b:バイアス

上記の場合は説明変数xが1つなので単回帰分析と呼びますが、2つ以上使う場合は重回帰分析と呼びます。

それでは早速、回帰分析を試してみましょう。
必要なモジュールをインポートします。

from sklearn.datasets import load_bostonon
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

scikit-learnには自由に使用するできるデータセットがいくつか提供されています。
その中にボストンの住宅価格のデータセットが含まれているのでロードします。

boston = load_boston()

続いて、train_test_splitでロードしたデータセットを学習用のデータとテスト用のデータに分割します。

xd, xt, yd, yt = train_test_split(boston.data, boston.target, test_size=0.2, random_state=0)

引数に分割したいデータboston.data, boston.targetを指定します。
test_sizeは全体のデータのうちテストデータに分割したい割合を指定します。
今回は0.2を指定しているので80%が学習データ、20%がテストデータに分割されます。
デフォルトではランダムでデータが分割されますが、random_stateを指定してSeed値を固定すると、常に同じように分割されます。

それではモデルを作成・予測してみましょう。

linear = LinearRegression()
linear = linear.fit(xd, yd)
pred = linear.predict(xt)

LinearRegression()でクラスをインスタンス化し、重みやバイアスが初期状態の線形回帰モデルを作成しています。
そのモデルに対してfit()で学習データを指定すると学習が行われ、重みやバイアスが初期状態から変動していきます。
predict()の引数に説明変数のテストデータを指定すれば、推定値を算出できます。
とっても簡単ですね。

それでは、どのようなモデルが作成されたのか結果を出力してみましょう。

print("決定係数:", linear.score(xt, yt)) # 性能評価の指数
print("重み  :", linear.coef_)
print("バイアス:", linear.intercept_)
決定係数: 0.724481152496214
重み  : [-1.19080493e-01  3.84348456e-02 -2.58091181e-04  2.93091559e+00
           -1.79959892e+01  4.22827605e+00 -5.68413115e-03 -1.60955285e+00
            2.65580750e-01 -1.08348030e-02 -9.19181156e-01  8.73155551e-03
           -5.05892529e-01]
バイアス: 34.39876569573389

scoreは決定係数を示しており、モデルが実測値にどのくらい適合しているかを表します。
この値が1に近いほど予測の精度が高いことになります。
coef_, intercepr_でそれぞれ線形回帰の重みとバイアスの値を出力できます。

今回行っているのは、説明変数が複数あるため、重回帰分析です。
定義式に従って、説明変数 * 重み + バイアスを計算すると、推定値に一致することが確認できます。

print(np.dot(xt[0], linear.coef_) + linear.intercept_)
その他に学んだこと

具体的にご紹介するのは、ここまでにさせていただきます。
この他には、
 ・Lidge回帰、Lasso回帰、ロジスティック回帰
 ・SVM、K-NN、ナイーブベイズ 、決定木  ・バギング、ぺースティング、ランダムフォレスト、勾配ブースティング
 ・その他、イマドキの最新ライブラリの扱い方
などなど、本当に盛沢山な内容でした。

研修の中では教材を追っていくのに必死でしたが、きちんと復習して使いこなせるように習得していきたいと思います。

まとめ

今回はscikit-learnの社内教育を受講して、その内容を簡単にご紹介させていただきました。
scikit-learnは様々なモデルを使えるだけでなく、そのモデルを組み合わせる機能なども提供されていて、とても便利ですね。
各モデルの特徴を理解して、状況や目的に合わせて使いこなしていきたいです。