【问题标题】:Weird linear regression learning curve奇怪的线性回归学习曲线
【发布时间】:2020-06-25 15:06:05
【问题描述】:

我正在尝试建立一个公寓价格预测模型。我使用 python scikit-learn 工具集。我正在使用一个包含公寓总建筑面积和位置的数据集,我已将其转换为虚拟特征。所以数据集看起来像这样: 然后我建立一个学习曲线来看看模型是如何做的。 我这样构建学习曲线:

from matplotlib import pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import learning_curve

model = LinearRegression()
training_sizes, training_scores, validation_scores = learning_curve(
    estimator = model,
    X = X_train,
    y = y_train,
    train_sizes = np.linspace(5, len(X_train) * 0.8, dtype = int), 
    cv = 5
)
line1, line2 = plt.plot(
    training_sizes, training_scores.mean(axis = 1), 'g', 
    training_sizes, validation_scores.mean(axis = 1), 'r')
plt.legend((line1, line2), ('Training', 'Cross-validation'))

我看到的图片有些混乱: 我在这里看到的异常是:

  1. 交叉验证集出现巨大错误
  2. 训练示例数量增长时错误不会稳步减少。

正常吗?

仅训练集的学习曲线也不是那么平滑,但至少误差不是那么大:

我还尝试添加以添加二次多项式特征。但这并没有使模型的表现有任何不同。而且因为我有很多分类特征(总共 106 个),即使是二次多项式也需要很长时间。所以我没有尝试更高的学位。

我还尝试使用 Octave 尽可能简单的成本函数和梯度下降来构建模型。奇怪错误的结果是一样的。

更新: 感谢tolik我做了几处修改:

数据准备: 分类数据是独立的。所以我不能将它们组合成一个功能。 使用 StandardScaler() 缩放特征。谢谢你。

特征提取: 在使用 PCA 进行特征转换后,我发现一个新特征可以解释超过 99% 的方差比。虽然很奇怪我只用了这个。这也允许增加多项式次数,尽管它没有提高性能。

型号选择: 我尝试了几种不同的模型,但似乎没有一个比线性回归更好。有趣的事情——所有模型在完整数据集上的表现都更差。可能是因为我按价格排序,而更高的价格是相当离群的。因此,当我开始在 1000 个样本上训练集并达到最大值时,我得到了这张图片(几乎适用于所有模型):

【问题讨论】:

  • 您使用什么语言或程序?我建议编辑您的问题以添加相应的标签。
  • 我想你也应该添加learning_curve的代码。
  • 你得到的错误非常大 (10^21) 和负数。也许learning_curve 中的成本函数有问题。如果只绘制训练数据的误差,会得到什么?
  • 我相信成本函数是均方误差,但对交叉验证集取负值是为了使图形更具视觉吸引力。
  • 一种猜测:当您将位置转换为虚拟位置时,您可能需要从回归中删除一个位置虚拟位置。否则,虚拟矩阵 + 常数列(截距)将是奇异的。在实践中,这会导致数值不稳定和可能的巨大系数。在样本外应用时,这可能会导致令人惊讶的错误项。

标签: python scikit-learn linear-regression


【解决方案1】:

我的解释分为三个步骤:数据准备、特征提取和模型选择。

数据准备:

  • 在这个数据集中有很多分类和有序值。如果 该专栏有几个不相关的类别,可以单选它。 但是如果该列的类别具有类似的顺序 "bad","normal","good" 您可以将其转换为数值为 {好:1,正常:0.5,坏:0}。
  • 值范围:每个特征的值范围彼此不同,因此最好的做法是在 0:1 之间对每个特征进行归一化。

特征提取:

  • 您的目标是最大化分数,所以我猜您并不关心哪个功能更重要。使用 PCA(在 scikit-learn 库中有一个实现),该算法将您的特征向量转换为不同的特征,每个特征都是其他特征的线性组合。这些新特征按其解释的方差排序。第一个特征比最后一个特征更好地描述了数据。您选择他们的explained_variance_ 总和为 99% 的第一个特征。现在您的功能更轻了。

型号选择: 你真的不知道什么是好的模型,因为 No Free Lunch Theory 但在这个问题中最好的结果是不使用深度学习,使用这些:XGBoost-Regressor、Random-Forest-回归器,Ada-Boost。

最重要的是数据准备!!!

【讨论】:

  • 可能只是附加问题。首先,我在训练集中缩放特征,然后对它们进行 PCA 并选择第一个 x 转换特征来训练模型。那么我如何预测单个数据样本的目标变量?我又要先从这个样本中扩展特征并进行 PCA 转换了吗?
  • 您应该根据拟合的 PCA 对象转换测试数据。首先你 fit_transform() 训练中的 PCA 并删除最不重要的向量,然后你 transform() 测试中的 PCA 并删除相同的向量。现在你可以预测你的测试了。
  • 是的。只是首先我训练了一个模型并将其转储到文件中以供以后使用。并且要预测的数据集加载在不同的流中,并且大多是一个接一个。那么正确的方法是每次在运行预测之前训练模型吗?
  • 您可以腌制已安装的 PCA 变压器,还可以写入文件(或以某种方式记住)您用于拟合模型的特征数量。要进行预测,您必须加载腌制 pca、transform() 测试并切片模型预测所需的特征数量。
猜你喜欢
  • 1970-01-01
  • 2015-08-13
  • 2018-01-26
  • 2019-05-05
  • 2019-08-01
  • 2019-05-04
  • 2014-03-16
  • 2019-04-17
  • 2011-01-21
相关资源
最近更新 更多