在回归分析中,我们主要使用回归分析方法做预测,虽然使用Excel和python两个工具来做,但是结果的拟合度都是在0.74附近,都不是很理想,这次我们来使用K近邻回归算法来预测一下。
很多人有疑问,k近邻算法不是分类算法吗?是分类算法不假,也可以做回归算法,主要是针对连续型变量数据。
什么是K近邻算法
所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。经常用KNN来表示。
KNN怎么做回归?
同样是先分类,然后把所属类别的均值赋给预测值,也就是说要预测的点的值通过求与它距离最近的K个点的值的平均值得到。这里的"距离最近"可以是欧氏距离,也可以是其他距离,具体的效果依数据而定,思路一样。如下图,x轴是一个特征,y是该特征得到的值,红色点是已知点,要预测第一个点的位置,则计算离它最近的三个点(黄色线框里的三个红点)的平均值,得出第一个绿色点,依次类推,就得到了绿色的线,可以看出,这样预测的值明显比直线准。
不同于回归分析,K进行回归算法没法给一个回归方程
Python中也提供了K近邻回归算法接口,这里牵涉到几个参数的选择,
1,权重,也就是近邻的权重,一般有两种选择:一是所有近邻的权重都相同,二是权重等于近邻距离的倒数,也就是越近对预测值影响越大。
2,距离的算法,在这里主要有两种,曼哈顿距离和欧氏距离。
3,近邻个数的选择,这个可以使用sklearn调优器(GridSearchCV)平均交叉验证的方法通过网格搜索来获取最优的个数。k值设置过小会降低分类精度;若设置过大且测试样本属于训练集中包含数据较少的类,则会增加噪声,降低分类效果。
sklearn.preprocessing 包提供了几个常见的实用功能和变换器类型,用来将原始特征向量更改为更适合机器学习模型的形式。
数据集的 标准化 对scikit-learn中实现的大多数机器学习算法来说是 常见的要求 。如果个别特征或多或少看起来不是很像标准正态分布(具有零均值和单位方差),那么它们的表现力可能会较差。
在实际情况中,我们经常忽略特征的分布形状,直接经过去均值来对某个特征进行中心化,再通过除以非常量特征(non-constant features)的标准差进行缩放。
在机器学习算法的目标函数许多学习算法中目标函数的基础都是假设所有的特征都是零均值并且具有同一阶数上的方差。
尤其是在以距离为依据的分类算法,如果某个特征的方差比其他特征大几个数量级,那么它就会在学习算法中占据主导位置,导致学习器并不能像我们说期望的那样,从其他特征中学习。
实用类 StandardScaler ,它实现了转化器的API来计算训练集上的平均值和标准偏差,以便以后能够在测试集上重新应用相同的变换。
结果分析:
1,通过实用类 StandardScaler来进行数据的转换;
2,K近邻最优选取6个;
3,距离选取曼哈顿距离;
4,根据近邻的距离的远近的倒数选取权重,
5,使用超参数优化器选取参数时,针对回归,优化器中的scoring选取r2,是回归的拟合优度
K近邻回归中的score得到的是r2系数,最终根据优化后的模型参数,得到测试集上的r2为0.72,比使用线性回归效果还略差一些,针对这个数据集,线性回归比k近邻回归效果更好。
总结:
- 训练集的选取决定着回归预测的效果好坏,同一个数据集,按不同比例进行拆分,无论是随机拆分还是固定拆分都会影响效果。
- 训练的模型要在测试集查看他的效果,而不是在训练集。
- 鉴于拆分训练集和测试集对效果影响比较大,可以使用交叉验证的方式获取更准确的效果评估。