👨‍🏫

教師あり学習(回帰)

2023/05/11に公開

[!abstract]+ Curriculum

  1. 教師学習(回帰)の基礎
  2. 教師学習(回帰)の応用
  • 添削問題

教師学習(回帰)の基礎

回帰モデルの性能評価指標:決定係数

#R_Square #MSE #RMSE

R^{2}= 1- \frac{\Sigma_i(y_{i}-\hat{y}_{i})^{2}}{\Sigma_i(y_{i}-\bar{y}_{i})^{2}}

教師学習(回帰)の応用

正規化

regularization #regularization #regularization/L1 #regularization/L2

  • L1正規化:予測に影響が少ないデータのパラメータを0に近づける。
  • L2正規化:係数が大きくなりすぎないように抑制。一般化が容易。

ラッソ回帰

#lasso

  • L1正規化を行いながら、線形回帰の適切なパラメータを設定する回帰モデル。
  • データの行の数が列の数より少ない場合に利用すると良い。

ラッソ回帰と線形回帰の比較

from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Lasso
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split

# データを生成
X, y = make_regression(n_samples=100, n_features=100, n_informative=60, n_targets=1, random_state=42)
train_X, test_X, train_y, test_y = train_test_split(X, y, random_state=42)

# 以下にコードを記述してください
# 線形回帰
model = LinearRegression()
model.fit(train_X,train_y)

# test_X, test_yに対する決定係数を出力してください
print("Linear regression:{}".format(model.score(test_X, test_y)))

# ラッソ回帰
model = Lasso()
model.fit(train_X,train_y)


# test_X, test_yに対する決定係数を出力してください
print("Lasso regression:{}".format(model.score(test_X, test_y)))

>> 출력결과
>> Linear regression:0.8475616529676024
>> Lasso regression:0.9679210925939417

リッジ回帰

#ridge

  • L2正規化を行いながら、線形回帰の適切なパラメータを設定する回帰モデル。
  • 一般化しやすい
from sklearn.linear_model import Ridge
from sklearn.linear_model import LinearRegression
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split

# データを生成
X, y = make_regression(n_samples=100, n_features=50, n_informative=50, n_targets=1, noise=100.0, random_state=42)
train_X, test_X, train_y, test_y = train_test_split(X, y, random_state=42)

# 以下にコードを記述してください
# 線形回帰
model = LinearRegression()
model.fit(train_X,train_y)


# test_X, test_yに対する決定係数を出力してください
print("Linear regression:{}".format(model.score(test_X, test_y)))

# リッジ回帰
model = Ridge()
model.fit(train_X,train_y)


# test_X, test_yに対する決定係数を出力してください
print("Ridge regression:{}".format(model.score(test_X, test_y)))


>> 출력결과
>> Linear regression:0.7802322835148345
>> Ridge regression:0.7807547182116584

ElasticNet 회귀

#elasticnet

  • ラッソ回帰とリッジ回帰を組み合わせて正規化項を作るモデル
  • メリット:情報の取捨選択(ラッソ回帰)と一般化(リッジ回帰)。

添削問題

各モデル間の決定係数を比較する ### 各モデル間の決定係数を比較する

import pandas as pd

from sklearn.model_selection import train_test_split

# 必要なモジュールを追記してください。

from sklearn.linear_model import LinearRegression, Ridge, Lasso, ElasticNet

  

# データの読み込み

concrete_data = pd.read_excel("https://archive.ics.uci.edu/ml/machine-learning-databases/concrete/compressive/Concrete_Data.xls")

  

concrete_train_X, concrete_test_X, concrete_train_y, concrete_test_y = train_test_split(

    concrete_data.drop('Concrete compressive strength(MPa, megapascals) ', axis=1),

    concrete_data['Concrete compressive strength(MPa, megapascals) '], random_state=42)

  

# 以下にコードを記述してください。

# LinearRegression

model_linear = LinearRegression()

model_linear.fit(concrete_train_X, concrete_train_y)

print("LinearRegressionの決定係数は{}です。".format(model_linear.score(concrete_test_X,concrete_test_y)))

#Ridge

model_ridge = Ridge()

model_ridge.fit(concrete_train_X, concrete_train_y)

print("Ridgeの決定係数は{}です。".format(model_ridge.score(concrete_test_X,concrete_test_y)))

#Lasso

model_lasso = Lasso()

model_lasso.fit(concrete_train_X, concrete_train_y)

print("Lassoの決定係数は{}です。".format(model_lasso.score(concrete_test_X,concrete_test_y)))

  

#ElasticNet

for i in range(1, 10):

  ratio = i * 0.1

  model_elasticnet = ElasticNet(l1_ratio=ratio)

  model_elasticnet.fit(concrete_train_X, concrete_train_y)

  print("ElasticNetのL1割りあいが{:.1f}の時の決定係数は{}です。".format(ratio, model_elasticnet.score(concrete_test_X,concrete_test_y)))

Discussion