机器学习 第5篇:knn回归

基于最邻近算法的分类,本质上是对离散的数据标签进行预测,实际上,最邻近算法也可以用于对连续的数据标签进行预测,这种方法叫做基于最邻近数据的回归,预测的值(即数据的标签)是连续值,通过计算数据点最临近数据点平均值而获得预测值。

一,sklearn的knn回归

scikit-learn实现了两个不同的最邻近回归模型:

  • KNeighborsRegressor:根据每个查询点的最邻近的k个数据点的均值作为预测值,其中,k是用户指定的整数。
  • RadiusNeighborsRegressor:基于查询点的固定半径内的数据点的均值作为预测值,其中r是用户指定的浮点值。

回归模拟器的定义如下,该定义只列出最重要的参数,详细参数请参考sicikit-learn 官网:

sklearn.neighbors.KNeighborsRegressor(n_neighbors=5, weights='uniform', algorithm='auto', metric='minkowski',...)
sklearn.neighbors.RadiusNeighborsRegressor(radius=1.0, weights='uniform', algorithm='auto', metric='minkowski',...)

参数注释:

  • radius:寻找最邻近数据点的半径
  • n_neighbors:最邻近的邻居数量
  • algorithm:寻找最邻近的数据点的算法,有效值是['auto','ball_tree','kd_tree','brute']
  • metric:计算距离的度量,详细信息请查看:DistanceMetric 
  • weights:权重,默认值weights ='uniform',为每个邻居分配统一的权重。 weights ='distance'分配的权重与距查询点的距离成反比。用于也可以提供定义函数来计算权重。在某些情况下,最好对邻居加权,以使较近的邻居对拟合的贡献更大,这可以通过weights关键字完成。

最基本的最邻近回归使用统一的权重,也就是说,在特定范围中的每个数据点对查询点的分类(回归)的作用是相同的。在某些情况下,对权重点进行加权可能会比较有利,以使邻近的点比远离的点对回归的贡献更大,这可以通过weights关键字完成。默认值weights ='uniform',为所有点分配相等的权重。 weights ='distance'分配的权重与距查询点的距离成反比。

二,基于最邻近的数据点的数量来预测

当使用knn计算某个数据点的预测值时,模型会从训练数据集中选择离该数据点最近的k个数据点,并且把它们的y值取均值,把该均值作为新数据点的预测值:

from sklearn.neighbors import KNeighborsRegressor

对于knn分类,使用score方法评估模型,对于回归的问题,返回的是R^2分数,R^2分数也叫做决定系数,是回归模型预测的优度度量,位于0到1之间,R^2等于1对应完美预测,R^2等于0对应于常数模型,即总是预测训练集响应(y_train)的均值。

from sklearn.datasets import make_regression
from sklearn.neighbors import KNeighborsRegressor
from sklearn.model_selection import train_test_split

kng=KNeighborsRegressor(n_neighbors=5)

x_data,y_data=make_regression(n_features=1,n_informative=1,noise=50,random_state=1)
x_train,x_test,y_train,y_test=train_test_split(x_data,y_data,random_state=1)

kng.fit(x_train,y_train)
prediction=kng.predict(x_test)

kng_test_score=kng.score(x_test,y_test)
kng_train_score=kng.score(x_train,y_train)
print('test data score:{:.2f}'.format(kng_test_score))

三,knn回归模型的优缺点

knn回归有两个重要的参数:最邻近数据点的数量k,数据点之间距离的度量方法。

在实践中,通常使用较小的k值,在knn分类中通常把k值设置为奇数,便于找到多数邻居的标签。默认的距离度量是欧式距离,它在多数情况下的效果都很好,除此之外,还有曼哈顿距离等,详细信息,请阅读《Scipy 学习第3篇:数字向量的距离计算》。

在确定knn回归或knn分类的k值时,可以通过折叠交叉验证来寻找最佳的k值,示例代码如下:

from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV  #通过网络方式来获取参数

# 导入iris数据集
iris2=datasets.load_iris()
X2=iris2.data
y2=iris2.target
print(X2.shape,y2.shape)

# 设置需要搜索的K值,'n_neightbors'是sklearn中KNN的参数
parameters={'n_neightbors':[1,3,5,7,9,11,13,15]}
knn=KNeighborsClassifier()#注意:这里不用指定参数

# 通过GridSearchCV来搜索最好的K值。这个模块的内部其实就是对每一个K值进行评估
clf=GridSearchCV(knn,parameters,cv=5)  #5折
clf.fit(X2,y2)

# 输出最好的参数以及对应的准确率
print("最终最佳准确率:%.2f"%clf.best_score_,"最终的最佳K值",clf.best_params_)

knn回归模型的优点之一是模型很容易理解,通常不需要过多的调参就可以得到不错的性能,并且构建模型的速度通常很快。但是使用knn算法时,对数据进行预处理是很重要的,对特征很多的数据集、对于大多数特征值都为0的数据集,效果往往不是很好。

虽然k邻近算法很容易理解,但是由于预测速度慢,且不能处理具有很多特征的数据集,所以,在实践中往往不会用到。

参考文档:

sklearn.neighbors.KNeighborsRegressor

原文地址:https://www.cnblogs.com/ljhdo/p/13894042.html