본문 바로가기
IT,SW,Data,Cloud,코딩/Python

20230614 파이썬공부 - 모델링, 평가지표

by 착실하게 2023. 6. 14.
반응형

피쳐엔지니어링 관련 

1) 인코딩 : 필수. object 컬럼이 있다면 적용 안함은 없음. 

2) 스케일링 : 선택. - 트리계열 모델은 (랜덤포레스트, xgboost, lightgbm) 스케일링 해도 대소관계에 변함이 없어서 영향이 미미함. 

 

###################

진행 순서

1. 베이스라인 (drop)

2. 인코딩 

3. 결측치

4. 모델 튜닝

5. 스케일링

 

###################

회귀 평가지표 

R2 Score 회귀 모델의 '설명력' 

MAE (Mean Absolute Error) 오차의 절대값의 평균 

MSE (Mean Squared Error) 오차의 제곱해서 평균

 

MAPE (Mean Absolute Percentage Error) MAE를 퍼센트로 표시. 

RMSE (Root Mean Squared Error) 오차의 제곱에 루트해서 평균 

RMSLE (Root Mean Squared Log Error) 오차의 로그에 - 예측값이 실제값보다 작을때 더 큰 패널티 부여 (배달이 50분 걸린다고 예측했는데 30분 걸리면 ok, 그런데 20분 걸린다고 했는데 40분 걸리면 안됨.) 

 

R2 Score 값의 해석: 

0부터 1사이의 값을 가지며, 1은 100%의 설명력을 가진다는 의미.

음수의 값이 나오기도 하는데 이는 모든 값을 종속변수의 평균값으로 예측했을 경우보다 설명력이 낮다는 의미.

 

 

 

# 회귀 문제 
# 회귀 문제 평가: R-squared, MAE, MSE, RMSE, RMSLE, MAPE 

import pandas as pd 
test = pd.read_csv('data/airbnb/test.csv')
train = pd.read_csv('data/airbnb/train.csv')
y_test = pd.read_csv('data/airbnb/y_test.csv')

#target : price(가격)
#타겟 컬럼이 항상 맨 오른쪽에 위치하지는 않음.

#############################
# EDA 
print(test.shape, train.shape) # 15개 컬럼, 16개 컬럼 
print(train.head(3)) # price 
print(train.isnull().sum())
print(test.isnull().sum()) # train 과 결측치 있는 컬럼은 동일함 
print(train['price'].describe())
print(train.info())


# 결측치 처리
# 결측치가 있는 컬럼은 4개 
# name, host_name, last_review, reviews_per_month 
# 해당 컬럼들의 데이터 타입은 object 3개 float형 1개

print(train.nunique())
# 선생님은 nunique()를 보고 name, host_name 은 삭제하기로 결정함
# last_review 는 날짜 데이터. 전처리가 번거로워서 일단 삭제하는 것으로함
# reviews_per_month 는 결측치를 0으로 채워보겠다고 하셨음. 
# 그리고 나머지 데이터 중에서도, 거의 데이터 갯수만큼 있는 컬럼은 삭제하기로 결정하심.
# 그런 컬럼은 name, host_id, host_name이 있음. 아마 object 타입인데, 데이터 갯수만큼 많은건 삭제해도 될거같음

# 컬럼 삭제
print(test.columns,train.columns)

print(test.shape, train.shape)
cols = ['name','host_id','host_name','last_review']
train = train.drop(cols,axis=1)
test = test.drop(cols,axis=1)
print(test.shape, train.shape)

# review가 없었다면 0건이라고 생각해서 0으로 결측치를 해워본 것임.
train['reviews_per_month'] = train['reviews_per_month'].fillna(0) 

test['reviews_per_month'] = test['reviews_per_month'].fillna(0)

# train에서는 id컬럼 삭제, test에서는 따로 빼두었음. 
train = train.drop('id', axis=1)
test_id = test.pop('id')

train_price = train.pop('price') #pop에다가 [] 쓰면 내가 원하는 작업이 아님 


#Scaling
#price에다가 robust적용
from sklearn.preprocessing import RobustScaler

cols=train.select_dtypes(exclude='object').columns
print("cols========",cols)

scaler = RobustScaler()
train[cols]=scaler.fit_transform(train[cols])
test[cols]=scaler.transform(test[cols])


# LabelEncoder 적용

from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
cols = train.select_dtypes(include=object)
# print(cols)
for col in cols:
  train[col]=encoder.fit_transform(train[col])
  test[col]=encoder.transform(test[col])


print(train.head())#LabelEncoding결과확인 




# validation dataset 분리 
from sklearn.model_selection import train_test_split 

X_tr, X_val, y_tr, y_val = train_test_split(train, train_price, random_state = 2022, test_size = 0.15 )

print(X_tr.shape, X_val.shape, y_tr.shape, y_val.shape )

############################
# 회귀 모델 머신러닝 및 평가지표

import numpy as np 
from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error

# 오차: 실제값 - 예측값 
# 평가지표 계산식을 기억하지 못해도, csv 파일제출에는 문제가 없다. 다른 평가지표 사용해서 검증하고 제출하면 된다. 

def mape(y_test, y_pred): #MAPE # mean absolute percentage error 
  return np.mean(np.abs((y_test - y_pred) / y_test)) * 100 

def rmse(y_test, y_pred): #RMSE
  return np.sqrt(mean_squared_error(y_test,y_pred))

def rmsle(y_test, y_pred): #RMSLE #root mean squared log error 
  LE = np.log1p(y_test) - np.log1p(y_pred)
  SLE = np.power(LE,2)
  MSLE = np.mean(SLE)
  RMSLE = np.sqrt(MSLE)
  return RMSLE


############################
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Ridge
from sklearn.linear_model import Lasso
from sklearn.tree import DecisionTreeRegressor 
from sklearn.ensemble import RandomForestRegressor
from xgboost import XGBRegressor 
import lightgbm 

# print('LinearRegression')
# # 선형 회귀 
# model = LinearRegression()
# model.fit(X_tr, y_tr)
# pred = model.predict(X_val)

# print('r2 ', r2_score(y_val,pred))
# print('mae ', mean_absolute_error(y_val,pred))
# print('mse ', mean_squared_error(y_val,pred))
# print('mape ', mape(y_val,pred))
# print('rmse ', rmse(y_val,pred))
# print('rmsle ', rmsle(y_val,pred))

# print('Ridge')
# # Ridge
# model = Ridge()
# model.fit(X_tr,y_tr)
# pred=model.predict(X_val)

# print('r2 ', r2_score(y_val,pred))
# print('mae ', mean_absolute_error(y_val,pred))
# print('mse ', mean_squared_error(y_val,pred))
# print('mape ', mape(y_val,pred))
# print('rmse ', rmse(y_val,pred))
# print('rmsle ', rmsle(y_val,pred))

# print('Lasso')
# # Lasso 
# model = Lasso()
# model.fit(X_tr,y_tr)
# pred=model.predict(X_val)

# print('r2 ', r2_score(y_val,pred))
# print('mae ', mean_absolute_error(y_val,pred))
# print('mse ', mean_squared_error(y_val,pred))
# print('mape ', mape(y_val,pred))
# print('rmse ', rmse(y_val,pred))
# print('rmsle ', rmsle(y_val,pred))

# print('DecisionTreeRegressor')
# model = DecisionTreeRegressor(random_state=2022)
# model.fit(X_tr,y_tr)
# pred=model.predict(X_val)

# print('r2 ', r2_score(y_val,pred))
# print('mae ', mean_absolute_error(y_val,pred))
# print('mse ', mean_squared_error(y_val,pred))
# print('mape ', mape(y_val,pred))
# print('rmse ', rmse(y_val,pred))
# print('rmsle ', rmsle(y_val,pred))

# print('RandomForestRegressor')
# model = RandomForestRegressor(random_state=2022)
# model.fit(X_tr,y_tr)
# pred=model.predict(X_val)

# print('r2 ', r2_score(y_val,pred))
# print('mae ', mean_absolute_error(y_val,pred))
# print('mse ', mean_squared_error(y_val,pred))
# print('mape ', mape(y_val,pred))
# print('rmse ', rmse(y_val,pred))
# print('rmsle ', rmsle(y_val,pred))

print('XGBRegressor')
model = XGBRegressor(random_state=2022)
model.fit(X_tr,y_tr)
pred=model.predict(X_val)

print('r2 ', r2_score(y_val,pred))
print('mae ', mean_absolute_error(y_val,pred))
print('mse ', mean_squared_error(y_val,pred))
print('mape ', mape(y_val,pred))
print('rmse ', rmse(y_val,pred))
print('rmsle ', rmsle(y_val,pred))


# print('lightgbm')
# model = lightgbm.LGBMRegressor(random_state=2022)
# model.fit(X_tr,y_tr)
# pred=model.predict(X_val)

# print('r2 ', r2_score(y_val,pred))
# print('mae ', mean_absolute_error(y_val,pred))
# print('mse ', mean_squared_error(y_val,pred))
# print('mape ', mape(y_val,pred))
# print('rmse ', rmse(y_val,pred))
# print('rmsle ', rmsle(y_val,pred))

# 평가지표를 비교해보고 XGBoost로 선택했음.

pred=model.predict(test)

print(pred[:5])

submit = pd.DataFrame({
  'id' : test_id,
  'output' : pred
})
submit.to_csv('data/airbnb/20230614_airbnb.csv')


########################
answer = pd.read_csv('data/airbnb/20230614_airbnb.csv')

print('answer', answer.head())



print("========")
print('r2 ', r2_score(y_test,pred))
print('mae ', mean_absolute_error(y_test,pred))
print('mse ', mean_squared_error(y_test,pred))
# print('mape ', mape(y_test,pred))
# print('rmse ', rmse(y_test,pred))
# print('rmsle ', rmsle(y_test,pred))

 

 

반응형

댓글