21.2.20 / scikit-learn / 강의 복습, kaggle 공유 자전거 수요 예측

pjk·2021년 2월 20일
1

[매일코딩 스터디]

목록 보기
20/62

Today

강의

스터디 내용

  • 회귀 파트 개념 복습
  • 다항회귀 및 kaggle 실습 복습

결과

  • 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

  • 회귀 kaggle 실습한 부분 복습

Summary

  • 이해하는 것도 중요하지만 직접 코드를 작성하는게 제일 중요하다. 오늘은 일이 있어 코딩 실습을 많이 못해 아쉬웠지만 경사하강법, 다항회귀, 오버피팅과 언더피팅, 릿지, 라쏘, 엘라스틱넷 회귀 등의 개념에 대해 이동시간에 강의로나마 복습하여 나름 알찼다고 생각한다.
profile
성장

0개의 댓글