자격증/빅데이터분석기사

[빅데이터 분석기사 실기] 작업형 2 회귀예측문제 풀어보기

망삼드 2023. 6. 21. 00:18
#회귀예측문제
- 성능이 우수한 예측모형 구축위해 적절한 데이터 전처리
- 피쳐엔지니어링, 분류알고리즘, 초매개변수 최적화, 모형 앙상블
- 수험번호로 파일만들기
- 제출한 모형의 성능은 RMSE, MAE가 평가지표
- 종속변수 mpg

임의로 seaborn에서 제공하는 데이터를 가져와 회귀예측문제를 풀어보겠습니다

#데이터 파일열고 분리

import seaborn as sns
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
df = sns.load_dataset('mpg')
X_train,X_test,y_train,y_valid = train_test_split(df,df['mpg'],test_size=0.2, random_state=42)
#['mpg']를 종속번수로 쓰려하기때문에 drop해줍니다
X_train = X_train.drop(['mpg'],axis=1)
X_test = X_test.drop(['mpg'],axis=1)

data가 이런 식으로 되어있습니다 참고로 'mpg'는 없앤 결과입니다

#결측치 제거

print(X_train.isna().sum())
X_train['horsepower'] = X_train['horsepower'].fillna(X_train['horsepower'].median())
X_test['horsepower'] = X_test['horsepower'].fillna(X_test['horsepower'].median())

Horsepower쪽에 결측치가 있고 그 데이터의 형태를 체크해 median으로 채워주는게 좋을것 같아요

#LabelEncoder

문자열에 대해서 LabelEncoder를 진행해줍니다

이런식으로 간단하게 할수 있습니다

label = ['origin','name']
from sklearn.preprocessing import LabelEncoder
X_train[label] = X_train[label].apply(LabelEncoder().fit_transform)
X_test[label] = X_test[label].apply(LabelEncoder().fit_transform)

#카테고리 변환, 더미처리

category = ['origin']
for i in category:
	X_train[i] = X_train.astype('category')
    X_test[i] = X_test.astype('category')
  X_train = pd.get_dummies(X_train)
  X_test = pd.get_dummies(X_test)

#파생변수 만들기

X_train['horsepower_qcut'] = pd.qcut(X_train['horsepower'], 5, labels=False)
X_test['horsepower_qcut'] = pd.qcut(X_test['horsepower'], 5, labels=False)

#5. Scale 작업

from sklearn.preprocessing import MinMaxScaler
scaler = ['displacement','horsepower','weigth']
min = MinMaxScaler()
min.fit(X_train[scaler])

X_train[scaler] = min.transform(X_train[scaler])
X_test[scaler] = min.transform(X_test[scaler])

#6. 데이터 분리

# X_train -> X_train, X_valid
X_train, X_valid,y_train,y_valid = train_test_split(X_train,y_train,test_size=0.2,random_state=42)

#7. 모델학습

#LinearRegression
from sklearn.linear_model import LinearRegrssion
model1= LinearRegression
model1.fit(X_train,y_train)
pred1 = model1.predict(X_valid)

#RandomForestregressor
from sklearn.ensemble import RandomForestRegressor
model2= RandomForestRegressor()
model2.fit(X_train,y_train)
pred2= model2.predict(X_valid)

이번엔 lineargression 모델과 randomforestregressor모델을 사용했습니다

#8. 앙상블

from sklearn.ensemble import StackingRegressor
estimators = [('lr',model1),('rf',model2))
model3= StackingRegressor(estimators= estimators, final_estimator = RandomForestRegreesor())
model3.fit(X_train,y_train)
pred3= model3.predict(X_valid)

이번엔 stackingRegressor을 사용했는데요 예측한 결과값을 메타데이터로 만들어 다시 예측하는 것입ㄴ디ㅏ

이런식의 array가 만들어집니다

#9. 모형평가

MSE와 RMSE를 사용해 모델을 평가해보겠습니다. sklearn.metrics에서 mean_squared_error모듈을 사용합니다

mean_squared_error를쓰는데, RMSE는 mean_squared_error에 np.sqrt를 씌워주면 됩니다

from sklearn.metrics import mean_squared_error
#MSE
print('선형회귀 mse :', mean_squared_error(y_valid,pred1))
print('랜포 mse :', mean_squared_error(y_valid,pred2))
print('스태킹 mse :', mean_squared_error(y_valid,pred3))
#RMSE
print('선형회귀 mse :', np.sqrt(mean_squared_error(y_valid,pred1))
print('랜포 mse :', np.sqrt(mean_squared_error(y_valid,pred2))
print('스태킹 mse :', np.sqrt(mean_squared_error(y_valid,pred3))

랜포 성능이 제일 좋네요

이제 파일 저장을 해봅시다

제일 성능이 좋았던 랜포를 사용합니다

#파일저장

result = pd.Dataframe(model2.predict(X_test))
result = result.iloc[:,0]
pd.DataFrame({'id':X_test.index,'result':,result}).to_csv('00400.csv',index=False)
check = pd.read_csv('00400.csv')
check.head()

predict한 결과에서 첫번째 열만 index없이 저장한것입니다