【Scikit-learn】ボストン住宅価格をLassoモデル、Elastic Netモデルで機械学習[Python]

  • URLをコピーしました!
目次

機械学習ライブラリ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回目
LinearRegression0.624450.620420.629380.628420.62635
Lasso0.593460.584590.593000.593000.60106
ElasticNet0.578680.569500.578610.579020.58756

良かれと思って「Lasso」モデルと「ElasticNet」モデルを試してみましたが、どうも今回のデータに関しては線形回帰(LinearRegression)よりもうまくマッチしないようです。

何とも中途半端な結果になってしまいましたが、これはこれとして置いておきましょう。

次回は残りの3つ「RidgeRegression」、「SVR(kernel=’linear’)」、「SVR(kernel=’rbf’)」を試してみることにしましょう。

ということで今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次