Python 交叉验证返回分数超过1.0我该怎么办?

Python 交叉验证返回分数超过1.0我该怎么办?,python,scikit-learn,cross-validation,Python,Scikit Learn,Cross Validation,首先,我想说我在发帖前搜索了很多,但没有找到任何关于得分大于1.0(100%)的信息 所以首先我使用GridSearchCV来选择我的模型,但是我没有使用gamma参数,因为GridSearch被卡住了。这是我的密码: from sklearn.svm import SVR from sklearn.model_selection import GridSearchCV svr = SVR() param_grid = {'kernel':['linear','rbf','poly','sig

首先,我想说我在发帖前搜索了很多,但没有找到任何关于得分大于1.0(100%)的信息

所以首先我使用GridSearchCV来选择我的模型,但是我没有使用gamma参数,因为GridSearch被卡住了。这是我的密码:

from sklearn.svm import SVR
from sklearn.model_selection import GridSearchCV

svr = SVR()
param_grid = {'kernel':['linear','rbf','poly','sigmoid'], 'C':[1,5,10,15], 'degree':[3,6,9,12,15]}
gscv = GridSearchCV(svr,param_grid, cv = 6)
gscv.fit(features, ranks)
print(gscv.best_score_)
print(gscv.score(features, ranks)*-1) 
它返回:

-1.02488175821

0.583772756529

然后我使用一个SVC,其中包含从GridSearch返回的最佳参数,并添加gamma和epsilon作为参数。我使用KFold和打印分数,根据MSE、MAE、R^2等不同指标交叉验证新模型,但它们返回的结果非常不同

from sklearn.model_selection import KFold
from sklearn.metrics import mean_squared_error
from sklearn.metrics import median_absolute_error
from sklearn.metrics import r2_score
from sklearn.metrics import explained_variance_score
kf = KFold(n_splits=10)
svr = SVR(kernel = 'rbf', C = 10, epsilon = 0.001, gamma = 0.1)
scores = []
r2 = []
mae = []
mse = []
evs = []
for train_index, test_index in kf.split(ranks):
    x_train, x_test = features.iloc[train_index], features.iloc[test_index]
    y_train, y_test = ranks[train_index], ranks[test_index]
    svr.fit(x_train, y_train)
    predictions = svr.predict(x_test)
    mse.append(mean_squared_error(y_test,predictions))
    r2.append(r2_score(y_test,predictions))
    mae.append(median_absolute_error(y_test,predictions))
    evs.append(explained_variance_score(y_test,predictions))
    scores.append(svr.score(x_test,y_test))
    
print ('Classifier .score : {}'.format(np.asarray(scores).mean()*-1))  
print ('MSE score : {}'.format(np.asarray(mse).mean()))  
print ('R^2 score: {}'.format(np.asarray(r2).mean()*-1))
print ('MAE score: {}'.format(np.asarray(mae).mean()))
print ('EVS score: {}'.format(np.asarray(evs).mean()*-1))
这是打印出来的

分类器.得分:1.0535368037228126

MSE分数:0.0046241979004122

R^2得分:1.0535368037228126

MAE得分:0.033673630575293226

EVS得分:1.0293436224922894

但是如果我把gamma改为0.2,它会打印这个

分类器。得分:0.594539615377264

MSE分数:0.0035847763619656497

R^2得分:0.594539615377264

MAE得分:0.023670574621059648

EVS得分:0.5778668299600922

  • 所以我的问题是我做错了什么
  • 在这种情况下我该怎么办
  • 如何获得高于1.0的分数
  • 为什么有些分数是0.02(我找不到最高的 对于这种评分方法,但在sklearn文档中我看到了 示例中有0.8个参数)

  • 3:实际上R2不应该大于1,但你的分数高于1,因为你乘以(-1)。 绝对没有理由R2不应该是负数。 您可以在文档中查看r2_分数: 这只是意味着你的模型不太好用

    4:如果我没有错的话,MSE和MAE是你应该用于回归的指标。用它们来分类是不自然的。我认为你应该坚持R2 如果需要更多指示器,可以尝试以下方法:

    from sklearn.metrics import classification_report
    
    y_true, y_pred = y_test, clf.predict(X_test)
    print(classification_report(y_true, y_pred))
    
    另外,请注意:svr.score将自动计算R2,因此您不需要使用metrics.R2\u score

    2:也许你应该尝试不同的模型,比如随机森林,XGBoost,额外的树,KNN


    希望这对你有帮助!好运

    SVR是一种回归,所以MSE和MAE应该是相关的,但他们的分数意味着什么?而-1不是有或没有的情况,是相同的,但在其中一个情况下,它是与-我的坏,我以为你在做一个分类。MAE:平均绝对误差,MSE:均方误差。越接近0越好,但0.003并不意味着“好”。这将取决于目标变量的规模。您可能需要规范化您的目标变量,使其得分介于1和0之间。实际上,我的目标值介于0和0.4之间。然后,使用gamma=0.2构建的上一个变量看起来并没有那么糟糕!精确地说:R2=1——一个正数量,所以从数学上讲,它不可能大于1。但事实上,如果你把你的分数(-1,05)乘以-1,它将大于1。此外,您可能希望仅使用gamma参数重新执行参数栅格。最后一件事:如果你做回归,你不应该把一个指标叫做“分类器得分”