機械学習ライブラリScikit-learn
前回、機械学習ライブラリScikit-learnのボストンの住宅価格を予想するのに適切だろう機械学習モデルをマップを見て選んでみました。
機械学習のモデルマップはこんな感じでした。
選んではみたものの最後の分岐点がどちらを選んでいいのか分からないので、とりあえず5種類試してみようということにしたのが前回。
- Lasso
- ElasticNet
- RidgeRegression
- SVR(kernel=’linear’) or SVR(kernel=’rbf’)
今回はこの中で同じ場所にある「Lasso」モデルと「ElasticNet」モデルを試してみようと思います。
ということでまずは準備から。
いつも通り最初にデータセットを読み込んでいきます。
<セル1>
from sklearn.datasets import load_boston
import pandas as pd
from sklearn.model_selection import train_test_split
boston = load_boston()
df = pd.DataFrame(boston.data, columns=boston.feature_names)
df["MEDV"] = boston.target
df
実行結果
次に学習・評価を繰り返し行うためのプログラムを書いていきます。
基本的にはこちらの記事でやったようにfor文を使って、100回機械学習・決定関数による評価を繰り返し、決定関数の平均値を出力するようにします。
今回は使うデータは「犯罪率(CRIM)」、「平均部屋数(RM)」、「低所得者の割合(LSTAT)」の3つ。
そしてデータセットを分割したのち、同じ訓練用データを使って、異なる機械学習モデルで学習させ、その結果を表示させます。
比較対象となる機械学習モデルは前に使った「線形回帰(LinearRegression)」です。
ということで「線形回帰モデル」で繰り返し学習・評価をするためのプログラムはこんな感じです。
<セル2>
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
import numpy as np
trial = 100
x = df.loc[:, ["CRIM", "RM", "LSTAT"]]
y = df.loc[:, "MEDV"]
pred_lr_score = []
for i in range(trial):
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, train_size=0.8)
model_lr = LinearRegression()
model_lr.fit(x_train, y_train)
pred_lr = model_lr.predict(x_test)
pred_lr_score.append(r2_score(y_test, pred_lr))
pred_lr_ave = np.average(np.array(pred_lr_score))
print(pred_lr_ave)
実行結果
0.6213473154080073
前に評価したのと同様に決定関数の平均値は「0.621347…」と大体「0.6」程度になりました。
それではまずはLassoモデルを組み込んでいきましょう。
Lassoモデルを追加
正直言ってLassoモデルがどんな計算式に基づいて機械学習をしているのか、残念ながら私には解説できません。
ということで詳しい解説を知りたい方は、こちらのサイトで勉強してみてください。
このサイトによるとLasso、RidgeRegression、ElasticNetはどれも線形回帰(LinearRegression)を基にしていて、機械学習による予想をより正解に近づけるよう計算式に工夫されているということだと思います。
3PySciではまず動かすということを重要視していますので、とりあえず動かしてみましょう。
Lassoモデルを使うには、まずモデルをインポートする必要があります。
from sklearn.linear_model import Lasso
そしてモデルを使うには、いつも通りモデルを読み込み、データを機械学習させ、評価するという流れになります。
model_ls = Lasso()
model_ls.fit(x_train, y_train)
pred_ls = model_ls.predict(x_test)
ということで繰り返しや評価の格納、平均値の表示を含めるとこんな感じになります。
<セル2変更>
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Lasso
from sklearn.metrics import r2_score
import numpy as np
trial = 100
x = df.loc[:, ["CRIM", "RM", "LSTAT"]]
y = df.loc[:, "MEDV"]
pred_lr_score = []; pred_ls_score = []
for i in range(trial):
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, train_size=0.8)
model_lr = LinearRegression()
model_ls = Lasso()
model_lr.fit(x_train, y_train)
model_ls.fit(x_train, y_train)
pred_lr = model_lr.predict(x_test)
pred_ls = model_ls.predict(x_test)
pred_lr_score.append(r2_score(y_test, pred_lr))
pred_ls_score.append(r2_score(y_test, pred_ls))
pred_lr_ave = np.average(np.array(pred_lr_score))
pred_ls_ave = np.average(np.array(pred_ls_score))
print(pred_lr_ave, pred_ls_ave)
実行結果
0.6285448022180785 0.596130054758628
「線形回帰(Linear Regression)」そのままよりも、「Lasso」モデルの方が決定関数が低く出ました。
とりあえず結果は置いといて、次に「ElasticNet」モデルを組み込んでいきます。
ElasticNetモデルを追加
ElasticNetモデルを追加するのも、これまでと同様、モデルをインポートして、読み込み、学習させるという流れになります。
ということで組み込むプログラムはこんな感じ。
from sklearn.linear_model import ElasticNet
model_en = ElasticNet()
model_en.fit(x_train, y_train)
pred_en = model_en.predict(x_test)
これと繰り返しや評価の格納、平均値の表示を含めるとこんな感じになります。
<セル2変更>
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Lasso
from sklearn.linear_model import ElasticNet
from sklearn.metrics import r2_score
import numpy as np
trial = 100
x = df.loc[:, ["CRIM", "RM", "LSTAT"]]
y = df.loc[:, "MEDV"]
pred_lr_score = []; pred_ls_score = []; pred_en_score = []; pred_rd_score = []
pred_svr_lr_score = []; pred_svr_rbf_score = []
for i in range(trial):
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, train_size=0.8)
model_lr = LinearRegression()
model_ls = Lasso()
model_en = ElasticNet()
model_lr.fit(x_train, y_train)
model_ls.fit(x_train, y_train)
model_en.fit(x_train, y_train)
pred_lr = model_lr.predict(x_test)
pred_ls = model_ls.predict(x_test)
pred_en = model_en.predict(x_test)
pred_lr_score.append(r2_score(y_test, pred_lr))
pred_ls_score.append(r2_score(y_test, pred_ls))
pred_en_score.append(r2_score(y_test, pred_en))
pred_lr_ave = np.average(np.array(pred_lr_score))
pred_ls_ave = np.average(np.array(pred_ls_score))
pred_en_ave = np.average(np.array(pred_en_score))
print(pred_lr_ave, pred_ls_ave, pred_en_ave)
実行結果
0.6244527830476201 0.5934553891482569 0.5786804828481401
ElasticNetモデルはさらに低く出ました。
とりあえずプログラムは完成したので、評価にいきましょう。
LinearRegression、Lasso、ElasticNetを比較してみる
それではLinearRegression、Lasso、ElasticNetを比較してみましょう。
これまで同様100回機械学習・評価を繰り返し、その平均値を計算します。
それを5回繰り返し表にしてみます。
1回目 | 2回目 | 3回目 | 4回目 | 5回目 | |
LinearRegression | 0.62445 | 0.62042 | 0.62938 | 0.62842 | 0.62635 |
Lasso | 0.59346 | 0.58459 | 0.59300 | 0.59300 | 0.60106 |
ElasticNet | 0.57868 | 0.56950 | 0.57861 | 0.57902 | 0.58756 |
良かれと思って「Lasso」モデルと「ElasticNet」モデルを試してみましたが、どうも今回のデータに関しては線形回帰(LinearRegression)よりもうまくマッチしないようです。
何とも中途半端な結果になってしまいましたが、これはこれとして置いておきましょう。
次回は残りの3つ「RidgeRegression」、「SVR(kernel=’linear’)」、「SVR(kernel=’rbf’)」を試してみることにしましょう。
ということで今回はこんな感じで。
コメント