前言: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值来找到最优值。
- 减少特征:使用特征选择或降维来减少特征数量,从而降低计算复杂度,例如,PCA主成分分析和降维算法-LDA
- 缺失值处理:通过填充或删除缺失值来适当地处理缺失数据。
- 交叉验证:使用交叉验证来评估算法的性能并避免过拟合。
- 其他参数调整:通过
print(help(KNeighborsClassifier))
查看可以调整的参数,具体参数解释见官方文档。
参考资料
Scikit-Learn 官方文档
- 1.6. Nearest Neighbors — scikit-learn 1.2.2 documentation
- sklearn.neighbors.KNeighborsClassifier — scikit-learn 1.2.2 documentation
- sklearn.neighbors.KNeighborsRegressor — scikit-learn 1.2.2 documentation
这文章篇也推荐- sklearn中KNN模型参数释义_knn参数_超能小墨的博客-CSDN博客
其他参考资料