最邻近分类算法KNN:
近朱者赤近墨者黑,由邻居判读你的分类。
为了判断未知样本的类别,以所有已知类别的样本作为参照,计算未知样本与所有已知样本的距离,从中选取与未知样本距离最近的K个已知样本,根据少数服从多数的投票法则,将未知样本与K个最邻近样本中所属类别占比较多的归为一类。
距离怎么算?
K怎么确定?
通过交叉验证和网格搜索,从选取一个较小的K值开始,不断增加K的值,然后计算验证集合的mean_square_error,最终找到一个比较合适的K值。
关于交叉验证的详细信息可以参考这篇博客:
https://blog.csdn.net/FlatTiger/article/details/111170574
代码实现:
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
# 交叉验证
from sklearn.model_selection import KFold
# 模型评分
from sklearn.model_selection import cross_validate
data = pd.read_csv(r'G:\学习文件\机器学习\data_mining_data\breast_cancer.csv')
# 切分特征和标签
features = data.iloc[:, :-1]
labels = data.iloc[:, -1]
# 标准化
ss = StandardScaler()
# ss.fit(features)
features_std = ss.fit_transform(features)
df = pd.DataFrame(features_std, columns=features.columns)
# 交叉验证
kf = KFold(n_splits=5)
# for i in range(3, 8):
# mean = 0
# for train_index,test_index in kf.split(features_std):
# # 创建模型
# knn_model = KNeighborsClassifier(n_neighbors=i)
# knn_model.fit(df.loc[train_index], labels.loc[train_index])
# score = knn_model.score(df.loc[test_index], labels.loc[test_index])
# mean += score
# # 评分
# mean = mean / 5
# print('i={},score={}'.format(i, mean))
for i in range(3, 8):
knn_model = KNeighborsClassifier(n_neighbors=i)
# cross_validate评分
score = cross_validate(knn_model, df, labels)
print(score)
优缺点及使用场景
- 简单,易于理解,易于实现,无需估计参数,无需训练。
- 懒惰算法,对测试样本分类时的计算量大,内存开销大。
- 必须指定K值,K值选择不当则分类精度不能保证。
- 使用场景:数据量较小的场景,几千-几万条。注意使用KNN算法时需要进行标准化。