sklearn GridSearchCV 给出了有问题的结果

Posted

技术标签:

【中文标题】sklearn GridSearchCV 给出了有问题的结果【英文标题】:sklearn GridSearchCV gives questionable results 【发布时间】:2021-05-30 22:45:57 【问题描述】:

我有尺寸为 (477 x 200) 的输入数据 X_train 和长度为 477 的 y_train。 我想使用支持向量机回归器,并且正在做网格搜索。

param_grid = 'kernel': ['poly', 'rbf', 'linear','sigmoid'], 'degree': [2,3,4,5], 'C':[0.01,0.1,0.3,0.5,0.7,1,1.5,2,5,10]
grid = GridSearchCV(estimator=regressor_2, param_grid=param_grid, scoring='neg_root_mean_squared_error', n_jobs=1, cv=3, verbose = 1)
grid_result = grid.fit(X_train, y_train))

我得到grid_result.best_params_ 'C': 0.3, 'degree': 2, 'kernel': 'linear' 的分数为-7.76。而'C': 10, 'degree': 2, 'kernel': 'rbf' 给出了 mit -8.0。

但是,当我这样做时

regressor_opt = SVR(kernel='linear', 'degree'=2, C=0.3)
regressor_opt.fit(X_train,y_train)

y_train_pred = regressor_opt.predict(X_train)
print("rmse=",np.sqrt(sum(y_train-y_train_pred)**2)/np.shape(y_train_pred)))

我得到 7.4 并且当我这样做时

regressor_2 = SVR(kernel='rbf', 'degree'=2, C=10)
regressor_2.fit(X_train,y_train)
    
y_train_pred = regressor_2.predict(X_train)
print("rmse=",np.sqrt(sum(y_train-y_train_pred)**2)/np.shape(y_train_pred)))

我得到 5.9。这显然比 7.4 好,但在网格搜索中,我为该参数组合得到的负 rmse 为 -8,因此比 7.4 差。 有人可以向我解释发生了什么吗?我不应该使用scoring='neg_root_mean_square_error'吗?

【问题讨论】:

【参考方案1】:

GridSearchCV 将根据遗漏的数据为您提供分数。这基本上就是交叉验证的工作原理。当你在整个训练集上进行训练和评估时,你正在做的事情是没有进行交叉验证;你会得到一个过于乐观的结果。对于线性内核(7.4 对 7.76),您会稍微看到这一点,而对于更灵活的 RBF 内核(5.9 对 8),这一点会更加夸张。 GridSearchCV 已经确定,我正确地认为,您更灵活的模型也不能泛化。

您应该能够通过使用您的特定估算器(regressor_opt 和 regressor_2)并使用 sklearn 的cross_validate() 来获得遗漏折叠的结果,从而更清楚地看到这种效果。我希望您会看到 regressor_2 的表现比您乐观的 5.9 值差很多。您可能会发现这是一项内容丰富的练习。

请记住,您需要一个在新数据上表现最佳的模型,而不是一个任意适合您的训练数据的模型。

我建议对此的进一步讨论不属于***,而是在crossvalidated。

【讨论】:

以上是关于sklearn GridSearchCV 给出了有问题的结果的主要内容,如果未能解决你的问题,请参考以下文章

GridSearchCV(sklearn)中的多个估计器

GridsearchCV sklearn 中的错误

你能从 sklearn 网格搜索 (GridSearchCV) 中获得所有估计器吗?

无法使用 sklearn 的 GridSearchCV 运行 tflearn

sklearn 中关于 GridSearchCV 的说明

GridSearchCV/RandomizedSearchCV 与 sklearn 中的 partial_fit