目录
一、KNN 算法简介
KNN 是一种基于实例的学习算法。它通过比较样本之间的距离来进行预测。算法的核心思想是:对于一个未知样本,通过找到距离该样本最近的 (k) 个已知样本,根据这些已知样本的标签来预测未知样本的标签或数值。
二、KNN算法的使用
1.读取数据
import pandas as pd
# numpy 读取二维数据
# pandas 读取表格类的数据 本文使用xlsx数据 所以用pandas
# 读取数据
"""
train_data:训练集
test_data:测试集
"""
train_data = pd.read_excel("鸢尾花训练数据.xlsx")
test_data = pd.read_excel("鸢尾花测试数据.xlsx")
2.处理数据
- 提取出特征和分类标签
"""
处理训练集数据;
数据重排;
变量与标签分离.
"""
train_x = train_data[['萼片长(cm)', '萼片宽(cm)', '花瓣长(cm)', '花瓣宽(cm)']] # 特征
train_y = train_data[['类型_num']] # 提取单列返回series 需要用[]将其变成列表 # 标签
- 将每一列数据进行标准化处理,减小误差(大部分情况下能够减小误差)
"""
标准化语法 归一化:0~1 是对每一个特征列进行归一化
Z-Score标准化 -1~1
"""
# 这里用的是scale模块 即Z-Score标准化方法
from sklearn.preprocessing import scale
data = pd.DataFrame()
# 对每一列数据进行标准化 目标: 让每个特征数据都在差不多大小范围内
data['萼片长标准化'] = scale(train_x['萼片长(cm)'])
data['萼片宽标准化'] = scale(train_x['萼片宽(cm)'])
data['花瓣长标准化'] = scale(train_x['花瓣长(cm)'])
data['花瓣宽标准化'] = scale(train_x['花瓣宽(cm)'])
三、训练模型
1.导入KNN模块
"""
使用sklearn库中的KNN模块
"""
from sklearn.neighbors import KNeighborsClassifier
2.训练模型
-
knn = KNeighborsClassifier(n_neighbors=9): 创建一个 KNN 分类器对象
-
n_neighbors=9 表示选择 9 个最近邻居来进行分类
- 使用交叉验证等方法选择合适的 K 值。常用的选择方式是尝试不同的 K 值,并选择表现最好的 K。
-
选择奇数的 K 值可以避免在分类时出现平局情况。
-
knn.fit(data, train_y): 使用 data 作为特征数据和 train_y 作为目标标签训练 KNN 模型。训练完成后,knn 变成一个已经训练好的模型,可以用来对新数据进行预测。
knn = KNeighborsClassifier(n_neighbors=9) # 参数最好是奇数 均值好判断
knn.fit(data, train_y) # 训练模型 knn就是训练好的模型
3.出厂前测试
- 使用训练集数据和分类对这个训练好的模型进行出厂前的测试
train_predicted = knn.predict(data) # 用knn模型对训练集data进行预测 相当于复习
score = knn.score(data, train_y) # 直接将使用data数据预测后的数据与data数据原分类进行对比 可以用来判断复习的正确率
print(score)
- 测试结果:
0.9696969696969697 # 说明该模型存在一点误差
四、进行测试
1.处理数据
- 测试集的数据在读取数据时已经读取过了,直接处理数据即可
# 测试
test_x = test_data[['萼片长(cm)', '萼片宽(cm)', '花瓣长(cm)', '花瓣宽(cm)']] # 特征
test_y = test_data[['类型_num']] # 标签
test_data = pd.DataFrame()
# 对每一列数据进行标准化
test_data['萼片长标准化'] = scale(test_x['萼片长(cm)'])
test_data['萼片宽标准化'] = scale(test_x['萼片宽(cm)'])
test_data['花瓣长标准化'] = scale(test_x['花瓣长(cm)'])
test_data['花瓣宽标准化'] = scale(test_x['花瓣宽(cm)'])
2.进行测试
test_predicted = knn.predict(test_data) # 使用knn模型对test_data数据进行预测
print(test_predicted)
score = knn.score(test_data, test_y) # 判断测试集正确率
print(score)
测试结果:
[0 0 0 0 0 1 0 1 1]
0.8888888888888888
总结
KNN 算法是一种直观且实用的机器学习算法,适用于许多实际问题。它的优点在于简单易用,但在处理大数据集或高维数据时可能会遇到计算性能问题。通过合理选择 K 值和距离度量,可以提高 KNN 算法的效果。