교사학습 (회귀)

Joel Lee·2023년 5월 11일
0

AI & DS

목록 보기
11/14
post-thumbnail

교사 학습 (회귀) 의 기초

회귀 모델의 성능평가지표 : 결정계수

#R_Square #MSE #RMSE

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

교사 학습 (회귀) 의 응용

정규화

#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)))
profile
개발자 전직을 향해 나아가고 있는 Technical Sales Engineer

0개의 댓글