Study/class note

머신러닝 / 하이퍼 파라미터 최적화(grid search), 파생변수 추가

chanzae 2022. 2. 22. 15:02

ㅇ하이퍼 파라미터 최적화

1. R은 caret 패키지에 자동 튜닝 기능을 이용하면 됨

2. 파이썬은 grid search를 이용하면 됨

 

from sklearn.model_selection import GridSearchCV

param_grid = {'hidden_layer_sizes' : [(100,50), (200,50),(100,100),(200,200)],
              'activation' : ['relu','identity','tanh', 'logistic'],
              'solver':['lbfgs','sgd','adam'] }

model7 = GridSearchCV( MLPRegressor(random_state = 0), param_grid, n_jobs = -1,
                      verbose = 2)
                      
model7.fit(x_train, y_train)

print(model7.best_params_)

n_jobs = -1 : 진행과정을 다 보여주지 않고 요약해서 보여줌

verbose = 2 : 학습하면서 최적의 하이퍼 파라미터를 찾는 과정을 화면에 출력해라

 

+) 전체코드

import pandas as pd

#1. 데이터 로드
df = pd.read_csv("c:\\data\\concrete.csv")
df.head()
df.shape #(1030, 9)

#2. 결측치 확인
df.isnull().sum()

#3. 정규화
x = df.iloc[:,:-1] 
y = df.iloc[:,-1]

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
x_scaled = scaler.fit_transform(x)

#4. 훈련데이터, 테스트 데이터 분리
from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(x_scaled, y, test_size = 0.2, random_state = 10)

print(x_train.shape, x_test.shape, y_train.shape, y_test.shape)  #(824, 7) (206, 7) (824,) (206,)

#5. 모델 생성
from sklearn.neural_network import MLPRegressor  #다층퍼셉트론 모듈 (수치예측)
from sklearn.model_selection import GridSearchCV

param_grid = {'hidden_layer_sizes' : [(100,50), (200,50),(100,100),(200,200)],
              'activation' : ['relu','identity','tanh', 'logistic'],
              'solver':['lbfgs','sgd','adam'] }

model7 = GridSearchCV( MLPRegressor(random_state = 0), param_grid, n_jobs = -1,
                      verbose = 2)


#6. 모델 훈련
model7.fit(x_train, y_train)

#최적의 하이퍼 파라미터의 조합을 확인하는 코드
print(model7.best_params_)

#7. 모델 예측
result7 = model7.predict(x_test)

#8. 모델 평가
import numpy as np

np.corrcoef(result7, y_test)

 

 

문제346. 어제 R 로 구현했었던 보스톤 집값 예측 신경망으로 파이썬의 사이킷런으로 구현하시오 !
            ( grid search 기능 이용하지 말고 파생변수도 추가하지 말고 진행하세요 )

#1. 데이터 로드
import pandas as pd

df = pd.read_csv("c:\\data\\boston.csv")
df.shape  #(506, 15)

#2. 결측치 확인
df.isnull().sum()

#3. 정규화 진행
x = df.iloc[:,1:-1]
y = df.iloc[:,-1]

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
x_scaled = scaler.fit_transform(x)

#4. 데이터 분리
from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(x_scaled, y, test_size = 0.1, random_state = 10)

print(x_train.shape, x_test.shape, y_train.shape, y_test.shape)  #(455, 13) (51, 13) (455,) (51,)

#5. 모델 생성
from sklearn.neural_network import MLPRegressor

model = MLPRegressor(random_state = 0)

#6. 모델 훈련
model.fit(x_train, y_train)

#7. 모델 예측
result = model.predict(x_test)

#8. 모델 평가
import scipy.stats as stats

stats.pearsonr(y_test, result)  #(0.5101730801372366, 0.00013107350640100094)

#(0.5101730801372366, 0.00013107350640100094)  = 상관계수, p-value

 

귀무가설 : y_test와 result는 상관없다.

대립가설 : y_test와 result는 상관있다.

 

문제347. 보스톤 집값을 예측하는 위의 신경망에 grid search기능을 이용해서 가장 베스트한 하이퍼 파라미터의 조합이 어떤 것인지 알아내시오.

#5. 모델 생성
from sklearn.neural_network import MLPRegressor
from sklearn.model_selection import GridSearchCV

param_grid = {'hidden_layer_sizes' : [(100,50), (200,50),(100,100),(200,200)],
              'activation' : ['relu','identity','tanh', 'logistic'],
              'solver':['lbfgs','sgd','adam'] }

model2 = GridSearchCV( MLPRegressor(random_state = 0), param_grid, n_jobs = -1,
                      verbose = 2)

#6. 모델 훈련
model2.fit(x_train, y_train)

print(model2.best_params_)
#{'activation': 'logistic', 'hidden_layer_sizes': (200, 200), 'solver': 'lbfgs'}

#7. 모델 예측
result2 = model2.predict(x_test)

#8. 모델 평가
import scipy.stats as stats

stats.pearsonr(y_test, result2)  #(0.9385078188447198, 2.8189403883131528e-24)

 

ㅇ신경망의 성능을 올리는 방법 2가지

1. 베스트한 하이퍼 파라미터 찾기  -> 기술(grid search, caret 패키지)로 해결 가능

2. 기계가 학습하기 좋은 학습 데이터(파생변수)를 제공 -> 개인의 상상력과 창의성

 

보스톤 집값을 예측하는 신경망에게 좋은 학습데이터란 무엇인가?

> 질문을 떠올리게 할 수 잇는 데이터를 보면서 생각 > 상관관계 참고

 

문제348. 보스톤 집값 데이터의 상관계수값들을 자동화 코드를 이용해서 확인하시오.

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
 
boston = pd.read_csv("c:\\data\\boston.csv")
boston = boston.iloc[:,1:]

mask = np.zeros_like(boston.corr())
mask[np.triu_indices_from(mask)] = True

sns.heatmap(boston.corr(), annot = True, cmap = 'GnBu', mask = mask, linewidths = 0.2)  
fig = plt.gcf() # fig를 지정하고 나서
fig.set_size_inches(20,10) # 그래프의 사이즈 조절
plt.show()

종속변수(price)와 독립변수와의 상관계수가 +- 0.48 이상인 독립변수를 확인 => INDUS, RM, PRRATIO, LSTAT

1. INDUS : 비소매상업지역이 점유하고 있는 토지의 비율 - 편의성이 떨어지므로 INDUS값이 높을수록 PRICE는 낮음(음의 상관관계

2. RM : 주택 1가구당 평균 방의 개수 : 방이 많을 수록 PRICE 높음(양의 상관관계)

3. PTRATIO : 학생/교사 비율 - 교사에 비해 학생이 많으면 교육환경이 좋지 않다고 판단(음의 상관관계)

4. LSTAT : 모집단의 하위계층의 비율(%) - 하위계층이 많을수록 PRICE는 낮음(음의 상관관계)

 

위의 4가지 독립변수들을 가지고 기계가 공부하기 좋도록 데이터를 요약정리해주는 파생변수를 생성. R은 dpylr패키지의 ntile을 이용해 등급을 나눔. 파이썬은 판다스의 cut함수를 이용하면 됨.

 

문제349. INDUS(비소매상업지역의 비율)을 4개의 등급으로 나누는 파생변수를 indus_grade로 생성하시오.

##1. 데이터로드
boston = pd.read_csv("c:\\data\\boston.csv")

boston['indus_grade'] = pd.cut(boston['INDUS'],bins = 4, labels = [1,2,3,4])
boston.head()

문제350. indus_grade를 출력하고 indus_grade별 평균 집값을 출력하시오.

boston.groupby('indus_grade')['price'].mean().reset_index()

> 주변에 비소매상업지역 면적이 넓을수록 집값이 떨어지고 있음.

 

 

문제351. (점심시간 문제) 방의 갯수가 많을수록 집값이 더 비싼지를 rm_grade라는 파생변수를 생성하고(4등급으로 분류) rm_grade별 평균집값을 확인하시오.

boston['rm_grade'] = pd.cut(boston['RM'],bins = 4, labels = [1,2,3,4])
boston.head()

boston.groupby('rm_grade')['price'].mean().reset_index()

문제352. rm_grade 파생변수 데이터로 인공신경망을 학습시켜 상관계수가 좀 더 올라가는지 확인하시오.

import pandas as pd

#1. 데이터 로드

df = pd.read_csv("c:\\data\\boston.csv")
df['rm_grade'] = pd.cut(boston['RM'],bins = 4, labels = [1,2,3,4])

df.shape #(506, 16)

#2. 결측치 확인
df.isnull().sum()

#3. 정규화
x = df.loc[:,(df.columns != 'price') & (df.columns != 'id') ]
y = df.iloc[:,-2]

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
x_scaled = scaler.fit_transform(x)

#4. 훈련데이터, 테스트 데이터 분리
from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(x_scaled, y, test_size = 0.1, random_state = 10)

print(x_train.shape, x_test.shape, y_train.shape, y_test.shape)  #(455, 14) (51, 14) (455,) (51,)

#5. 모델 생성
from sklearn.neural_network import MLPRegressor  #다층퍼셉트론 모듈 (수치예측)
from sklearn.model_selection import GridSearchCV

param_grid = {'hidden_layer_sizes' : [(100,50), (200,50),(100,100),(200,200)],
              'activation' : ['relu','identity','tanh', 'logistic'],
              'solver':['lbfgs','sgd','adam'] }

model = GridSearchCV( MLPRegressor(random_state = 0), param_grid, n_jobs = -1, verbose = 2)


#6. 모델 훈련
model.fit(x_train, y_train)

#최적의 하이퍼 파라미터의 조합을 확인하는 코드
print(model.best_params_)

#7. 모델 예측
result = model.predict(x_test)

#8. 모델 평가
import scipy.stats as stats

stats.pearsonr(y_test, result)  #(0.9434078072300064, 3.9015038527017645e-25)

 문제353. 위의 rm_grade를 빼고 indus_grade파생변수를 추가해 결과가 어떻게 나오는지 확인하시오.

import pandas as pd

#1. 데이터 로드

df = pd.read_csv("c:\\data\\boston.csv")
df['indus_grade'] = pd.cut(boston['INDUS'],bins = 4, labels = [1,2,3,4])

df.shape #(506, 16)

#2. 결측치 확인
df.isnull().sum()

#3. 정규화
x = df.loc[:,(df.columns != 'price') & (df.columns != 'id') ]
y = df.iloc[:,-2]

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
x_scaled = scaler.fit_transform(x)

#4. 훈련데이터, 테스트 데이터 분리
from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(x_scaled, y, test_size = 0.1, random_state = 10)

print(x_train.shape, x_test.shape, y_train.shape, y_test.shape)  #(455, 14) (51, 14) (455,) (51,)

#5. 모델 생성
from sklearn.neural_network import MLPRegressor  #다층퍼셉트론 모듈 (수치예측)
from sklearn.model_selection import GridSearchCV

param_grid = {'hidden_layer_sizes' : [(100,50), (200,50),(100,100),(200,200)],
              'activation' : ['relu','identity','tanh', 'logistic'],
              'solver':['lbfgs','sgd','adam'] }

model = GridSearchCV( MLPRegressor(random_state = 0), param_grid, n_jobs = -1, verbose = 2)


#6. 모델 훈련
model.fit(x_train, y_train)

#최적의 하이퍼 파라미터의 조합을 확인하는 코드
print(model.best_params_)

#7. 모델 예측
result = model.predict(x_test)

#8. 모델 평가
import scipy.stats as stats

stats.pearsonr(y_test, result)  #(0.9597627509313449, 1.1069169140301344e-28)

 

파생변수 추가하기전 코드의 결과 : (0.9385078188447198, 2.8189403883131528e-24)

rm_grade 파생변수 추가한 코드 결과 : (0.9434078072300064, 3.9015038527017645e-25)

indus_grade 파생변수 추가한 코드 결과 : (0.9597627509313449, 1.1069169140301344e-28)

 

 

문제354. 위의 결과를 보면 비소매상업지역일수록 집값이 떨어지는 것을 확인할 수 있음. 그렇다면 집 주변에 공해가 많을수록 집값이 떨어지는지도 확인하시오. NOX 컬럼의 데이터로 nox_grade라는 파생변수를 생성하시오.

df = pd.read_csv("c:\\data\\boston.csv")
df['nox_grade'] = pd.cut( df['NOX'], bins = 4, labels = [1,2,3,4])

문제356 nox_grade를 출력하고 nox_grade별 평균집값을 출력하시오.

df = pd.read_csv("c:\\data\\boston.csv")
df['nox_grade'] = pd.cut( df['NOX'], bins = 4, labels = [1,2,3,4])
df.groupby('nox_grade')['price'].mean().reset_index()

문제357. 

import pandas as pd

#1. 데이터 로드

df = pd.read_csv("c:\\data\\boston.csv")
df['nox_grade'] = pd.cut( df['NOX'], bins = 4, labels = [1,2,3,4])
df.head()

df.shape #(506, 16)

#2. 결측치 확인
df.isnull().sum()

#3. 정규화
x = df.loc[:,(df.columns != 'price') & (df.columns != 'id') ]
y = df.price

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
x_scaled = scaler.fit_transform(x)

#4. 훈련데이터, 테스트 데이터 분리
from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(x_scaled, y, test_size = 0.1, random_state = 10)

print(x_train.shape, x_test.shape, y_train.shape, y_test.shape)  #(455, 14) (51, 14) (455,) (51,)

#5. 모델 생성
from sklearn.neural_network import MLPRegressor  #다층퍼셉트론 모듈 (수치예측)
from sklearn.model_selection import GridSearchCV

param_grid = {'hidden_layer_sizes' : [(100,50), (200,50),(100,100),(200,200)],
              'activation' : ['relu','identity','tanh', 'logistic'],
              'solver':['lbfgs','sgd','adam'] }

model = GridSearchCV( MLPRegressor(random_state = 0), param_grid, n_jobs = -1, verbose = 2)


#6. 모델 훈련
model.fit(x_train, y_train)

#최적의 하이퍼 파라미터의 조합을 확인하는 코드
print(model.best_params_)

#7. 모델 예측
result = model.predict(x_test)

#8. 모델 평가
import numpy as np

np.corrcoef(result, y_test)

#8. 모델 평가
import scipy.stats as stats

stats.pearsonr(y_test, result)  #(0.951702592841263, 8.841192236007967e-27)

 

반응형