#랜덤서치, 그리드서치, 할빙그리드서치를
#for문으로 한방에 넣어라
#단, 패치코브타입처럼 느린놈은 랜덤이나 할빙중에 하나만 넣어라
#n_iter 5 cv 2
import numpy as np
from sklearn.datasets import load_iris, load_breast_cancer, load_wine, load_digits, fetch_covtype, load_diabetes, fetch_california_housing
from sklearn.preprocessing import MinMaxScaler, StandardScaler, RobustScaler, MaxAbsScaler
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.tree import DecisionTreeRegressor, DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.pipeline import make_pipeline, Pipeline
from sklearn.svm import SVC
from sklearn.experimental import enable_halving_search_cv
from sklearn.model_selection import GridSearchCV, RandomizedSearchCV, HalvingGridSearchCV, HalvingRandomSearchCV
#1. 데이터
data_list = [load_iris,
load_breast_cancer,
load_wine,
load_digits]
data_name_list = ['아이리스',
'브레스트 캔서',
'와인',
'디짓스']
Grid_list = [GridSearchCV,
RandomizedSearchCV,
HalvingGridSearchCV,
HalvingRandomSearchCV]
Grid_name = ['그리드서치',
'랜더마이즈서치',
'할빙그리드서치',
'할빙랜덤서치']
scaler_list = [MinMaxScaler(),
RobustScaler(),
StandardScaler(),
MaxAbsScaler()]
scaler_name = ['민맥스',
'로버스트',
'스탠다드',
'맥스앱스']
# x_train, x_test, y_train, y_test = train_test_split(
# x,y, train_size=0.8, shuffle=True, random_state=337
# )
parameters = [
{'randomforestclassifier__n_estimators':[100, 200]},
{'randomforestclassifier__max_depth':[6, 8, 10, 12]},
{'randomforestclassifier__min_samples_leaf':[3, 5, 7, 10]},
{'randomforestclassifier__min_samples_split':[2, 3, 5, 10]},
]
parameters =[
{'randomforestclassifier__n_estimators':[100],'randomforestclassifier__max_depth':[6,8,10,12],'randomforestclassifier__min_samples_leaf':[3,10],'randomforestclassifier__min_samples_split':[2,10]},
{'randomforestclassifier__n_estimators':[100],'randomforestclassifier__max_depth':[6,8,10,12],'randomforestclassifier__min_samples_leaf':[5,7],'randomforestclassifier__min_samples_split':[3,5]},
{'randomforestclassifier__n_estimators':[200],'randomforestclassifier__max_depth':[6,8],'randomforestclassifier__min_samples_leaf':[7,10],'randomforestclassifier__min_samples_split':[5,10]},
{'randomforestclassifier__n_estimators':[200],'randomforestclassifier__max_depth':[10,12],'randomforestclassifier__min_samples_leaf':[3,5],'randomforestclassifier__min_samples_split':[2,3,]}
]
#2. 모델
pipe = make_pipeline(StandardScaler(), RandomForestClassifier())
# model = GridSearchCV(pipe, parameters,
# cv = 5,
# verbose=1,
# n_jobs=-1
# )
for i in range(len(data_list)):
x, y = data_list[i](return_X_y=True)
x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.8, random_state= 337, stratify=y)
max_score = 0
for j, value2 in enumerate(scaler_list):
for k, value3 in enumerate(Grid_list):
model = value3(pipe, parameters,
cv = 5,
verbose=1,
n_jobs=-1
)
model.fit(x_train, y_train)
score = model.score(x_test, y_test)
y_pred = model.predict(x_test)
acc=accuracy_score(y_test, y_pred)
if max_score < score:
max_score = score
max_s_name = scaler_name[j]
max_model_name = Grid_name[k]
print('\\n')
print('===============',data_name_list[i],'================')
print('최고모델 :', max_s_name, max_model_name, max_score)
print('=============================================')
# =============== 아이리스 ================
# 최고모델 : 민맥스 그리드서치 0.9666666666666667
# =============================================
# =============== 브레스트 캔서 ================
# 최고모델 : 민맥스 그리드서치 0.9473684210526315
# =============================================
# =============== 와인 ================
# 최고모델 : 민맥스 랜더마이즈서치 1.0
# =============================================
# =============== 디짓스 ================
# 최고모델 : 로버스트 할빙그리드서치 0.975
# =============================================
m23_make_pipeline_GridSearch08_diabetes