KNN回归实验
一、基础知识
- 什么是回归: 回归实际上就是“最佳拟合”。根据已有的数据拟合出一条最佳的直线、曲线、超平面或函数等,用于预测其它数据的目标值。如已知一系列的点(x,y),我们可能就可以拟合出一条最佳的直线y=kx+b。那么如果已知自变量x,要预测目标值y的话,就可以直接带入到该直线方程中求出y。回归的目的就是预测数值型的目标值
- 分类与回归的区别: 分类是判断对应类别,而回归的输出是一个具体值。
二、算法实现
- 前期数据处理:
import numpy as np import pandas as pd # 增加表格的列数行数和每行的宽度以此让数据集完整表示 pd.set_option('display.max_rows', 500) pd.set_option('display.max_columns', 500) pd.set_option('display.width', 1000) # 提取鸢尾花的数据集 data = pd.read_csv(r"E:\Machine learning data\Iris\Iris.csv") #删除不需要的列,进行回归操作,类别信息没有用处。axis=1表示列,inplace=True表示就地删除。 data.drop(["Unnamed: 0","Species"],axis=1,inplace=True) # 删除重复记录 data.drop_duplicates(inplace=True)
- KNN回归算法的实现
- 实现代码:
class KNN: """使用Python实现k近邻算法。(回归预测) 该算法用于回归预测,根据前3个特征属性,寻找最近的k个邻居, 然后再根据k个邻居的第四个特征属性,去预测当前样本的第4个特征值。 """ def __init__(self,k): """ 初始化方法 Paramets ------ k:int 邻居个数 """ self.k = k def fit(self,X,y): """ 训练方法。 Parameters ------ X:类数组类型(特征矩阵)。形状为[样本数量,特征数量] 带训练的样本特征(属性) y:类数组类型(目标标签)。形状为[样本数量] 每个样本的目标值(标签) """ # 注意,要将X与y转换成ndarray数组的形式,方便统一进行操作。 self.X = np.asarray(X) self.y = np.asarray(y) def predict(self,X): """根据参数传递的X,对样本数据进行预测 Parameter: ------ X:类数组类型。形状为[样本数量,特征数量] 待测试的样本特征(属性) Return: ----- result:数组类型。 预测的结果值。 """ # 将X转换成数组类型 X = np.asarray(X) # 保存预测的结果值 result = [] for x in X: # 计算距离。(计算与训练集中每个X的距离) dis = np.sqrt(np.sum((x-self.X )** 2,axis=1)) # 返回数组排序后,每个元素在原数组中(排序之前的数据)的索引 index = dis.argsort() # 取前k个距离最近的索引(在原数组中的索引) index = index[:self.k] # 计算均值,然后加入到结果列表中。 result.append(np.mean(self.y[index])) return np.array(result) t = data.sample(len(data),random_state=0) train_X = t.iloc[:120,:-1] train_y = t.iloc[:120,-1] test_X = t.iloc[120:,:-1] test_y = t.iloc[120:,-1] knn = KNN(k=3) knn.fit(train_X,train_y) result = knn.predict(test_X) # 用与表示预测值与实际值的相差度 print("预测值与实际值的相差度:",np.mean(np.sum(result-test_y) ** 2)) print("预测值:",result) print("实际值:",test_y.values)
- 实验结果:
- 可视化操作
- 导入所需包并进行一些必要设置
import matplotlib as mpl import matplotlib.pyplot as plt # 默认情况下,matplotlib不支持中文显示,我们需要进行设置 # 设置字体为黑体,以支持中文显示。 mpl.rcParams["font.family"] = "SimHei" # 设置在中文字体时,能够正常的显示负号(-) mpl.rcParams["axes.unicode_minus"] = False
- 图表绘制
# 图表绘制: plt.figure(figsize=(10,10)) # 调整画布大小 # 绘制预测值 plt.plot(result,"ro-",label="预测值") # 绘制真实值 plt.plot(test_y.values,"go--",label="真实值") plt.title("kNN回归预测展示") plt.xlabel("节点序号") plt.ylabel("花瓣宽度") plt.legend() plt.show()
- 图表展示
三、总结
- 一般可以用节点距离的倒数来表示权重。