-
패스트캠퍼스 환급챌린지 33일차 미션 (3월 4일) : 딥러닝·인공지능 Signature 초격차 패키지 Online. 강의 후기패스트캠퍼스 챌린지 2024. 3. 4. 21:27
자, 오늘은
CH03-02. 자전거 대여량 예측 모델 실습 - 02. 구현을 위한 코드의 이해
&
CH04-01. 문제 정의 및 데이터의 이해
CH03-02. 자전거 대여량 예측 모델 실습 - 02.구현을 위한 코드의 이해
지난시간에 만들었던 코드는 영 별로였다. 그래서 이번에는 그 코드를 개선하는 시간을 갖도록 해보자.
(사실 성능 자체는 문제가 안되엇는데, 의미있는 데이터 전처리를 다시 해보자)
# 코드 개선하기# Data 관점# - 의미있는 feature 생성# - 의미없는 feature 삭제# - 데이터 형태 변환 : scaling, encoding
# 모델관점# - Linear Regressor# - RandomForest Regressor# - XGBRegressor# - LGBMRgressor이번시간엔 이걸 알아보자.
#datetime에 대해 파싱해보자df['datetime'] = df['datetime'].astype('datetime64')# 자전거 대여라는 것은 시간의 영향을 많이 받는다. 그래서 데이트 타임을 피쳐로 활용하기 위해 값을 파싱한다.# datetime64라는 타입으로 형변환 해준다.(기본은 문자열)df['year'] = df['datetime'].dt.yeardf['month'] = df['datetime'].dt.monthdf['day'] = df['datetime'].dt.daydf['hour'] = df['datetime'].dt.hour# 데이트타임을 년, 월, 일, 시간으로 파싱 하는 작업데이트 타임을 지난번엔 중요하지 않은 피쳐라고 여겨 데이터에서 누락하였지만 상식적으로 우리가 일반적으로
자전거를 탈 때 데이트 타임은 굉장히 중요하다.
또한 자전거를 탈 때, 시간동 중요하지만 계절, 즉 몇얼에, 그리고 몇년도에 많이 탔는지를 명세하게 알아보고자
date 타임을 년,월,일,시간으로 다 파싱한 것이다.
#데이트타임은 연/월/일/시 컬럼으로 다시 만들어줬기 때문에 더이상 데이트타임은 필요가 없고,#캐쥬얼과 레지스터드는 예측해야하는 값이기 때문에 분석에서 제외한다.#드롭메서드로 3개는 삭제한다.df.drop(['datetime','casual','registered'], axis=1, inplace=True)위의 설명대로 필요없는 컬럼들은 다 삭제해준다.

리니어 리그레서는 데이터가 정규분포라고 하는 것을 가정했을 때 모델이 잘 나오게 되어있다.
(정규분포가 아니기 때문에 로그 스케일로 변환하면 한쪽으로 쏠린데이터가 정규분포의 형태를 띄게 될 것이다.)
자, 그래서 우리가 지금 실제고 얻고 싶어하는 값 y(자전거를 몇 대 빌렸느냐의 카운트 값)
이것을 로그스케일로 변환해서 정규분포 형태로 만들어 로그값을 예측하는 모델을 만들고, 로그값을 예측했다면
이 값을 다시 exp 형태로 변환하면 실제로 몇대를 빌렸는지 다시 값을 알아낼 수 있다.!!
(걍 쉽게 말해서 정규분포의 형태를 띄고 있지 않아(한쪽으로 쏠림현상) 로그함수를 취해주면 정규분포의 형태를 띄게
되고, 정규분포의 로그 값을 알게 되면 다시 익스포넌트 형태를 취해서 원래 값을 찾고자 하는 것이다.!

2개의 히스토그램을 그려봤는데, 왼쪽은 Y값에 대해, 오른쪽은 Y를 로그 취하여 그린 그래프다.
기존은 앞쪽에 굉장히 많은데, 로그 Y를 취해서 좀 정규분포의 형태로 만들어 본 것이다.
#categorical 변수 원핫인코딩#우리가 가지고 있는 데이터 프레임의 값들 중에서 숫자로 표시되어 있긴 하지만 의미가 범주를 나타내는 것도 있었다.# 웨더는 1부터 4까지 맑음, 흐림 등등 날씨의 정도를 범주로 나타냈는데,(시즌도 마찬가지) 범주를 아무리 숫자로 나타내도 크기값은 아무 의미가 없다.# 다름만을 의미 해야지 크기로 인지했을 때 머신러닝이 멍청해 진다.# 따라서 get_dummies를 사용해서 원핫벡터로의 변환이 필요하다.# 범주형 변수로 변환이 필요한 것들(년도, 월, 날짜, 시간, 홀리데이, 워킹데이를 범주형 변수로 변환)
df = pd.get_dummies(df, columns=['year', 'month', 'day', 'hour', 'holiday', 'workingday', 'season', 'weather'])자 위에 설명한 것처럼, 겟 더미즈를 활용해서 숫자가 의미 없는 애들을 원핫 인코딩을 작업해준다.

원핫인코딩을 이후로 컬럼즈에는 저렇게 변수로 다 만들어주고,
Y값에는 이제 와이로그, X 값에는 카운터를 제거한 피져들을 넣어주자.
lr_model = LinearRegression()lr_model.fit(X_train, y_train)y_pred = lr_model.predict(X_test)mean_squared_log_error(np.expm1(y_test), np.expm1(y_pred))리니어 리그레서를만들고,
학습을 시키고,
x_test 에 대해 값을 예측을 한 결과값을 얻었고,
민스퀘어로그에러를 써서 이 성능이 얼마나 되는지 체크한다.(y값을 exp 변환해서 비교해야한다.)
해보니 0.33 이라는 값이 나왔다.

우리가 만든 변수들의 중요도를 보면..... 시즌이 젤 중요하다.
# Model 관점에서 성능 개선# 자전거 대여량이 하나의 선형모델로 만드는것이 성능이 안좋아질 수도 있을 것 같다.(피쳐와 타겟간의 연관성을 몰라서)# 트리기반의 랜덤포레스트나 XGB 등등으로 학습 성능이 어떻게 달라지는지 알아보자.
from sklearn.ensemble import RandomForestRegressorfrom xgboost import XGBRegressorfrom lightgbm import LGBMRegressor
lr_model = LinearRegression()rf_model = RandomForestRegressor(random_state = 42)xgb_model = XGBRegressor(random_state =42)lgbm_model = LGBMRegressor(random_state = 42)
model_list = [lr_model, rf_model, xgb_model, lgbm_model]for model in model_list:model.fit(X_train, y_train)y_pred = model.predict(X_test)m = model.__class__.__name__score = mean_squared_log_error(np.expm1(y_test), np.expm1(y_pred))print('{0}msle:{1:.3f}'.format(m, score))총 4개의 모델을 만들고 인스턴스를 만들고 다른 변수에 할당을 해줬다.
인자로는 추가적으로 설정하지 않고(랜덤스테이트만)
4개의 모델을 리스트에 담고 리스트의 모델을 하나씩 순차적으로 돌아가며 학습하고 테스트값을 넣어서
예측값을 구하고 테스트값과 예측값을 비교해서 스코어를 구하는 반복문을 구해본다.
결과는????!!!!!!!!!!!!!!!!!두구두구두구두구

LGBM 1등!
CH04-01. 문제 정의 및 데이터의 이해
자, 오늘부터는 군집모델이다.
# 군집모델# 군집 모델 실습# 실습 목표# sklearn의 model을 사용하여 cluster 모델 생성# cluster에서 사용 가능한 주요 성능 지표를 이해한다.cluster를 만들고, 주요 성능에 대해 살펴보자.
이번 시간에 사용할 데이터는 캐글이서 customer segementation tutorial이라고 하는 데이터 셋을 사용해보자구.
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns
df = pd.read_csv('exercise3.csv')df.head()여기까지는 다 아는 내용이니깐 패스.
위의 캡쳐에서 볼 수 있듯이, 나이나 성별에 따라서 소비 스코어가 얼마나 되는지 보는 것 같다.

다양하다 다양해


우리가 보는 것은 커스터머 세그멘테이션이다.
고객을 나이로 나누자니 구별점이 안보이고, 애뉴얼 인컴도 아니다.
뚜렷한 구별선을 찾기가 어렵다. 우리는 그룹핑 해서 관리를 하고 싶다.(VIP, 일반 등...)
그떄의 나이, 인컴, 등을 하나의 기준점으로 찾기에는 너무 어려우니...
이번에는 케이민즈알고리즘을 써서 클러스터를 만들고 각 클러스터를 분석해보자!!!
33일차 끝.
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
'패스트캠퍼스 챌린지' 카테고리의 다른 글