13차시: 프로젝트 5
[프로젝트 5] 캐글에 일단 제출해보자 (2)
1. 목표
v 컬럼명 바꾸기
v RMSLE 낮은 순서대로 정렬하기
v 함수로 만들기
2. 프로젝트 코드
RMSE 컬럼명 바꾸기
# 데이터 다운로드
!wget –no-check-certificate 'https://docs.google.com/uc?export=download&id=1IVvuG3SMlarSSGmcliGFjq1fMxZtksE0' -O kaggle-kakr-housing-data.zip
# 다운로드 받은 zip파일 압축풀기
!unzip -qq ./kaggle-kakr-housing-data.zip
import warnings
warnings.filterwarnings("ignore")
import os
from os.path import join
import pandas as pd
import numpy as np
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import KFold, cross_val_score
import xgboost as xgb
import lightgbm as lgb
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
%config InlineBackend.figure_format = 'retina'
#--------------------------------------------------------------------------------------------------------------------------------------
train_data_path = join('./data/train.csv')
sub_data_path = join('./data/test.csv') # 테스트, 즉 submission 시 사용할 데이터 경로
#--------------------------------------------------------------------------------------------------------------------------------------
data = pd.read_csv(train_data_path)
sub = pd.read_csv(sub_data_path)
#--------------------------------------------------------------------------------------------------------------------------------------
y = data['price']
del data['price']
train_len = len(data)
data = pd.concat((data, sub), axis=0)
sub_id = data['id'][train_len:]
del data['id']
data['date'] = data['date'].apply(lambda x : str(x[:6])).astype(int)
#--------------------------------------------------------------------------------------------------------------------------------------
skew_columns = ['bedrooms', 'sqft_living', 'sqft_lot', 'sqft_above', 'sqft_basement']
for c in skew_columns:
data[c] = np.log1p(data[c].values)
#--------------------------------------------------------------------------------------------------------------------------------------
y_log_transformation = np.log1p(y)
sub = data.iloc[train_len:, :] # 테스트 데이터
x = data.iloc[:train_len, :] # 학습데이터
print(x.shape)
print(sub.shape)
#--------------------------------------------------------------------------------------------------------------------------------------
train = x # 기존 학습 데이터를 train으로
test = sub # 기존 테스트 데이터를 test로
y = np.log1p(y) # y값(price)의 로그변환
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
def rmse(y_test, y_pred):
return np.sqrt(mean_squared_error(np.expm1(y_test), np.expm1(y_pred)))
from xgboost import XGBRegressor
from lightgbm import LGBMRegressor
from sklearn.ensemble import GradientBoostingRegressor, RandomForestRegressor
# random_state는 모델초기화나 데이터셋 구성에 사용되는 랜덤 시드값입니다.
# random_state=None # 이게 초기값입니다. 아무것도 지정하지 않고 None을 넘겨주면 모델 내부에서 임의로 선택합니다.
random_state=2023 # 하지만 우리는 이렇게 고정값을 세팅해 두겠습니다.
gboost = GradientBoostingRegressor(random_state=random_state)
xgboost = XGBRegressor(random_state=random_state)
lightgbm = LGBMRegressor(random_state=random_state)
rdforest = RandomForestRegressor(random_state=random_state)
models = [gboost, xgboost, lightgbm, rdforest]
def get_scores(models, train, y):
df = {} # 결과 저장을 위한 table 생성
for model in models: # 모델명 추출
model_name = model.__class__.__name__
# 0.2만 validation에 사용
X_train, X_val, y_train, y_val = train_test_split(train, y, random_state=random_state, test_size=0.2)
# 모델학습
model.fit(X_train, y_train)
#학습된 모델 테스트
y_pred = model.predict(X_val)
# rmse를 이용한 계산
df[model_name] = rmse(y_val, y_pred)
# 테이블을 DataFrame으로 변환
score_df = pd.DataFrame(df, index=['RMSE']).T.sort_values('RMSE', ascending=False)
return score_df
from sklearn.model_selection import GridSearchCV
param_grid = {
'n_estimators': [50, 100],
'max_depth': [1, 10],
}
model = LGBMRegressor(random_state=random_state)
grid_model = GridSearchCV(model, param_grid=param_grid, \
scoring='neg_mean_squared_error', \
cv=5, verbose=1, n_jobs=5)
grid_model.fit(x, y)
grid_model.cv_results_
params = grid_model.cv_results_['params']
params
score = grid_model.cv_results_['mean_test_score']
score
results = pd.DataFrame(params)
results['score'] = score
results
results['RMSE'] = np.sqrt(-1 * results['score'])
results
## 코드시작 ##
# 미션 코드 작성 : RMSE 컬럼의 이름을 RMSLE로 바꿔보세요.
results = results.rename(columns={"RMSE": "RMSLE"}) # '...'에 코드작성
results
## 코드종료 ##
RMSLE를 낮은 순서대로 정렬하기
## 코드시작 ##
# 미션 코드 작성 : result 데이터 프레임에서 RMSLE 가 낮은 순으로 정렬해보세요.
results = results.sort_values(by='RMSLE', ascending=True) # '...' 에 코드 작성
results
## 코드종료 ##
함수로 만들기
## 코드시작 ##
# 미션 코드 작성 : 위에서 만든 것을 함수로 만들어보세요.
def my_GridSearch(model, train, y, param_grid, verbose=2, n_jobs=5):
# GridSearchCV 모델로 초기화
grid_model = GridSearchCV(model, param_grid=param_grid, scoring='neg_mean_squared_error', \
cv=5, verbose=verbose, n_jobs=n_jobs)
# 모델 fitting
grid_model.fit(train, y)
# 결과값 저장
params = grid_model.cv_results_['params'] # '...' 에 코드 작성
score = grid_model.cv_results_['mean_test_score'] # '...' 에 코드 작성
# 데이터 프레임 생성
results = pd.DataFrame(params)
results['score'] = score # '...'에 코드 작성
# RMSLE 값 계산
results['RMSLE'] = np.sqrt(-1*results['score']) # '...'에 코드작성
# RMSLE 값으로 장렬
results = results.sort_values(by='RMSLE', ascending=True) # '...'에 코드작성
## 코드종료 ##
© NAVER Connect Foundation. All Rights Reserved
'취업준비 > 인공지능' 카테고리의 다른 글
[AI Tech] 3주차 14-2차시 행렬이 뭐예요? (1) | 2024.01.30 |
---|---|
[AI Tech] 3주차 14-1차시 벡터가 뭐예요? (0) | 2024.01.30 |
[AI Tech] 2주차 12차시 프로젝트 4 (0) | 2024.01.27 |
[AI Tech] 2주차 11-2차시 Quiz 5 (1) | 2024.01.27 |
[AI Tech] 2주차 11-1차시 앙상블 (1) | 2024.01.27 |