在机器学习领域,选择合适的超参数对于模型性能至关重要。本文将探讨如何通过网格搜索(Grid Search)和交叉验证(Cross-Validation)技术来寻找最优的超参数组合,以提升模型性能。将以随机森林分类器、决策树分类器和KNN分类器为例,展示在不同算法下,调优前后模型性能的对比。
网格搜索是一种穷举搜索技术,通过遍历给定的超参数网格来寻找最优参数组合。而交叉验证则是一种评估模型泛化能力的技术,它将数据集分成多个子集,每个子集轮流作为测试集,其余作为训练集。网格搜索结合交叉验证(GridSearchCV)可以系统地搜索超参数空间,并评估每种参数组合的性能。
首先,以随机森林分类器为例,展示如何使用GridSearchCV进行超参数调优。随机森林是一种集成学习方法,通过构建多个决策树并输出平均结果来提高预测准确性。
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn import metrics
import warnings
warnings.filterwarnings('ignore')
# 加载数据集
df = pd.read_csv('heart.csv')
X = df.drop('target', axis=1)
y = df['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 构建随机森林分类器
rfc = RandomForestClassifier()
# 设置超参数网格
forest_params = [{'max_depth': list(range(10, 15)), 'max_features': list(range(0, 14))}]
# 初始化GridSearchCV对象并进行拟合
clf = GridSearchCV(rfc, forest_params, cv=10, scoring='accuracy')
clf.fit(X_train, y_train)
# 输出最佳超参数和最佳分数
print(clf.best_params_)
print(clf.best_score_)
通过上述代码,可以得到随机森林分类器的最佳超参数组合和对应的最佳性能分数。接下来,将比较调优前后的随机森林分类器在测试集上的性能。
在调优模型后,得到了最佳超参数组合:max_depth=11和max_features=1,最佳性能分数约为0.843。接下来,将比较调优前后的随机森林分类器在测试集上的性能。
# 调优后的随机森林分类器性能报告
print(metrics.classification_report(y_test, clf.predict(X_test)))
# 未调优的随机森林分类器性能报告
rfc.fit(X_train, y_train)
print(metrics.classification_report(y_test, rfc.predict(X_test)))
通过比较,发现调优后的随机森林分类器在测试集上的准确率从81%提高到了85%,显示出调优对于提升模型性能的重要性。
除了随机森林分类器,还对决策树分类器和KNN分类器进行了超参数调优,并比较了调优前后的性能。
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
# 决策树分类器调优
dtc = DecisionTreeClassifier()
tuned_param = [{'max_depth': list(range(10, 15)), 'max_features': list(range(0, 14))}]
clf_dtc = GridSearchCV(dtc, cv=10, param_grid=tuned_param, scoring='accuracy')
clf_dtc.fit(X_train, y_train)
print(clf_dtc.best_params_)
print(clf_dtc.best_score_)
# KNN分类器调优
knn = KNeighborsClassifier()
params = [{'n_neighbors': range(5, 10), 'metric': ['canberra', 'euclidean', 'minkowski']}]
clf_knn = GridSearchCV(knn, cv=10, param_grid=params, scoring='accuracy')
clf_knn.fit(X_train, y_train)
print(clf_knn.best_params_)
print(clf_knn.best_score_)
df_best_scores = pd.DataFrame({
'Estimators': ['Random Forest', 'Decision Tree', 'KNN Classifier'],
'Best Scores': ['{0:.3f}'.format(clf.best_score_), '{0:.3f}'.format(clf_dtc.best_score_), '{0:.3f}'.format(clf_knn.best_score_)]
})
print(df_best_scores)