from hyperopt import fmin, tpe, hp
import hyperopt.pyll.stochastic
import numpy as np
from sklearn.datasets import load_digits
import matplotlib.pyplot as plt
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.preprocessing import StandardScaler # 类别标签编码,标准化处理
from sklearn.svm import SVC
from sklearn.decomposition import PCA # 主成分分析
best = fmin(
fn=lambda x: -np.sin(x) / x,
space=hp.uniform('x', -20, 20),
algo=tpe.suggest,
max_evals=100)
print(best)
digits = load_digits()
X, y =digits.data, digits.target
print(digits.images[0])
fig = plt.figure(figsize=(12, 8))
fig.subplots_adjust(left=0, right=1, bottom=0, top=1, hspace=0.05, wspace=0.05)
for i in range(24):
ax = fig.add_subplot(4, 6, i + 1, xticks=[], yticks=[])
ax.imshow(digits.images[i])
plt.show()
params_space_svc = {'C': hp.uniform('C', 0, 100),
'kernel': hp.choice('kernel', ['poly', 'rbf']),
'gamma': hp.loguniform('gamma', np.log(0.001), np.log(0.1))} # hp.uniform('gamma', 0.001, 0.1)
print(hyperopt.pyll.stochastic.sample(params_space_svc))
pipe_svc = make_pipeline(StandardScaler(), PCA(n_components=20), SVC())
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=0, shuffle=True, stratify=y)
count = 0 # 每一次参数组合的枚举次数
cv_scores = []
def hyperopt_train_val(args):
clf = SVC(**args)
score = cross_val_score(clf, X_train, y_train, cv=5).mean()
cv_scores.append(score)
global count
count = count + 1
print("[%d], %s, Validate ACC: %.5f" % (count, args, score))
return -score
# max_evals指定枚举次数上限,返回目前搜索到的最优解,不一定全局最优
best = fmin(hyperopt_train_val, params_space_svc, algo=tpe.suggest, max_evals=100)
kernel_list = ['rbf', 'poly']
best["kernel"] = kernel_list[best["kernel"]]
print('best params: ', best)
clf = SVC(**best) # 根据最佳参数对测试数据进行预测
clf.fit(X_train, y_train)
print("The best params of svc, test scores = %.5f" % clf.score(X_test, y_test))
plt.figure(figsize=(8, 6))
plt.plot(cv_scores, 'ko--', markersize=5, markeredgecolor="r")
plt.xlabel("eval times", fontsize=12)
plt.ylabel("scores", fontsize=12)
plt.grid(ls=":")
plt.title("Super parameter tuning of SVM by Hyperopt", fontsize=14)
plt.show()
机器学习:调参与最终模型hyperopt(Python)
最新推荐文章于 2024-05-07 17:28:45 发布