Today
강의
스터디 내용
- 회귀 파트 개념 복습
- 다항회귀 및 kaggle 실습 복습
결과
라이브러리 임포트
import numpy as np
import pandas as pd
from sklearn.metrics import mean_squared_error, mean_absolute_error
from sklearn.model_selection import train_test_split , GridSearchCV
from sklearn.linear_model import LinearRegression , Ridge , Lasso
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor
from xgboost import XGBRegressor
from lightgbm import LGBMRegressor
데이터 전처리
bike_df = pd.read_csv('./bike_train.csv')
bike_df['datetime'] = bike_df.datetime.apply(pd.to_datetime)
bike_df['year'] = bike_df.datetime.apply(lambda x : x.year)
bike_df['month'] = bike_df.datetime.apply(lambda x : x.month)
bike_df['day'] = bike_df.datetime.apply(lambda x : x.day)
bike_df['hour'] = bike_df.datetime.apply(lambda x: x.hour)
drop_columns = ['datetime','casual','registered']
bike_df.drop(drop_columns, axis=1,inplace=True)
평가값 도출을 위한 함수 설정
def rmsle(y, pred):
log_y = np.log1p(y)
log_pred = np.log1p(pred)
squared_error = (log_y - log_pred) ** 2
rmsle = np.sqrt(np.mean(squared_error))
return rmsle
def rmse(y,pred):
return np.sqrt(mean_squared_error(y,pred))
def evaluate_regr(y,pred):
rmsle_val = rmsle(y,pred)
rmse_val = rmse(y,pred)
mae_val = mean_absolute_error(y,pred)
print('RMSLE: {0:.3f}, RMSE: {1:.3F}, MAE: {2:.3F}'.format(rmsle_val, rmse_val, mae_val))
데이터 학습 및 평가
y_target = bike_df['count']
X_features = bike_df.drop(['count'],axis=1,inplace=False)
X_train, X_test, y_train, y_test = train_test_split(X_features, y_target, test_size=0.3, random_state=0)
lr_reg = LinearRegression()
lr_reg.fit(X_train, y_train)
pred = lr_reg.predict(X_test)
evaluate_regr(y_test ,pred) # 비용 함수 값 높게 나옴.
타겟 값 로그 변환
y_target_log = np.log1p(y_target)
X_train, X_test, y_train, y_test = train_test_split(X_features, y_target_log, test_size=0.3, random_state=0)
lr_reg = LinearRegression()
lr_reg.fit(X_train, y_train)
pred = lr_reg.predict(X_test)
expm1 이용해서 원래 값으로 돌아감
y_test_exp = np.expm1(y_test)
예측 값 역시 Log 변환된 타겟 기반으로 학습되어 예측되었으므로 다시 exmpl으로 scale변환
pred_exp = np.expm1(pred)
evaluate_regr(y_test_exp ,pred_exp) # evaluate_regr 함수에서 이미 y 가 로그 변환 되어 있어서 exp 함.
회귀 계수값에서 year가 매우 높게 나오는 이상결과를 제거하기 위해 원핫인코딩을 실시
coef = pd.Series(lr_reg.coef_, index=X_features.columns)
coef_sort = coef.sort_values(ascending=False)
X_features_ohe = pd.get_dummies(X_features, columns=['year','month','hour', 'holiday',
'workingday','season','weather'])
원핫인코딩된 피처 데이트 세트 기반으로 학습 및 예측 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X_features_ohe, y_target_log,
test_size=0.3, random_state=0)
모델과 학습 및 테스트 데이터 셋을 입력하면 성능 평가 수치를 반환하는 함수 설정
def get_model_predict(model, X_train, X_test, y_train, y_test, is_expm1=False):
model.fit(X_train, y_train)
pred = model.predict(X_test)
if is_expm1 :
y_test = np.expm1(y_test)
pred = np.expm1(pred)
print('###',model.__class__.__name__,'###')
evaluate_regr(y_test, pred)
model 별로 평가 수행
lr_reg = LinearRegression()
ridge_reg = Ridge(alpha=10)
lasso_reg = Lasso(alpha=0.01)
for model in [lr_reg, ridge_reg, lasso_reg]:
get_model_predict(model,X_train, X_test, y_train, y_test,is_expm1=True)
회귀계수가 정상적으로 도출됨을 확인
coef = pd.Series(lr_reg.coef_ , index=X_features_ohe.columns)
coef_sort = coef.sort_values(ascending=False)[:10]
sns.barplot(x=coef_sort.values , y=coef_sort.index)
랜덤 포레스트, GBM, XGBoost, LightGBM model 별로 평가 수행
rf_reg = RandomForestRegressor(n_estimators=1000)
gbm_reg = GradientBoostingRegressor(n_estimators=1000)
xgb_reg = XGBRegressor(n_estimators=1000)
lgbm_reg = LGBMRegressor(n_estimators=1000)
for model in [rf_reg, gbm_reg, xgb_reg, lgbm_reg]:
get_model_predict(model,X_train, X_test, y_train, y_test,is_expm1=True)
Tomorrow
Summary
- 이해하는 것도 중요하지만 직접 코드를 작성하는게 제일 중요하다. 오늘은 일이 있어 코딩 실습을 많이 못해 아쉬웠지만 경사하강법, 다항회귀, 오버피팅과 언더피팅, 릿지, 라쏘, 엘라스틱넷 회귀 등의 개념에 대해 이동시간에 강의로나마 복습하여 나름 알찼다고 생각한다.