python机器学习基础——监督学习算法之k近邻回归

k近邻算法还可以用于回归,我们还是从单一近邻开始, 这次我们使用wave数据集,我们添加了3个测试数据点,在x轴上用绿色五角星来表示,利用单一邻居的预测结果就是最近邻的目标值。

单一邻居实现k近邻回归(绘图查看效果)

import mglearn
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from mglearn import datasets

mglearn.plots.plot_knn_regression(n_neighbors=1)
plt.show()

在这里插入图片描述

多个邻居实现k近邻回归(绘图查看效果)

在使用多个近邻时,预测结果为这些邻居的平均值

mglearn.plots.plot_knn_regression(n_neighbors=3)
plt.show()

在这里插入图片描述

sklearn实现用于回归的k近邻算法

from sklearn.neighbors import KNeighborsRegressor

X, y = mglearn.datasets.make_wave(n_samples=40)
# 将wave数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
# 模型实例化
reg = KNeighborsRegressor(n_neighbors=3)
# 利用训练数据和训练目标值来拟合模型
reg.fit(X_train, y_train)
# 现在可以对测试集进行预测
print("Test set predictions:\n{}".format(reg.predict(X_test)))
# 我们可以用score方法来评估模型,对于回归问题,这一方法返回的是R的平方分数
# R的平方分数也叫做决定系数
# 是回归模型的优度度量,位于0-1之间
# R的平方等于1对应完美预测
# R的平方等于0对应常数模型,即总是预测训练集响应的平均值
print("Test set r^2:{:.2f}".format(reg.score(X_test, y_test)))
# 这里的分数是0.83,表示模型的拟合相对较好

分析KNeighborsRegression

import numpy as np

fig, axes = plt.subplots(1, 3, figsize=(15, 4))
# 创建1000个数据点,在-33之间均匀分布
line = np.linspace(-3, 3, 100).reshape(-1, 1)
for n_neighbors, ax in zip([1, 3, 9], axes):
    reg = KNeighborsRegressor(n_neighbors=n_neighbors)
    reg.fit(X_train, y_train)
    ax.plot(line, reg.predict(line))
    ax.plot(X_train, y_train, '^', c=mglearn.cm2(0), markersize=8)
    ax.plot(X_test, y_test, 'v', c=mglearn.cm2(1), markersize=8)
    ax.set_title("{} neighbor(s)\n train score:{:.2f} test score :{:.2f}".format(n_neighbors, reg.score(X_train, y_train), reg.score(X_test, y_test)))
    ax.set_xlabel("Feature")
    ax.set_xlabel("Target")
axes[0].legend(["Model predictions", "Training data/target", "Test data/target"], loc='best')
plt.show()

在这里插入图片描述
从图中可以看出,仅使用单一邻居,训练集中的每个点都对预测结果有显著影响,预测结果的图像经过所有数据点。这导致预测结果非常不稳定,考虑到更多的邻居之后,预测结果变得更加平滑,但对训练数据的拟合也不好。

k-nn的优点、缺点和参数

一般来说,KNeighbors分类器有两个重要参数:邻居个数与数据点之间距离的度量方法,在实践中,使用较小的邻居个数(比如3个或5个)往往可以得到比较好的结果。

K-NN的优点之一就是模型很容易理解,通常不需要过多调节就可以得到不错的性能, 在考虑使用更高级的技术之前,尝试此算法是一种很好的基准方法。

构建最近邻模型速度通常很快,但如果训练集很大(特征数很多或者样本数很大), 预测速度可能会比较慢。使用K-NN算法时,对数据进行预处理是很重要的。

这一算法对于有很多特征(几百或更多)的数据集往往效果不好。对于大多数特征的大多数取值都为0的数据集(所谓的稀疏数据集来说),这一算法的效果尤其不好。虽然k近邻算法很容易理解,但由于预测速度慢且不能处理具有很多特征的数据集, 所以在实践中往往不会用到

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值