#4 모델링
1. 베이스 라인 모델 (p211)
뼈대가 되는 가장 기본적인 모델로,
2. 모델 평가시 피처 엔지니어링에서 데이터
데이터를 변환하는게 피처 엔지니어링인데, 이 때 훈련 데이터와 테스트 데이터에 공통으로 반영해야하기 때문에,
피처 엔지니어링 전에 두 데이터를 합쳤다가 다 끝나면 도로 나누는 과정 필요
(212p - 그림)
p216 합쳤다가 피쳐엔지니어링하고 다시 나누기까지
import pandas as pd
from datetime import datetime
data_path = "/kaggle/input/bike-sharing-demand/"
train = pd.read_csv(data_path + "train.csv")
test = pd.read_csv(data_path + "test.csv")
submission = pd.read_csv(data_path + "sampleSubmission.csv")
#이상치 제거
train = train[train['weather'] != 4]
#데이터 합치기
all_data = pd.concat([train, test], ignore_index = True)
#피쳐 엔지니어링
all_data['date'] = all_data['datetime'].apply(lambda x: x.split()[0])
all_data["year"] = all_data['datetime'].apply(lambda x: x.split()[0].split("-")[0])
all_data["month"] = all_data['datetime'].apply(lambda x: x.split()[0].split("-")[1])
all_data["hour"] = all_data['datetime'].apply(lambda x: x.split()[1].split(":")[0])
all_data['weekday'] = all_data['date'].apply(
lambda dateString:
datetime.strptime(dateString, "%Y-%m-%d").weekday()
)
#pd.to_datetime() 으로 변환하는게 더 빠르긴 함.
drop_features = ['casual', 'registered', 'datetime', 'date', 'month', 'windspeed']
all_data = all_data.drop(drop_features, axis = 1)
#all_data
#다시 데이터 훈련용과 테스트용으로 나누기
X_train = all_data[~pd.isnull(all_data['count'])]
X_test = all_data[pd.isnull(all_data['count'])]
# 타깃값 count 제거
X_train = X_train.drop(['count'], axis = 1)
X_test = X_test.drop(['count'], axis = 1)
#타깃값 저장
y = train['count']
타깃값이 있으면 훈련 데이터고, 없으면 테스트 데이터이다.
3. 평가지표 계산 함수 작성 ( 217p )
RMSLE 함수
import numpy as np
def rmsle(y_true, y_pred, convertExp=True):
#지수 변환
if convertExp:
y_true = np.exp(y_true)
y_pred = np.exp(y_pred)
#로그변환 후 결측값을 0으로 변환
log_true = np.nan_to_num(np.log(y_true + 1))
log_pred = np.nan_to_num(np.log(y_pred + 1))
#RMSLE 계산
output = np.sqrt(np.mean((log_true - log_pred)**2))
return output
4. 모델 훈련하기
선형 회귀 모델을 훈련한다는 것은 독립변수(피쳐)인 X_train과 종속변수(타깃값)인 log_y에 대해응하는 최적의 선형 회귀 계수를 구한다는 의미이다. 선형 회귀 식은 따라서 x1, x2, x3 에 각각 가중치 세타를 곱해서 더한 식과 같다.( p219 )
검증할 타깃값을 x가 로그변환 한 것처럼 로그변환하고 학습시켜보면 다음과 같다.
from sklearn.linear_model import LinearRegression
import numpy as np
linear_reg_model = LinearRegression()
#위에 계산해둔 y값
log_y = np.log(y)
linear_reg_model.fit(X_train, log_y)
5. 모델 성능 검증하기
#모델 성능 검증
preds = linear_reg_model.predict(X_train)
print(f'선형회귀의 RMSLE 값: {rmsle(log_y, preds, True):.4f}')
단! 지금처럼 성능 검증시 학습 데이터를 사용하면 안됨. 이건 예시를 위해서 사용.
6. 예측 및 결과 제출
주의사항
1) 테스트 데이터로 예측한 결과를 사용해야 함.
2) 예측한 값에 지수변환을 해줘야 함. 현재 예측값인 log(count)로 되어있음.
linear_reg_preds = linear_reg_model.predict(X_test)
submission['count'] = np.exp(linear_reg_preds)
submission.to_csv('submission.csv', index=False)
제출해서 바보 점수 받음
'데이터분석 > 캐글' 카테고리의 다른 글
NLP1: Spooky Author Identification (0) | 2024.11.11 |
---|---|
Must-have 캐글: 2부 7장 이진분류 (0) | 2024.09.29 |
Must-have 캐글: 2부 6장-자전거 대여 수요 예측 (1) (0) | 2024.09.22 |
Must-have 캐글: 1부-3, 4장 캐글 프로세스, 시각화 (0) | 2024.09.18 |
Must-have 캐글: 1부 캐글에 대하여 (0) | 2024.09.15 |