【机器学习】K近邻(K-Nearest Neighbor)算法入门指南
前言:K近邻(K-Nearest Neighbor,简称KNN )算法是利用数据点之间的距离来进行预测的一种监督学习方法。在本文中将以最简单的图文方式、为初学者提供KNN算法的入门指南,原理介绍、应用场景、Python实现代码、使用KNN算法的优点和局限性。
原理介绍
K近邻(K-Nearest Neighbor,简称KNN )算法是利用数据点之间的距离来进行预测,是一种常用的监督学习算法。
它的工作原理是相似性。它假定在特征空间中相互接近的数据点很可能属于同一类。该算法首先使用标记数据训练模型,然后根据新数据点与现有数据点之间的接近程度预测其类别。
该算法的工作方式如下: 1.计算新数据点与所有现有数据点之间的距离。 2.基于计算出的距离选择K个最近的邻居。 3.确定所选K个邻居的主要类别。 4.将主要类别分配为新数据点的预测类别。
重要参数:
-
K的取值:算法被称为KNN,因为它使用K个最近的邻居来预测新数据点的类别。当K取值不同是,分类结果会有显著不同, 距离计算方式:接近程度使用距离度量,如欧氏距离、曼哈顿距离或闵可夫斯基距离来衡量。
KNN算法的应用
KNN算法可以解决分类和回归问题,因此在各个行业和领域都可以被广泛应用,比如: 1.医疗保健:根据患者的病史预测患病的可能性。 2.金融:根据客户的信用历史预测客户违约贷款的可能性。 3.零售:预测客户行为并向客户推荐产品。 4.社交媒体:根据用户的兴趣推荐朋友和内容。
实例实现(Python)
为了说明如何在Python中实现KNN算法,这里继续使用万金油的鸢尾花数据集。
对鸢尾花数据集有兴趣的可以查看进一步了解更多的可视化和算法技巧。
在这个例子中,我们将数据集分成了80%的训练集和20%的测试集,并将K值设为3。我们训练模型并使用测试集来评估模型的准确度。
import pandas as pd from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier # 加载数据集 data = pd.read_csv(iris.csv) # 将数据集分为特征和标签 X = data.iloc[:, :-1] y = data.iloc[:, -1] # 将数据集分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 初始化KNN分类器 knn = KNeighborsClassifier(n_neighbors=3) # 拟合训练数据 knn.fit(X_train, y_train) # 预测测试数据 y_pred = knn.predict(X_test) # 计算分类器的准确度 accuracy = knn.score(X_test, y_test) print("Accuracy:", accuracy)
优点和缺点
使用KNN算法的优点包括:
- 简单易懂,易于实现。
- 可用于分类和回归问题。
- 可以适应新数据,模型可以随时间变化而变化。 KNN算法也有一些缺点,包括:
- 对异常值和无关特征敏感。
- 对于大型数据集,可能会计算量较大。
- K值的选择需要仔细考虑,以避免过拟合或欠拟合模型。
西瓜书上有写KNN算法“是懒惰学习的著名代表……在训练阶段仅把样本保存起来,训练时间开销为零,待收到测试样本后再进行处理”,但也指出 “虽然简单但是泛化错误率不超过贝叶斯最优分类器错误的两倍”, 说明KNN算法是一种简单而有效的机器学习算法。
优化技巧
- 距离度量:尝试不同的距离度量、根据数据的特点选择合适的距离度量方法。
- K值:尝试不同的K值来找到最优值。
- 减少特征:使用特征选择或降维来减少特征数量,从而降低计算复杂度,例如,和
- 缺失值处理:通过填充或删除缺失值来适当地处理缺失数据。
- 交叉验证:使用交叉验证来评估算法的性能并避免过拟合。
- 其他参数调整:通过print(help(KNeighborsClassifier))查看可以调整的参数,具体参数解释见官方文档。
参考资料 Scikit-Learn 官方文档 这文章篇也推荐 其他参考资料 西瓜书 第十章 降维与度量学习 10.1 K近邻学习 P225