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

标签 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','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

然后我使用具有从 GridSearch 返回的最佳参数的 SVC,添加 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))

打印出来

Classifier .score : 1.0535368037228126

MSE score : 0.004624197990041222

R^2 score: 1.0535368037228126

MAE score: 0.033673630575293226

EVS score: 1.0293436224922894

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

Classifier .score : 0.5945396153777264

MSE score : 0.0035847763619656497

R^2 score: 0.5945396153777264

MAE score: 0.023670574621059648

EVS score: 0.5778668299600922

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

最佳答案

3 :确实 R2 不应该 >1,但你的分数高于 1,因为你乘以 (-1)。 绝对没有理由 R2 不应该是负数。 您可以查看 r2_score 的文档: http://scikit-learn.org/stable/modules/generated/sklearn.metrics.r2_score.html 这只是意味着您的模型效果不佳...

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_score。

2:也许你应该尝试不同的模型,如随机森林、XGBoost、Extra trees、KNN...

希望对您有所帮助!祝你好运

关于python - 交叉验证返回分数超过 1.0 我该怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40704813/

相关文章:

python - Google Cloud ML-engine scikit-learn 预测概率 'predict_proba()'

Pandas + Scikit 学习 : issue with stratified k-fold

python - keras/scikit-学习 : using fit_generator() with cross validation

python - 如何使用新的数据集 API 在 tensorflow 中仅循环使用占位符提供的数据一次

python - 在有越位规则的语言中,所有语言结构都可以是一流的吗?

Python3 beautifulsoup模块 'NoneType'错误

python - SQLAlchemy 查询不返回所有大文本字段

python - 值错误: Invalid parameter solver for estimator LogisticRegression

python - Sklearn 算法列表

python - 具有单独训练集和验证集的 GridSearchCV 错误地还考虑了最终选择最佳模型的训练结果