网格搜索和超参数优化在机器学习中的应用

机器学习领域,选择合适的超参数对于模型性能至关重要。本文将探讨如何通过网格搜索(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)
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485