심도 있는 학습기초3:tensorflow2.0과 sklearn...RandomizeSearchCV 하이퍼매개변수 검색
카탈로그
소개하다.
본 블로그는 tf2를 어떻게 활용하는지 기록할 것입니다.0과 skleran은 구축된 회귀 모델(캘리포니아 집값 예측에 사용)에 대해 초파라미터 검색을 하고 코드는jupyter notebook에서 실행됩니다.
실현 방법
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import sklearn
import os
import sys
import time
import tensorflow as tf
from tensorflow import keras
print(tf.__version__)
print(sys.version_info)
for module in mpl, np, pd, sklearn, tf, keras:
print(module.__name__, module.__version__)
from sklearn.datasets import fetch_california_housing
housing = fetch_california_housing()
print(housing.DESCR)
print(housing.data.shape)
print(housing.target.shape)
from sklearn.model_selection import train_test_split
x_train_all, x_test, y_train_all, y_test = train_test_split(housing.data, housing.target, random_state = 7)
x_train, x_valid, y_train, y_valid = train_test_split(x_train_all, y_train_all, random_state = 11)
print(x_train.shape, y_train.shape)
print(x_test.shape, y_test.shape)
print(x_valid.shape, y_valid.shape)
traintest_split 함수: 행렬을 무작위로 훈련 서브집합과 테스트 서브집합으로 나누고 구분된 훈련 집합 테스트 집합 샘플과 훈련 집합 테스트 집합 라벨을 되돌려줍니다. 매개 변수 randomstate: 무작위 피드입니다.랜덤수 피드: 사실은 이 그룹의 랜덤수 번호입니다. 중복 시험이 필요할 때 같은 랜덤수를 얻을 수 있습니다.예를 들어 네가 매번 1을 채우면 다른 매개 변수와 같은 상황에서 네가 얻은 무작위 그룹은 같다.그러나 0을 쓰든지 말든지 매번 다르다. 랜덤 수의 생성은 씨앗에 달려 있다. 랜덤 수와 씨앗 간의 관계는 다음과 같은 두 가지 규칙에 따른다. 씨앗이 다르면 서로 다른 랜덤 수가 발생한다.피드가 같으면 실례가 다르더라도 같은 랜덤수를 만들 수 있다.
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
x_train_scaler = scaler.fit_transform(x_train)
x_valid_scaler = scaler.transform(x_valid)
x_test_scaler = scaler.transform(x_test)
StandardScaler 클래스는 데이터를 귀일화하고 표준화하는 클래스입니다.표준화 방법: X = (x --μ )/σ X=(x-\mu)/\sigma X=(x−μ)/σ, μ\mu μ데이터 x x x의 평균값으로σ\sigma σ데이터 x x x의 표준 차이인 경우 X X X X ~ N (0,1) N (0,1) N (0,1) fittransform 방법은fit와transform의 결합:fittransform(x train) 계산 xtrain의μ\mu μ및σ\sigma σ및 저장μ\mu μ및σ\sigma σ,그런 다음 x x x 를 표준화합니다. transform은 xtrain의μ\mu μ및σ\sigma σ입력 데이터를 표준화하다.
def build_model(hidden_layers = 1, layer_size = 30, learning_rate = 3e-3):
model = keras.models.Sequential()
model.add(keras.layers.Dense(layer_size, activation = 'relu', input_shape = x_train_scaler.shape[1:]))
for _ in range(hidden_layers -1):
model.add(keras.layers.Dense(layer_size,activation = 'relu'))
model.add(keras.layers.Dense(1))
optimizer = keras.optimizers.SGD(learning_rate)
model.compile(loss = 'mse', optimizer = optimizer)
return model
# step 1: : , KerasRegressor; KerasClassifier
sklearn_model = keras.wrappers.scikit_learn.KerasRegressor(
build_fn = build_model)
callbacks = [keras.callbacks.EarlyStopping(patience = 5, min_delta = 1e-2)]
history = sklearn_model.fit(x_train_scaler, y_train,
validation_data = (x_valid_scaler, y_valid),
epochs = 10,
callbacks = callbacks)
from scipy.stats import reciprocal
reciprocal.rvs(1e-4, 1e-2, size=10)
# 1e-4:
# 1e-2:
# size:
param_distribution: 이 사전에 저장된 매개 변수는 이전 단계build모델 함수의 입력 매개 변수
# step 2: :
from scipy.stats import reciprocal
# f(x) = 1/(x*log(b/a)) a<=x<=b
param_distribution = {
'hidden_layers': [1, 2, 3, 4],
'layer_size': np.arange(1, 100),
'learning_rate': reciprocal(1e-4, 1e-2),
}
# step 3:
from sklearn.model_selection import RandomizedSearchCV
random_search_cv = RandomizedSearchCV(sklearn_model,
param_distribution,
n_iter = 10,
cv =3,
n_jobs = 1)
random_search_cv.fit(x_train_scaler, y_train, epochs = 100,
validation_data = (x_valid_scaler, y_valid),
callbacks = callbacks)
# cross_validation: n ,n-1 ,
print(random_search_cv.best_params_)
print(random_search_cv.best_score_)
print(random_search_cv.best_estimator_)
model = random_search_cv.best_estimator_.model
model.evaluate(x_test_scaler, y_test)