zoukankan      html  css  js  c++  java
  • 机器学习 第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

  • 相关阅读:
    2021 6 3
    2021 5月 读书笔记
    2021 6 1
    第十三周 2021.05.30
    spring security permitAll不生效
    springboot配置jpa提示Unable to resolve name [mysql] as strategy
    element el-form-item el-input宽度设置
    vue+element表格中使用render函数(if判断处理)
    elementui移除tab报Avoided redundant navigation to current location: ***
    el-dropdown-item添加@click不生效
  • 原文地址:https://www.cnblogs.com/ljhdo/p/13894042.html
Copyright © 2011-2022 走看看