最近我一直在学习机器学习的一些核心概念,并使用Sklearn库编写代码。经过一些基本练习后,我尝试使用来自kaggle的AirBnb纽约数据集(约有40000个样本)进行练习 – https://www.kaggle.com/dgomonov/new-york-city-airbnb-open-data#New_York_City_.png
我试图建立一个模型,能够根据数据集中的各种特征预测房间/公寓的价格。我意识到这是一个回归问题,并使用这个sklearn备忘单开始尝试各种回归模型。
我使用sklearn.linear_model.Ridge作为我的基准模型,并在进行了一些基本的数据清理后,我的测试集上的R^2得分为0.12,非常糟糕。然后我想,可能是线性模型过于简单,所以我尝试了适用于回归的“核技巧”方法(sklearn.kernel_ridge.Kernel_Ridge),但它们需要很长时间才能拟合(超过1小时)!为了解决这个问题,我使用了sklearn.kernel_approximation.Nystroem函数来近似核映射,在训练前对特征进行变换,然后使用一个简单的线性回归模型。然而,即使这样,如果我增加n_components参数以获得任何有意义的准确性提升,也需要很长时间来变换和拟合。
所以我在想,当你想对一个巨大的数据集进行回归时会发生什么?核技巧在计算上非常昂贵,而线性回归模型又过于简单,因为现实数据很少是线性的。那么神经网络是唯一的答案吗,还是我错过了某种巧妙的解决方案?
附注:我是刚开始使用Overflow的,请告诉我如何改进我的问题!
回答:
这是一个很好的问题,但就像通常的情况一样,复杂问题没有简单的答案。回归并不像通常展示的那样简单。它涉及许多假设,并不限于线性最小二乘模型。完全理解它需要几门大学课程。下面我将写一个关于回归的简短(且远非完整)的备忘录:
- 没有什么能替代适当的分析。这可能涉及专家访谈以了解数据集的限制。
- 你的模型(任何模型,不限于回归)仅与你的特征一样好。如果房价依赖于当地税率或学校评级,即使是完美的模型在没有这些特征的情况下也表现不佳。
- 有些特征由于设计原因无法包含在模型中,所以永远不要在现实世界中期待完美的得分。例如,实际上不可能考虑到杂货店、餐馆、俱乐部等的访问性。许多这些特征也是移动的目标,因为它们随时间变化。即使0.12的R2可能很好,如果人类专家表现更差的话。
- 模型有其假设。线性回归期望因变量(价格)与自变量(例如,物业大小)呈线性关系。通过探索残差,你可以观察到一些非线性特征,并用非线性特征来覆盖它们。然而,一些模式很难发现,但仍可以通过其他模型解决,如非参数回归和神经网络。
那么,为什么人们仍然使用(线性)回归?
- 它是最简单和最快的模型。对于实时系统和统计分析有许多含义,所以这很重要
- 通常它被用作基准模型。在尝试复杂的神经网络架构之前,了解与简单方法相比我们改善了多少是有帮助的。
- 有时回归被用来测试某些假设,例如,效果和变量之间的线性关系
总之,回归在大多数情况下绝对不是最终工具,但这通常是首先尝试的最便宜的解决方案
更新,为了说明关于非线性的观点。
构建回归后,你计算残差,即回归误差predicted_value - true_value
。然后,对于每个特征,你制作一个散点图,水平轴是特征值,垂直轴是误差值。理想情况下,残差具有正态分布,并且不依赖于特征值。基本上,误差更常见的是小的而不是大的,并且在整个图中相似。
这应该是它的样子:
这仍然是正常的 – 它只反映了你的样本密度的差异,但误差具有相同的分布:
这是一个非线性示例(一个周期性模式,添加sin(x+b)作为特征):
另一个非线性示例(添加平方特征应该有帮助):
上述两个例子可以描述为残差均值随特征值不同而不同。其它问题包括但不限于:
- 残差方差随特征值不同而不同
- 残差的非正态分布(误差要么是+1要么是-1,聚类等)
上面的部分图片取自这里:
http://www.contrib.andrew.cmu.edu/~achoulde/94842/homework/regression_diagnostics.html
这对于初学者来说是关于回归诊断的很好的阅读材料。