【发布时间】: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'))
- 交叉验证集出现巨大错误
- 训练示例数量增长时错误不会稳步减少。
正常吗?
我还尝试添加以添加二次多项式特征。但这并没有使模型的表现有任何不同。而且因为我有很多分类特征(总共 106 个),即使是二次多项式也需要很长时间。所以我没有尝试更高的学位。
我还尝试使用 Octave 尽可能简单的成本函数和梯度下降来构建模型。奇怪错误的结果是一样的。
更新: 感谢tolik我做了几处修改:
数据准备: 分类数据是独立的。所以我不能将它们组合成一个功能。 使用 StandardScaler() 缩放特征。谢谢你。
特征提取: 在使用 PCA 进行特征转换后,我发现一个新特征可以解释超过 99% 的方差比。虽然很奇怪我只用了这个。这也允许增加多项式次数,尽管它没有提高性能。
型号选择: 我尝试了几种不同的模型,但似乎没有一个比线性回归更好。有趣的事情——所有模型在完整数据集上的表现都更差。可能是因为我按价格排序,而更高的价格是相当离群的。因此,当我开始在 1000 个样本上训练集并达到最大值时,我得到了这张图片(几乎适用于所有模型):
【问题讨论】:
-
您使用什么语言或程序?我建议编辑您的问题以添加相应的标签。
-
我想你也应该添加
learning_curve的代码。 -
你得到的错误非常大 (10^21) 和负数。也许
learning_curve中的成本函数有问题。如果只绘制训练数据的误差,会得到什么? -
我相信成本函数是均方误差,但对交叉验证集取负值是为了使图形更具视觉吸引力。
-
一种猜测:当您将位置转换为虚拟位置时,您可能需要从回归中删除一个位置虚拟位置。否则,虚拟矩阵 + 常数列(截距)将是奇异的。在实践中,这会导致数值不稳定和可能的巨大系数。在样本外应用时,这可能会导致令人惊讶的错误项。
标签: python scikit-learn linear-regression