Python GridSearchCV拟合后是否返回最佳估计值?
假设我们使用GridSearch调整SVM,如下所示:Python GridSearchCV拟合后是否返回最佳估计值?,python,scikit-learn,cross-validation,k-fold,Python,Scikit Learn,Cross Validation,K Fold,假设我们使用GridSearch调整SVM,如下所示: 算法=SVM() 参数={'kernel':['rbf','sigmoid'],'C':[0.1,1,10]} grid=GridSearchCV(算法、参数) 网格拟合(X,y) 然后,您希望在交叉值得分中使用最佳拟合参数/估计器。我的问题是,此时哪个模型是网格?这是表现最好的吗?换句话说,我们能做到吗 cross_val_分数=cross_val_分数(网格,X=X,y=y) 或者我们应该使用 cross_val_分数=cross_
算法=SVM()
参数={'kernel':['rbf','sigmoid'],'C':[0.1,1,10]}
grid=GridSearchCV(算法、参数)
网格拟合(X,y)
然后,您希望在交叉值得分中使用最佳拟合参数/估计器。我的问题是,此时哪个模型是网格?这是表现最好的吗?换句话说,我们能做到吗
cross_val_分数=cross_val_分数(网格,X=X,y=y)
或者我们应该使用
cross_val_分数=cross_val_分数(grid.best_估计器,X=X,y=y)
当我同时运行这两个程序时,我发现它们返回的分数并不相同,因此我很好奇这里的正确方法是什么。(我假设使用
最佳估计值
)这又提出了另一个问题,即:仅仅使用网格
作为模型使用什么?第一个?在安装GridSearchCV
后,您不需要交叉评分。它已经具有允许您访问交叉验证分数的属性<代码>cv_结果
为您提供所有信息。如果只想查看特定估计器的结果,可以使用best_index
属性对此进行索引
cv_results = pd.DataFrame(grid.cv_results_)
cv_results.iloc[grid.best_index_]
mean_fit_time 0.00046916
std_fit_time 1.3785e-05
mean_score_time 0.000251055
std_score_time 1.19038e-05
param_C 10
param_kernel rbf
params {'C': 10, 'kernel': 'rbf'}
split0_test_score 0.966667
split1_test_score 1
split2_test_score 0.966667
split3_test_score 0.966667
split4_test_score 1
mean_test_score 0.98
std_test_score 0.0163299
rank_test_score 1
Name: 5, dtype: object
在拟合的
GridSearchCV
上调用的大多数方法都使用最佳模型(grid.predict(…)
获取最佳模型的预测)。对于估计器
,情况并非如此。你所看到的差异可能来自于此cross_val_score
再次拟合,但这次根据grid.estimator
进行评分,但不是grid.best_estimator
所以,为了确保我得到了正确的答案:GridSearch将测试所有拆分上的所有参数?假设有四个参数组合,k=5,那么对于每个分割,所有四个组合都会被测试?比较所有5次拆分的平均结果,并返回最佳结果。在您的示例中,split0。。。split4只是最佳模型的分割结果?这是否也意味着超参数在分割之间可能不同?对于所有这些问题,我很抱歉,但文档非常简短。@BramVanroy对于您的第一个问题,是的。对于每个参数组合(kernel=rbf,C=0.1;kernel=rbf,C=1,…,kernel=sigmoid,C=10),默认情况下将进行5倍交叉验证。在我的示例中,对于6个参数组合中的一个(对于最佳组合),您可以看到5次拆分的结果。它特定于找到的最佳参数组合(C=10,kernel=rbf)。这5个分割的超参数是相同的。谢谢你的澄清。关于最后一点:它们总是一样的吗?我这样问是因为属性best_params_uu
会让我怀疑,对于所有拆分,总是使用相同的超参数。在哪里使用?其过程如下:对于kernel:rbf,C:0.1进行5倍交叉验证,保存结果(所有5次分割上此特定参数组合的分数)。接下来,对于kernel:rbf,C:1进行5倍交叉验证并保存结果。对所有人重复以上步骤,然后选择最好的。其他参数的结果仍然可用(5个其他参数组合*5倍),但如果调用grid.predict()
它将使用给出最佳平均分数的结果。