奇怪的线性回归学习曲线

时间:2020-03-13 15:26:50

标签: python scikit-learn linear-regression

我正在尝试建立公寓价格的预测模型。我使用python scikit-learn工具集。我使用的数据集包含公寓的总建筑面积和位置,已将其转换为虚拟特征。因此,数据集如下所示: enter image description here 然后,我建立一条学习曲线以查看模型的运行情况。 我这样建立学习曲线:

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'))

我看到的图片有些令人困惑: Learning curve on training and cross-validation sets 我在这里看到的异常是:

  1. 交叉验证集上的巨大错误
  2. 由于训练示例数量的增加,错误并没有持续减少。

正常吗?

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

我还尝试添加2次多项式特征。但这并没有使模型执行任何其他操作。而且因为我有很多分类特征(总计106个),所以即使是二阶多项式也要花很长时间。所以我没有尝试更高的学位。

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

更新: 感谢tolik,我做了一些修改:

数据准备: 分类数据是独立的。因此,我无法将它们组合为一个功能。 使用StandardScaler()缩放功能。谢谢你。

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

型号选择: 我尝试了几种不同的模型,但似乎没有一个比LinearRegression更好。有趣的是-所有模型在完整数据集上的表现都较差。可能是因为我按价格排序,而较高的价格却是异常值。因此,当我开始训练1000个样本的样本集并达到最大值时,我得到了这张图片(几乎适用于所有模型): enter image description here

1 个答案:

答案 0 :(得分:0)

我的解释包括三个步骤:数据准备,特征提取和模型选择。

数据准备:

  • 在此数据集中,有许多“分类”和“序数”值。如果 该列有几个不相关的类别,可以将其一键搞定。 但是如果该列具有按如下顺序排序的类别 您可以将“坏”,“正常”,“好”转换为数字 {Good:1,Normal:0.5,Bad:0}。
  • 值范围:每个要素的值范围互不相同,因此最好的做法是沿0:1之间沿其自身对每个要素进行规格化。

特征提取:

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

型号选择: 您真的不知道什么是好的模型,因为没有免费的午餐理论,但是在这个问题中,最好的结果是不使用深度学习的,请使用以下代码:XGBoost-Regressor,Random-Forest-回归器,Ada-Boost。

最重要的是数据准备!