ML
자전거 대여 수요 예측
hyerimir
2022. 11. 19. 16:43
데이터 클렌징 및 가공과 데이터 시각화
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
import warnings
warnings.filterwarnings('ignore', category=RuntimeWarning)
bike_df = pd.read_csv('')
print(bike_df.shape)
bike_df.head()
bike_df.info()
Datetime 칼럼의 경우 년-월-일 시:분:초 문자 형식으로 되어 있으므로 이에 대한 가공 필요
판다스는 문자열을 datetime 타입으로 변환하는 apply(pd.to_datetime) 메서드를 제공
#문자열을 datetime 타입으로 변경
bike_df['datetime'] = bike_df.datetime.apply(pd.to_datetime)
#datetime 타입에서 년, 월, 일, 시간 추출
bike_df['year'] = bike_df.datetime.apply(lambda x : x.year)
bikde_df['month'] = bike_df.datetime.apply(lambda x : x.month)
bike_df['day'] = bike_df.datetime.apply(lambda x : x.day)
bikde_df['hour'] = bike_df.datetime.apply(lambda x : x.hour)
bike_df.head(3)
drop_columns = ['datetime', 'causal', 'registered']
bike_df.drop(drop_columns, axis=1, inplace=True)
fig, axs = plt.subplots(figsize=(16,8), ncols=4, nrows=2)
cat_features = ['year', 'month', 'season', 'weather', 'day', 'hour', 'holiday', 'workingday']
for i, feature in enumerate(cat_features):
row = int(i/4)
col = i%4
sns.barplot(x=feature, y='count', data=bike_df, ax=axs[row][col])
결괏값이 정규 분포로 돼 있는지 확인하는 것과 카테고리형 회귀 모델의 경우 원-핫 인코딩으로 피처 인코딩
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.linear_model import LinearRegression, Ridge, Lasso
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)
실제 값과 예측값이 어느 정도 차이가 나는지 DataFrame의 칼럼으로 만들어서 오류 값이 가장 큰 순으로 5개만 확인
def get_top_error_data(y_test, pred, n_tops=5):
result_df = pd.DataFrame(y_test.values, columns=['read_count'])
result_df['predicted_count'] = np.round(pred)
result_df['diff'] = np.abs(result_df['real_count']-result_df['predicted_count'])
print(result_df.sort_values('diff', ascending=Flase)[:n_tops])
get_top_error_data(y_test, pred, n_tops=5)
회귀에서 큰 예측 오류가 발생한 경우 target 값의 분포가 왜곡된 형태를 이루고 있는지 확인
y_target.hist()
y_log_transform = np.log1p(y_target)
y_log_transform.hist()
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)
#테스트 데이터 세트의 target 값은 로그 변환됐으므로 다시 expm1을 이용해 원래 스케일로 변환
y_test_exp = np.expm1(y_test)
#예측값 역시 로그 변환된 타깃 기반으로 학습돼 예측됐으므로 다시 expm1로 스케일 변환
pred_exp = np.expm1(pred)
evaluate_regr(y_test_exp, pred_exp)
year, month, day, hour 등의 피처들을 One Hot Encoding