본문 바로가기

Study/class note

머신러닝 / 파이썬으로 신경망 모델 만들기

67 파이썬으로 신경망 모델 만들기

파이썬으로 콘크리트 강도를 예측하는 신경망 만들기

 

#1. 데이터 로드

#2. 결측치 확인

#3. 정규화

#4. 훈련데이터, 테스트 데이터 분리

#5. 모델 생성

#6. 모델 훈련

#7. 모델 예측

#8. 모델 평가

#9. 성능 개선

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  #다층퍼셉트론 모듈 (수치예측)

model = MLPRegressor(random_state = 0)

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

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

#8. 모델 평가
import numpy as np

np.corrcoef(result, y_test)  #0.65128096

> 0.65의 상관계수 값이 출력됨. R보다 훨씬 못한 결과가 나옴.

 

성능을 개선시키기 위해 MLPRegressor의 hidden_layer_sizes 옵션을 주면 됨.(하이퍼 파라미터 조정)

MLPRegressor(random_state = 0) <- 2층 신경망이고 기본값은 은닉 1층의 뉴런의 갯수 100개

MLPRegressor(random_state = 0,hidden_layer_sizes = (200,50) <- 3층 신경망, 은닉1층의 뉴런 갯수 200,  은닉2층의 뉴런 갯수 50개

 

입력층(0층) ---> 은닉1층(200) ---> 은닉2층(50) ---> 출력층(3층)

 

#9. 성능개선
from sklearn.neural_network import MLPRegressor  #다층퍼셉트론 모듈 (수치예측)
import numpy as np

model2 = MLPRegressor(random_state = 0, hidden_layer_sizes = (200,50))
model2.fit(x_train, y_train)

result2 = model2.predict(x_test)

np.corrcoef(result2, y_test)  #0.78981519

 

 

ㅇ 파이썬에서 신경망 모델 생성시 조정할 수 있는 하이퍼 파라미터

1. hidden_layer_sizes :은닉층의 갯수와 뉴런의 갯수

2. activation : 활성화 함수(sigmoid, relu, logstic, identity, tanh)

3. solver : 경사하강법의 종류(adam, sgd, lbfgs)

4. max_iter : 책을 몇 번 볼지

#9-2. 성능개선
from sklearn.neural_network import MLPRegressor  #다층퍼셉트론 모듈 (수치예측)
import numpy as np

model3 = MLPRegressor(random_state = 0,    # seed값
                      hidden_layer_sizes = (200,50),   # 은닉1층 200개, 은닉2층 50개
                     activation = 'relu',  # 활성화함수
                     solver = 'adam',   #경사하강법의 종류
                     max_iter = 1000)  #반복
model3.fit(x_train, y_train)

result3 = model3.predict(x_test)

np.corrcoef(result3, y_test)  #0.92989791

 

 

문제345. (오늘의 마지막 문제) 위의 model3의 성능을 더 올리는데 활성화 함수는 relu, solver = lbfgs, random_State = 0으로 했을 때 가장 적절한 hidden_layer_sizes = (i,j)를 찾으시오.

#9-4. 성능개선
from sklearn.neural_network import MLPRegressor  #다층퍼셉트론 모듈 (수치예측)
import numpy as np
from itertools import product
from tqdm.notebook import tqdm
import pandas as pd

params_ik = [(i for i in range(100,401,100)),
             [k for k in range(50,201,50)]]
params1 = list(product(*params_ik))

find = []
for i in tqdm(params1):
    model4 = MLPRegressor(random_state = 0,   
                          hidden_layer_sizes = i,  
                         activation = 'relu', 
                         solver = 'lbfgs',   
                         max_iter = 1000) 
    model4.fit(x_train, y_train)

    result4 = model3.predict(x_test)

    find.append([i, np.corrcoef(result4, y_test)[1,0]] )
    
find_hidden = pd.DataFrame(find)
find_hidden.columns = ['hidden_layer_sizes', 'corrcoef']
find_hidden.sort_values(by = 'corrcoef', ascending = False).head(10)

+) 하이퍼 파라미터 최적화 모델을 찾아주는 GridSearchCV 사용, hidden_layer 2개인 경우

from sklearn.model_selection import GridSearchCV
from itertools import product

lst_ik = [(i for i in range(100,300+1,50)),
             [k for k in range(10,100+1,10)]]
params3 = list(product(*lst_ik))

grid_params3 = {'hidden_layer_sizes' : params3,
                'activation' : ['relu'], 
                'solver' : ['lbfgs'],   
                'max_iter' : [1000]  }

model = MLPRegressor()
grid_cv = GridSearchCV(model, param_grid = grid_params3, n_jobs = -1)
grid_cv.fit(x_train, y_train)

print('최적 하이퍼 파라미터: ', grid_cv.best_params_)
# 최적 하이퍼 파라미터: {'activation': 'relu', 'hidden_layer_sizes': (150, 100), 'max_iter': 1000, 'solver': 'lbfgs'}
model6 = MLPRegressor(random_state = 0,   
                          hidden_layer_sizes = (150,100),  
                         activation = 'relu', 
                         solver = 'lbfgs',   
                         max_iter = 1000) 
model6.fit(x_train, y_train)

result6 = model6.predict(x_test)

print('상관계수 : %f'%np.corrcoef(result6, y_test)[1,0])
# 상관계수 : 0.964282
반응형