使用 sklearn包,测试数据iris
KNN算法要点
距离度量
机器学习常见距离度量
取最邻近点
获取最邻近点算法有 KD-tree和 Ball-tree
K值选择
k值太小,模型复杂,容易过拟合
k值过大,模型简单,容易欠拟合
一般取较小的奇数
加载数据
# sklearn可以自动加载iris数据集
# 较小的数据集使用load_*
# 较大的数据集使用fetch_*,使用时如果默认路径没有会从网络自动下载
# iris 数据集是整体,没有划分训练集和测试集,需要我们进行划分
from sklearn.datasets import load_iris
iris = load_iris()
切分数据
# 使用train_test_split对数据进行划分
# test_size 测试数据占比
# random_state 采样种子,不同种子会有不同的采样结果,不指定,前后两次采样可能存在不一致
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2,random_state=1)
特征预处理
# 数据处理有两种方式,归一化or 标准化
# 下面采用归一化,将数据统一处理成(0,1)之间的数
# fit_transform,第一步先匹配,第二步转换数据
# transform 是直接转换数据
from sklearn.preprocessing import MinMaxScaler
data_transform = MinMaxScaler(feature_range=(0, 1))
x_train = data_transform.fit_transform(x_train)
x_test = data_transform.transform(x_test)
训练模型
from sklearn.neighbors import KNeighborsClassifier
# 创建模型
# algorithm 获取最邻近点算法
# brute 暴力穷举
# kd_tree 维度较低时使用
# ball_tree 维度大于20时使用
# metric 距离计算方式,默认闵氏距离,p=2
estimator = KNeighborsClassifier(n_neighbors=3)
# 训练模型
estimator.fit(x_train, y_train)
查看结果
# socre既测试结果的准确率
score = estimator.score(x_test, y_test)
总结
- 优点:
- 原理简单,容易理解。
- 基本上没有学习。
- 对于类域交叉的样本集效果较好。
- 缺点:
- 惰性学习;
- 对k值敏感,模型结果容易受到k值的不同取值的影响;
- 在不均衡样本的场景下效果不好。
- 涉及到距离计算,计算量随着样本数的增加而增加,只适用于中小型数据集场景。