回归中的 scikit-learn 交叉验证分数

Posted

技术标签:

【中文标题】回归中的 scikit-learn 交叉验证分数【英文标题】:scikit-learn cross validation score in regression 【发布时间】:2018-04-02 15:12:06 【问题描述】:

我正在尝试建立一个回归模型,对其进行验证和测试,并确保它不会过度拟合数据。到目前为止,这是我的代码:

from pandas import read_csv
from sklearn.neural_network import MLPRegressor
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split, cross_val_score, validation_curve
import numpy as np
import matplotlib.pyplot as plt

data = np.array(read_csv('timeseries_8_2.csv', index_col=0))

inputs = data[:, :8]
targets = data[:, 8:]

x_train, x_test, y_train, y_test = train_test_split(
    inputs, targets, test_size=0.1, random_state=2)

rate1 = 0.005
rate2 = 0.1

mlpr = MLPRegressor(hidden_layer_sizes=(12,10), max_iter=700, learning_rate_init=rate1)

# trained = mlpr.fit(x_train, y_train)  # should I fit before cross val?
# predicted = mlpr.predict(x_test)      

scores = cross_val_score(mlpr, inputs, targets, cv=5)
print(scores)

Scores 打印一个由 5 个数字组成的数组,其中第一个数字通常在 0.91 左右,并且始终是数组中的最大数字。 我很难弄清楚如何处理这些数字。那么如果第一个数字是最大的数字,那么这是否意味着在第一次交叉验证尝试中,模型得分最高,然后随着它不断尝试交叉验证而得分下降?

另外,在调用交叉验证函数之前,我是否应该对数据进行拟合?我试着评论它,它给了我或多或少相同的结果。

【问题讨论】:

请了解交叉验证的实际作用。从looking here 开始。在这种情况下,它将不适合您以后使用的模型。它只是为您提供有关模型如何处理数据的信息。一旦您对性能感到满意,就需要对整个数据进行拟合。 你可能想看看TimeSeriesSplit 【参考方案1】:

交叉验证功能将模型拟合作为操作的一部分执行,因此手动执行此操作一无所获:

以下示例演示了如何通过拆分数据、拟合模型并连续计算 5 次(每次拆分不同)来估计线性核支持向量机在 iris 数据集上的准确度:

http://scikit-learn.org/stable/modules/cross_validation.html#computing-cross-validated-metrics

是的,返回的数字反映了多次运行:

返回:每次交叉验证运行的估计器得分数组。

http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.cross_val_score.html#sklearn.model_selection.cross_val_score

最后,没有理由期望第一个结果最大:

from sklearn.model_selection import cross_val_score
from sklearn import datasets
from sklearn.neural_network import MLPRegressor
boston = datasets.load_boston()
est = MLPRegressor(hidden_layer_sizes=(120,100), max_iter=700, learning_rate_init=0.0001)
cross_val_score(est, boston.data, boston.target, cv=5)

# Output
array([-0.5611023 , -0.48681641, -0.23720267, -0.19525727, -4.23935449])

【讨论】:

好的,那么你现在得到分数后知道了哪些有价值的信息呢?我不明白它们为什么有用。 虹膜数据集的分类任务会更合适,因为很明显 OP 缺乏关于 CV 的基本知识(并且您提供的分数可能会让人感到困惑) @desertnaut 同意;更新了一些更明智的东西。 swailem95:分数允许您量化模型的表现(例如,当必须在模型之间进行选择时,这变得相关); scikit-learn.org/stable/modules/model_evaluation.html 包含有关该主题的大量信息。 所以如果(在我的情况下)第一个分数是最高的,这是否意味着模型应该只交叉验证一次?另外,我如何查看训练错误以将其与验证错误进行比较? 如果情况确实如此,那么这表明训练/测试拆分不是随机的。如果您使用cv=sklearn.model_selection.KFold(5, shuffle=True)(参见scikit-learn.org/stable/modules/generated/…),也会发生同样的事情吗?关于修改分数,您甚至可以提供自定义计分器;见scikit-learn.org/stable/modules/…

以上是关于回归中的 scikit-learn 交叉验证分数的主要内容,如果未能解决你的问题,请参考以下文章

Scikit-learn 交叉验证分数:数组索引过多

如何在 scikit-learn 中计算正确的交叉验证分数?

评估 scikit-learn GridSearchCV 中交叉验证分数的平均值、标准差

R 与 scikit-learn 中用于线性回归 R2 的交叉验证

线性回归中的交叉验证

获取每个交叉验证折叠的混淆矩阵