살콤아내 자기계발/파이썬

파이썬머신러닝완벽가이드 6주차 (342pg. 자전거대여수요예측)

살콤아내 2021. 6. 2. 12:48
728x90
반응형

파이썬머신러닝완벽가이드 342pg. 자전거대여수요예측.py
0.01MB

 

 

344pg. Kaggle에서 Bike Sharing Demand train.csv 파일을 다운받으시오.

 

https://www.kaggle.com/c/bike-sharing-demand/data?select=train.csv 

 

Bike Sharing Demand

Forecast use of a city bikeshare system

www.kaggle.com

 

- apply(pd.to_datetime)은  string타입의 datetime을 날짜를 나타내는 고유한 데이터타입인 datetime으로 변화함. (object>>datetime64[ns])

 

- 66줄~69줄: lambda함수를 이용해서 datetime의 column값으로부터 x.year, x.month, x.day, x.hour를 순차적으로 bike_df의 각각의 column에 넣는다. (인덱스슬라이싱을 사용해도 됨) datetime은 심플하게 원하는 값의 추출이 가능하다.

 

- 77줄: datetime, casual, registered column을 삭제한다. count라는 column이 casual과 registered 값의 합을 나타내기 때문에 두 column은 불필요하다. (날씨에 다른 총 대여의 수가 필요하므로)

 

- 89줄: rmsle는 오류값의 log에 대한 rmse값이다.

참고) log1p=log(1+x)    log값이 음수가 나올 수 있으므로 log1p를 사용한다.

 

참고) MAE값은 RMSE값과 비교할 수 있다. RMSE는 제곱에 루트를 씌운 값이기 때문.

 

- 348pg. 데이터가 왜곡되었을 때 log화를 시키면 데이터의 분포를 정규화 하는 역할도 한다.

 

- 131줄: y_test (실제값)와 pred  (학습된estimator를 통해 받은 예측값) result_df값으로 받아서 위에서부터 20개를 내림차순 정렬로 뽑는다. 131줄의 n_tops=5는 초기값을 의미한다. 139줄에서 따로 설정하지 않으면 n_top는 초기값인 5로 반환된다.

 

- 145줄: skewness(비대칭도)된 히스토그램을 151줄에서 log변환해서 히스토그램화한다. (스케일을 변화시킴)

히스토그램은 특정 데이터 사이(영역)의 빈도수(분포)를 나타낸다. plot그래프와 달리 히스토그램은 log변환 후 비대칭성이 아주 완화가 된다. 그런데 왜 이런 그래프가 나오는걸까? log변환 하고 히스토그램을 그리면 중위값에 위치하는 데이터들의 수가 상대적으로 많아진다. (정규분포에 좀 더 가까운 모양이 됨)

y_target.hist( )
y_log_transform.hist( )

 

참고) y_target을 plot 그래프로 그려본 것

plt.plot(y_target[0:100]) 과 plt.plot(y_target[0:2000])

참고) y_log_transform을 plot 그래프로 그려본 것

plt.plot(y_log_transform[0:100])과 plt.plot(y_log_transform[0:2000])

위 아래 두 그래프를 비교해보면, 왼쪽이 원본데이터고 오른쪽이 log로 scaled 된 데이터이다. 그래프의 모양은 같으나 데이터간의 간격이 많이 좁혀진 것을 볼 수 있다.

 

참고) scatter 그래프로 그려본다. log변환을 하면 데이터의 분포가 좀 더 고르게 되며 데이터들간의 격차가 줄어든다. (원본데이터는 0~100, 100~200의 구분이 생긴다)

plt.scatter(range(0,100), y_target[0:100]) 

plt.scatter(range(0,100), y_log_transform[0:100])

 

 

- 177줄: log변환 후 평가를 했는데 RMSLE오류는 줄어들었지만 RMSE는 오히려 더 늘어났다. 왜 그럴까?

숫자값인 년도year는 자전거 수요예측에 가중치의 관점에서 크게 영향을 끼친다. 이를 방지하기 위해 원-핫 인코딩을 적용한다. (특정 column의 절대적인 값은 의미가 없으므로)

 

참고) 원-핫 인코딩: 피처 값의 유형에 따라 새로운 피처를 추가해 고유 값에 해당하는 칼럼에만 1을 표시하고 나머지 칼럼에는 0을 부여한다.

 

89줄 (log변환 전)

 

- 183줄: coefficient (상관계수) 값을 보면 year가 비중이 큰 것임을 알 수 있다.

 

 

- 192줄: pd.get_dummies를 이용해 자동적으로 원-핫 인코딩을 적용한다.

- X-features_ohe에는 다음과 같이 column이 증가하게 된다.

 

 

- 204줄:  원-핫 인코딩한 데이터를 가지고 다시 train test split을 한 뒤 학습을 시키고 예측값을 평가한다.

- 209줄: expml는 True일 경우 log1p로 변환된 값 (y_target_log, y_test, pred 등)을 다시 원본화시킨다. (exponential는 log에 역수를 취한 값이다)

-  Ridge와 Lasso로 평가를 수행 한 뒤 RMSLE, RMSE, MAE값이 모두 줄어들었음을 알 수 있다.

- 226줄: coef(회귀계수)를 barplot으로 살펴본다.

 

 

- 239줄: 마지막으로 4개의 회귀트리를 가지고 평가를 수행한다

Bagging이나 Boosting계열의 예측성능은 회귀기반모델보다 더 개선되었음을 알 수 있다.  

 

728x90
반응형