【问题标题】:Scikit learn: measure of goodness of fit, better splitting the dataset or use all of it?Scikit learn:拟合优度的度量,更好地分割数据集还是全部使用?
【发布时间】:2018-02-09 06:04:22
【问题描述】:

here 中汲取灵感。

我的问题

所以我有一个包含 3 个特征和 n 个观察值的数据集。我也有n个回复。基本上我想看看这个模型是否合适。

根据上述问题,人们为此目的使用 R^2。但我不确定我是否理解..

我可以只拟合模型然后计算均方误差吗? 我应该使用训练/测试拆分吗?

所有这些似乎都有共同的预测,但在这里我只是想看看它在拟合方面有多好。

例如这是我的想法

import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model

diabetes = datasets.load_diabetes()
#my idea
regr = linear_model.LinearRegression()
regr.fit(diabetes_X, diabetes.target)
print(np.mean((regr.predict(diabetes_X)-diabetes.target)**2))

但是我经常看到人们做这样的事情

diabetes_X = diabetes.data[:, np.newaxis, 2]
# split X
diabetes_X_train = diabetes_X[:-20]
diabetes_X_test = diabetes_X[-20:]
# split y
diabetes_y_train = diabetes.target[:-20]
diabetes_y_test = diabetes.target[-20:]
# instantiate and fit
regr = linear_model.LinearRegression()
regr.fit(diabetes_X_train, diabetes_y_train)
# MSE but based on the prediction on test 
print('Mean squared error: %.2f' % np.mean((regr.predict(diabetes_X_test)-diabetes_y_test)**2))

在第一种情况下,我们得到:3890.4565854612724,而在第二种情况下,我们得到 2548.07。哪个最正确?

重要提示:我希望它在多重回归中工作,这只是一个 MWE!

【问题讨论】:

    标签: python numpy scipy scikit-learn linear-regression


    【解决方案1】:

    我可以只拟合模型然后计算均方误差吗?我应该使用训练/测试拆分吗?

    不,您将面临overfitting 模型的风险。这就是将数据拆分为训练和测试(甚至是验证数据集)的原因。因此,该模型不仅“记住”它所看到的内容,而且还学会了在更新的、未见过的样本上执行。

    【讨论】:

      【解决方案2】:

      始终首选在训练期间未观察到的一组新数据上评估模型的性能。如果您要优化超参数或在多个模型中进行选择,额外的验证数据是正确的选择。

      但是,有时数据稀缺,从训练过程中完全删除数据是令人望而却步的。在这些情况下,我强烈建议您使用更有效的方法来验证您的模型,例如 k 折交叉验证(请参阅 scikit-learn 中的 KFold 和 StratifiedKFold)。

      最后,最好确保您的分区在训练集和测试集中的行为方式相似。我建议您在目标空间上对数据进行统一采样,这样您就可以确保使用相同的目标值分布来训练/验证您的模型。

      【讨论】:

        猜你喜欢
        • 2017-11-06
        • 2015-03-03
        • 2017-06-30
        • 2016-04-22
        • 2018-04-09
        • 2016-11-26
        • 2016-07-13
        • 2017-04-19
        • 2016-09-15
        相关资源
        最近更新 更多