当前位置:  首页>> 技术小册>> Python机器学习基础教程(上)

1.7.4 构建第一个模型:k 近邻算法

在Python机器学习的世界中,k近邻(k-Nearest Neighbors, k-NN)算法是一种直观且强大的分类与回归方法。作为本教程中的第一个模型构建章节,我们将深入探讨k-NN算法的基本原理、如何在Python中实现它,并通过实例来展示其应用。本章节旨在使读者能够理解k-NN的基本概念,掌握其实现方法,并初步体验到机器学习模型构建的乐趣。

1.7.4.1 k近邻算法概述

定义:k近邻算法是一种基于实例的学习或惰性学习算法,它使用整个训练集来对新样本进行分类或预测。对于给定的测试样本,算法会找到训练集中与其最相近的k个邻居(即k个最相似的实例),然后根据这k个邻居的信息来预测测试样本的类别或值。

原理:k-NN的核心思想是“少数服从多数”或“平均法”。对于分类问题,算法会统计这k个邻居中属于各个类别的数量,并将测试样本分类为数量最多的那个类别。对于回归问题,则通常计算这k个邻居的目标值的平均值或加权平均值作为预测结果。

优缺点

  • 优点:简单易懂,无需训练过程,对异常值不敏感(取决于k的选择)。
  • 缺点:计算量大,尤其是当数据集很大时;需要选择合适的k值;对数据的尺度敏感,需要进行数据预处理。

1.7.4.2 Python中的k-NN实现

在Python中,我们可以使用多种库来实现k-NN算法,其中scikit-learn是最流行的一个。scikit-learn是一个基于Python的机器学习库,提供了大量的算法实现和数据处理工具,非常适合初学者和研究者使用。

安装scikit-learn

如果你还没有安装scikit-learn,可以通过pip命令轻松安装:

  1. pip install scikit-learn
示例:使用scikit-learn的KNeighborsClassifier

以下是一个使用scikit-learnKNeighborsClassifier类来实现k-NN分类器的简单示例。

  1. from sklearn.datasets import load_iris
  2. from sklearn.model_selection import train_test_split
  3. from sklearn.preprocessing import StandardScaler
  4. from sklearn.neighbors import KNeighborsClassifier
  5. from sklearn.metrics import accuracy_score
  6. # 加载鸢尾花数据集
  7. iris = load_iris()
  8. X = iris.data
  9. y = iris.target
  10. # 划分训练集和测试集
  11. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
  12. # 特征缩放(可选,但通常对k-NN很重要)
  13. scaler = StandardScaler()
  14. X_train_scaled = scaler.fit_transform(X_train)
  15. X_test_scaled = scaler.transform(X_test)
  16. # 创建k-NN分类器实例
  17. k = 3 # 选择k值
  18. knn = KNeighborsClassifier(n_neighbors=k)
  19. # 训练模型
  20. knn.fit(X_train_scaled, y_train)
  21. # 预测测试集
  22. y_pred = knn.predict(X_test_scaled)
  23. # 计算准确率
  24. accuracy = accuracy_score(y_test, y_pred)
  25. print(f'Accuracy: {accuracy:.2f}')

在上述代码中,我们首先加载了鸢尾花(Iris)数据集,并将其分为训练集和测试集。接着,我们使用了StandardScaler对数据进行了特征缩放,因为k-NN算法对特征的尺度非常敏感。然后,我们创建了一个KNeighborsClassifier实例,指定了k值为3,并使用训练数据对其进行了训练。最后,我们使用训练好的模型对测试集进行了预测,并计算了准确率。

1.7.4.3 选择合适的k值

选择合适的k值是k-NN算法中一个重要的步骤。k值太小,模型容易受到噪声数据的影响,导致过拟合;k值太大,则可能将不同类别的数据视为相似,导致欠拟合。因此,通常需要通过交叉验证等方法来选择一个合适的k值。

scikit-learn中,我们可以使用GridSearchCVRandomizedSearchCV等工具来自动寻找最优的k值。这些工具会尝试多个k值,并使用交叉验证来评估每个k值对应的模型性能,最终选择性能最好的k值。

  1. from sklearn.model_selection import GridSearchCV
  2. # 设置k值的候选范围
  3. param_grid = {'n_neighbors': range(1, 11)}
  4. # 创建k-NN分类器实例和网格搜索实例
  5. knn = KNeighborsClassifier()
  6. grid_search = GridSearchCV(knn, param_grid, cv=5, scoring='accuracy')
  7. # 搜索最优的k值
  8. grid_search.fit(X_train_scaled, y_train)
  9. # 打印最优的k值和对应的准确率
  10. print(f'Best k: {grid_search.best_params_}')
  11. print(f'Best accuracy: {grid_search.best_score_:.2f}')

1.7.4.4 k-NN算法的进阶应用

除了简单的分类任务外,k-NN算法还可以应用于多种复杂的场景,如推荐系统、异常检测、图像识别等。在推荐系统中,k-NN可以根据用户的历史行为找到与其相似的其他用户,并推荐这些用户喜欢的物品。在异常检测中,k-NN可以计算每个样本与其邻居之间的距离,如果某个样本的邻居都与其差异很大,则该样本可能是异常点。

1.7.4.5 小结

通过本章节的学习,我们深入了解了k近邻算法的基本原理、Python实现方法以及如何选择合适的k值。k-NN算法作为机器学习领域中的一个基础且强大的工具,具有广泛的应用前景。希望读者能够通过实践加深对k-NN算法的理解,并为后续学习更复杂的机器学习算法打下坚实的基础。在未来的学习中,我们将继续探索其他类型的机器学习模型,包括决策树、支持向量机、神经网络等,以构建更加复杂和强大的机器学习系统。