K近邻算法
K最近邻(kNN,k-Nearest Neighbor):
工作原理:存在一个样本数据集合,也称作为训练样本集,并且样 本集中每个数据都存在标签,即每一个数据与所属分类的一一对应 关系。输入没有标签的新数据后,将新的数据的每个特征与样本集 中数据对应的特征进行比较,然后算法提取样本最相似数据(最近邻) 的分类标签。
一般来说,只选择样本数据集中前k个最相似的数据,这就是k-近邻 算法中k的出处,通常k是不大于20的整数。最后,选择k个最相似数 据中出现次数最多的分类,作为新数据的分类。
距离度量:
欧氏距离(最常用),曼哈顿距离,马氏距离,夹角余弦(越接近1,越相似)
k-近邻算法步骤:
计算已知类别数据集中的点与当前点之间的距离;
按照距离递增次序排序;
选取与当前点距离最小的k个点;
确定前k个点所在类别的出现频率;
返回前k个点所出现频率最高的类别作为当前点的预测分类
k-近邻算法实战:数据归一化
如果不同特征变量的量纲级别相差较大且在建模时相互影响,我们通常会对数据进行预处理,该手段称为数据标准化或数据归一化。
常见方法有min—max标准化(也称离差标准化):newValue = (oldValue - min) / (max - min)
Z—score标准化(也称均值归一化)
超参数优化
KNN中的k是一个超参数,需要人为输入。从KNN原理中可知,k值对
算法有极大的影响。
如果选择的k值较小,就相当于较小的邻域中的训练实例进行预测, 这时候只有与输入实例较近的(相似的)训练实例才会对预测结果 起作用,但缺点是预测结果会对近邻的实例点非常敏感。如果邻近 的实例点恰好是噪声,预测就会出错。相反地,如果选择的k值较大, 就相当于较大的邻域中的训练实例进行预测。这时与输入实例较远 的(不相似的)训练实例也会对预测起作用,使预测发生错误。
交叉验证优化超参数
模型每次使用不同的训练集和测试集,有不同的测试结果
机器学习追求的是模型在未知数据集上的效果,通过交叉验证进一 步提高模型的泛化能力
KNN总结:
一种非参数、惰性学习方法,导致预测时速度慢
当训练样本集较大时,会导致其计算开销高
样本不平衡的时候,对稀有类别的预测准确率低
KNN模型的可解释性不强
代码实现:
例子:鸢尾花分类
import numpy as np
from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
# 导入鸢尾花数据并查看数据特征
iris = datasets.load_iris()
print('数据量',iris.data.shape)
# 拆分属性数据
iris_X = iris.data
# 拆分类别数据
iris_y = iris.target
iris_train_X , iris_test_X, iris_train_y ,iris_test_y = train_test_split(iris_X, iris_y, test_size=0.2,random_state=0)
knn = KNeighborsClassifier(n_neighbors=6)
knn.fit(iris_train_X, iris_train_y)
predict_result=knn.predict(iris_test_X)
print('预测结果',predict_result)
# 计算预测的准确率
print('预测准确率',knn.score(iris_test_X, iris_test_y)) #knn.score()涵义先做预测,再比较
回归
X = [[0], [1], [2], [3]]
y = [0, 0, 1, 1]
from sklearn.neighbors import KNeighborsRegressor
neigh = KNeighborsRegressor(n_neighbors=2)
neigh.fit(X, y)
print(neigh.predict([[1.5]]))
暂无数据