GridSearchCV不包含原始数据(如果包含原始数据,那将是荒谬的)。它包括的唯一数据是它自己的簿记,即每个CV折页尝试的详细得分和参数。在
best_estimator_返回的是该模型适用于遇到的任何新数据所需要的唯一的事,但如果像你说的,你想在细节上深入挖掘,充分结果在其返回
cv_results_属性。
使用您自己的网格将示例从文档改编为knn分类器
knn_parameters(但是删除
n_jobs,这只会影响拟合速度,并且不是算法的真正超参数),
cv=3为简单起见,我们拥有:
from sklearn.neighbors import KNeighborsClassifierfrom sklearn.datasets import load_irisfrom sklearn.model_selection import GridSearchCVimport pandas as pdiris = load_iris()knn_parameters = [{ 'n_neighbors': [1,3,5,7, 9, 11], 'leaf_size': [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60], 'algorithm': ['auto', 'ball_tree', 'kd_tree', 'brute'], 'weights': ['uniform', 'distance']}]knn_classifier = KNeighborsClassifier()clf = GridSearchCV(estimator = knn_classifier, param_grid = knn_parameters, scoring = 'accuracy', n_jobs=-1, cv=3)clf.fit(iris.data, iris.target)clf.best_estimator_# result:KNeighborsClassifier(algorithm='auto', leaf_size=5, metric='minkowski', metric_params=None, n_jobs=None, n_neighbors=5, p=2, weights='uniform')因此,如上所述,最后的结果告诉您将算法应用于任何新数据(验证,测试,来自部署等)的所有知识。此外,您可能会发现,实际上除去
n_jobs从进入
knn_parameters电网和要求,而不是用于
n_jobs=-1在
GridSearchCV一个对象中的结果
多 快CV过程。不过,如果您想使用
n_jobs=-1最终模型,则可以轻松地操纵
best_estimator_来做到这一点:
clf.best_estimator_.n_jobs = -1clf.best_estimator_# resultKNeighborsClassifier(algorithm='auto', leaf_size=5, metric='minkowski', metric_params=None, n_jobs=-1, n_neighbors=5, p=2, weights='uniform')
这实际上回答了您的第二个问题,因为您也可以类似地操纵
best_estimator_来更改其他超参数。
因此,找到最好的模型是大多数人停止的地方。但是,如果出于某种原因想要进一步深入了解整个网格搜索过程的详细信息,则将在
cv_results_属性中返回详细结果,甚至可以将其导入到pandas数据框中以方便检查:
cv_results = pd.Dataframe.from_dict(clf.cv_results_)
例如,
cv_results数据框包括一列
rank_test_score,顾名思义,该列包含每个参数组合的等级:
cv_results['rank_test_score']# result:0 4811 4812 1453 1454 1 ... 571 1572 145573 145574 433575 1Name: rank_test_score, Length: 576, dtype: int32
这里的
1意思是最好的,您可以很容易地看到有不止一种组合被排名为
1-因此,实际上,我们这里有不止一种“最佳”模型(即参数组合)!尽管在这里这很可能是由于所用虹膜数据集的相对简单性,但原则上也没有理由在实际情况下也不会发生这种情况。在这种情况下,返回
best_estimator_的只是这些情况中的第一个-
这里是组合编号4:
cv_results.iloc[4]# result:mean_fit_time 0.000669559std_fit_time 1.55811e-05mean_score_time 0.00474652std_score_time 0.000488042param_algorithm autoparam_leaf_size 5param_n_neighbors 5param_weights uniformparams {'algorithm': 'auto', 'leaf_size': 5, 'n_neigh...split0_test_score 0.98split1_test_score 0.98split2_test_score 0.98mean_test_score 0.98std_test_score0rank_test_score 1Name: 4, dtype: object您可以轻松地看到与我们
best_estimator_上面的参数相同的参数。但是现在您可以通过以下方法检查所有“最佳”模型:
cv_results.loc[cv_results['rank_test_score']==1]
就我而言,这将导致不少于144个模型(在
6*12*4*2 =576尝试的所有模型中)!因此,您实际上可以在更多选择中进行选择,甚至可以使用其他附加条件,例如返回分数的标准偏差(越小越好,尽管此处的最小值为0),而不是仅仅依赖于最大平均分数,这是自动过程将返回的分数。
希望这些足以让您入门…



