Python k-近邻算法实例分享
什么是 k-近邻算法
k-近邻算法(k-Nearest Neighbor,简称KNN)是一种基于实例的学习(instance-based learning)或者称为懒惰学习(lazy learning)的非参数化的分类和回归算法。
KNN分类算法的实现过程如下:
- 读取训练集数据
- 计算待分类实例与训练集中各个实例的相似度或距离
- 确定k值,选出与待分类实例距离前k个实例
- 统计k个实例的分类数量,并把待分类实例归为数量最多的那类
KNN回归算法在第三步选出的k个实例中计算回归值,可以为这k个实例的值的平均数。
k-近邻算法的优点:简单、易于理解和实现、需要的计算资源较少。
k-近邻算法的缺点:对于高维数据,计算相似度或距离会变得困难;对于特征值较多的数据,需要考虑特征权值问题和降维或特征选择等问题。
k-近邻算法实例1:Iris鸢尾花数据集分类
Iris鸢尾花数据集是机器学习领域中非常常用的一个数据集,包含了150朵三种不同鸢尾花的测量数据。
数据准备
从sklearn提供的datasets模块中读取并划分训练集和测试集
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
iris = load_iris()
data = iris.data
target = iris.target
X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.3, random_state=42)
k-近邻算法实现
模型的训练和预测
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
模型性能评估
使用混淆矩阵评估模型性能
from sklearn.metrics import confusion_matrix
confusion_matrix(y_test, y_pred)
输出结果
array([[19, 0, 0],
[ 0, 13, 1],
[ 0, 1, 11]])
对角线上的值表示正确分类的样本数,非对角线的值表示错误分类的样本数,可以看到该模型在三个类别上均取得了很好的分类效果。
k-近邻算法实例2:手写数字识别
手写数字识别是一个非常常见的图像识别问题,我们可以将数字图片转化为向量来训练k-近邻分类器。
数据准备
从sklearn提供的datasets模块中读取手写数字数据集,并划分训练集和测试集。
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
digits = load_digits()
data = digits.data
target = digits.target
X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.3, random_state=42)
k-近邻算法实现
模型的训练和预测
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
模型性能评估
使用混淆矩阵和分类准确率评估模型的性能
from sklearn.metrics import confusion_matrix, accuracy_score
confusion_matrix(y_test, y_pred)
accuracy_score(y_test, y_pred)
输出结果
array([[54, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 58, 0, 0, 0, 0, 0, 1, 0, 1],
[ 0, 0, 58, 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 1, 52, 0, 0, 0, 0, 3, 0],
[ 0, 0, 0, 0, 56, 0, 0, 1, 0, 0],
[ 0, 0, 0, 1, 0, 62, 1, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 65, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 48, 0, 0],
[ 0, 1, 0, 1, 0, 0, 0, 0, 57, 1],
[ 0, 0, 0, 1, 0, 1, 0, 0, 1, 62]])
0.9703703703703703
除了通过混淆矩阵的对角线上的值可以看出每个类别的分类效果外,模型的整体分类准确率也可以看出模型在测试集上的分类效果,这里取得了很不错的预测结果。
总结
k-近邻算法是一种简单易用、性能表现良好的分类和回归算法,对于一些简单的数据集,可以快速进行分类和预测。但对于较复杂的数据集,还需结合一些数据预处理和模型优化技术来提高预测效果。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python k-近邻算法实例分享 - Python技术站