본문 바로가기
자격증/빅데이터 분석기사 (실기)

04. 머신러닝 핵심 알고리즘 (3)

by 이민우 2022. 6. 7.
728x90
반응형

출처 : https://book.naver.com/bookdb/book_detail.nhn?bid=21488029 

 

공개적 빅데이터분석기사 실기

본 도서는 한국데이터산업진흥원에서 실시하는 빅데이터분석기사 국가기술자격 실기시험 대비 도서입니다.본 교재는 PYTHON을 활용하여 쉽고 빠른 자격증 취득으로 이어질 수 있도록 도움을 줄

book.naver.com

*해당 글은 학습을 목적으로 위의 도서 내용 중 일부 내용만을 요약하여 작성한 포스팅입니다.

 상세 내용 및 전체 내용 확인을 원하신다면 도서 구매를 추천드립니다.


선형회귀모델

  • 연속형 원인변수가 연속형 결과변수에 영향을 미치는지를 분석하여 레이블 변수를 예측하는 모델
  • 회귀모델은 실제값과 예측간 값의 일치정도 및 차이정도를 계산하여 모델 성능 지표로 삼는다.
  • 이에 대하여 SSE, AE, MSE, MAE, RMSE, MAPE 등 여러 오차지표를 사용하며, RMSE가 대표적으로 사용된다.
  • sklearn.linear_model 내에 있는 LinearRegression을 불러와 사용할 수 있다.
  • 일반적인 회귀분석에서 x데이터를 정규화 하지 않으므로, 정규화에 앞서statsmodels.api를 가져와 상수항 변수를 더하고 설명력을 확인한다.
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

data = pd.read_csv('/house_price.csv', encoding='utf-8')
data.dropna(inplace=True)

x = data[data.columns[0:5]]
y = data[["house_value"]]

train_x, test_x, train_y, test_y = train_test_split(x, y, random_state=42)

import statsmodels.api as sm

train_x = sm.add_constant(train_x)
test_x = sm.add_constant(test_x)

multi_model_train = sm.OLS(train_y, train_x).fit()
print(multi_model_train.summary())

print('\n\n======================================================\n\n')

multi_model_test = sm.OLS(test_y, test_x).fit()
print(multi_model_test.summary())

  • coef를 확인하여 기울기를 확인한다. 예를들어 훈련 데이터에서 income이 1 증가할 때 house_value는 5.975e+04 만큼 증가하게 된다.
  • 일반적으로 coef는 0.05보다 작으면 유의한 영향을 미치는 변수로 본다.
  • 확인을 마쳤다면 sklearn.linear_model의 LinearRegression을 불러와 학습을 진행한다.
  • 그 후 여러 오차 확인 방법으로 오차를 확인한다.
model = LinearRegression()
model.fit(train_x, train_y)

pred_y_train = model.predict(train_x)
pred_y_test = model.predict(test_x)

# RMSE
import numpy as np
from sklearn.metrics import mean_squared_error

MSE_train = mean_squared_error(train_y, pred_y_train)
MSE_test = mean_squared_error(test_y, pred_y_test)

print("RMSE (Train):\t", np.sqrt(MSE_train))
print("RMSE (Test):\t", np.sqrt(MSE_test))


# MAE
from sklearn.metrics import mean_absolute_error

MAE_train = mean_absolute_error(train_y, pred_y_train)
MAE_test = mean_absolute_error(test_y, pred_y_test)

print("MAE (Train):\t", MAE_train)
print("MAE (Test):\t", MAE_test)


# MAPE
def MAPE(y_test, y_pred) :
  return np.mean(np.abs((y_test-y_pred) / y_test)) * 100

print("MAPE (Train):\t", MAPE(train_y, pred_y_train))
print("MAPE (Test):\t", MAPE(test_y, pred_y_test))

 

 

릿지 회귀모델

  • 릿지 회귀모델이란 선형회귀분석의 기본원리는 따르나 가중치 값을 최대한 작게 만들어 (0에 가깝게) 모든 독립변수(특성)가 종속변수(레이블)에 미치는 영향을 최소화하는 제약을 반영한 회귀모델이다.
  • 각 특성의 영향을 최소화하여 훈련데이터에 과대적합되지 않도록 제약한 모델이라고 할 수 있다.
  • 선형관계 뿐 아니라 다항곡선 추정도 가능하다.
  • sklearn.linear_model 내에 있는 Ridge 라이브러리를 사용한다.
  • 주요 하이퍼파라미터는 alpha로, 디폴트는 1이며 클수록 규제가 강하여 회귀계수가 0에 근접해진다. 반면 0에 가까울수록 규제를 하지 않아 선형회귀와 유사한 결과를 보인다.
import pandas as pd
from sklearn.linear_model import Ridge
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
import statsmodels.api as sm

data = pd.read_csv('/house_price.csv', encoding='utf-8')
data.dropna(inplace=True)

x = data[data.columns[0:5]]
y = data[["house_value"]]

train_x, test_x, train_y, test_y = train_test_split(x, y, random_state=42)

train_x = sm.add_constant(train_x)
test_x = sm.add_constant(test_x)

params = {'alpha' : [1e-4, 1e-3, 1e-2, 0.1, 1, 0.5, 1, 5.0, 10.0]}
gSearch = GridSearchCV(Ridge(), params, cv=5)
gSearch.fit(train_x, train_y)

best_alpha = gSearch.best_params_['alpha']

model = Ridge(alpha=best_alpha)
model.fit(train_x, train_y)

pred_y_train = model.predict(train_x)
pred_y_test = model.predict(test_x)

# RMSE
import numpy as np
from sklearn.metrics import mean_squared_error

MSE_train = mean_squared_error(train_y, pred_y_train)
MSE_test = mean_squared_error(test_y, pred_y_test)

print("RMSE (Train):\t", np.sqrt(MSE_train))
print("RMSE (Test):\t", np.sqrt(MSE_test))


# MAE
from sklearn.metrics import mean_absolute_error

MAE_train = mean_absolute_error(train_y, pred_y_train)
MAE_test = mean_absolute_error(test_y, pred_y_test)

print("MAE (Train):\t", MAE_train)
print("MAE (Test):\t", MAE_test)


# MAPE
def MAPE(y_test, y_pred) :
  return np.mean(np.abs((y_test-y_pred) / y_test)) * 100

print("MAPE (Train):\t", MAPE(train_y, pred_y_train))
print("MAPE (Test):\t", MAPE(test_y, pred_y_test))

 

 

 

라쏘 회귀모델

  • 릿지회귀모델과 유사하게 특성의 계수값을 0에 가깝게 하지만 실제 중요하지 않은 변수의 계수를 0으로 만들어 불필요한 변수를 제거하는 모델이다.
  • sklearn.linear_model 내의 Lasso 라이브러리를 사용하여 구현한다.
  • 주요 하이퍼파라미터는 Ridge와 마찬가지로 alpha이며, 디폴트는 0이다.
  • alpha가 커질수록 정확도는 낮아지지만 일반화되며, 0에 가까워질수록 선형회귀와 유사해진다.
import pandas as pd
from sklearn.linear_model import Lasso
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
import statsmodels.api as sm

data = pd.read_csv('/house_price.csv', encoding='utf-8')
data.dropna(inplace=True)

x = data[data.columns[0:5]]
y = data[["house_value"]]

train_x, test_x, train_y, test_y = train_test_split(x, y, random_state=42)

train_x = sm.add_constant(train_x)
test_x = sm.add_constant(test_x)

params = {'alpha' : [1e-4, 1e-3, 1e-2, 0.1, 1, 0.5, 1, 5.0, 10.0]}
gSearch = GridSearchCV(Lasso(), params, cv=5)
gSearch.fit(train_x, train_y)

best_alpha = gSearch.best_params_['alpha']

model = Lasso(alpha=best_alpha)
model.fit(train_x, train_y)

pred_y_train = model.predict(train_x)
pred_y_test = model.predict(test_x)

# RMSE
import numpy as np
from sklearn.metrics import mean_squared_error

MSE_train = mean_squared_error(train_y, pred_y_train)
MSE_test = mean_squared_error(test_y, pred_y_test)

print("RMSE (Train):\t", np.sqrt(MSE_train))
print("RMSE (Test):\t", np.sqrt(MSE_test))


# MAE
from sklearn.metrics import mean_absolute_error

MAE_train = mean_absolute_error(train_y, pred_y_train)
MAE_test = mean_absolute_error(test_y, pred_y_test)

print("MAE (Train):\t", MAE_train)
print("MAE (Test):\t", MAE_test)

 

 

 

엘라스틱 넷

  • 엘라스틱넷은 릿지회귀와 라쏘회귀를 절충한 모델이다.
  • 릿지와 라쏘의 규제항을 단순히 더하여 사용하는데, 이 때 혼합비율 r을 사용해 조절한다.
  • r이 0이면 릿지회귀와 같고, r이 1이면 라쏘회귀와 같아진다.
  • sklearn.linear_model 내의 ElasticNet 라이브러리를 사용하여 구현한다.
  • 하이퍼 파라미터는 마찬가지로 alpha이며, 0에 가까워질수록 제약이 없어 선형회귀와 유사해진다.
from sklearn.linear_model import ElasticNet

params = {'alpha' : [1e-4, 1e-3, 1e-2, 0.1, 1, 0.5, 1, 5.0, 10.0]}
gSearch = GridSearchCV(ElasticNet(), params, cv=5)
gSearch.fit(train_x, train_y)

best_alpha = gSearch.best_params_['alpha']

model = ElasticNet(alpha=best_alpha)
model.fit(train_x, train_y)

pred_y_train = model.predict(train_x)
pred_y_test = model.predict(test_x)

# RMSE
import numpy as np
from sklearn.metrics import mean_squared_error

MSE_train = mean_squared_error(train_y, pred_y_train)
MSE_test = mean_squared_error(test_y, pred_y_test)

print("RMSE (Train):\t", np.sqrt(MSE_train))
print("RMSE (Test):\t", np.sqrt(MSE_test))


# MAE
from sklearn.metrics import mean_absolute_error

MAE_train = mean_absolute_error(train_y, pred_y_train)
MAE_test = mean_absolute_error(test_y, pred_y_test)

print("MAE (Train):\t", MAE_train)
print("MAE (Test):\t", MAE_test)
728x90
반응형