输入数据X_train的维度为(477 x 200), y_train的长度为477。我想使用支持向量机回归器,我正在做网格搜索。
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'
吗?
GridSearchCV将根据遗漏的数据给您评分。这就是交叉验证的基本原理。当你在完整的训练集上训练和评估时你所做的就是无法进行交叉验证;你会得到一个过于乐观的结果。对于线性内核(7.4 vs 7.76),您可以略微看到这一点,对于更灵活的RBF内核(5.9 vs 8),这一点更为夸张。我希望GridSearchCV已经正确地识别出更灵活的模型也不能泛化。
您应该能够通过使用特定的估计器(regressor_opt和regressor_2)并使用sklearn的cross_validate()来获得省略折叠的结果,从而更清楚地看到这种效果。我预计您会看到,regressor_2的表现要比您的乐观值5.9差得多。你会发现这是一个有益的练习。
记住,你想要的是一个在新数据上表现最好的模型,而不是一个任意适合你的训练数据的模型。
我建议对这个问题的进一步讨论不属于stackoverflow,而是属于交叉验证。