写在前面
踏入机器学习的世界,你是否在寻找一个直观易懂的起点?K最近邻(KNN)算法正是为你准备的。它没有复杂的数学公式,其核心思想简单而有力:相似的事物总是聚在一起。
本文紧接上一讲《机器学习相关概念》,将带你从理论走向实践。我们会深入浅出地解析KNN的原理,并手把手带你用经典的鸢尾花数据集完成一个完整的机器学习项目。学完本文,你不仅能懂KNN,更能亲手实现它。
K最近邻是一种“懒惰”却聪明的监督学习算法,既能解决分类问题,也能应对回归任务。
只需五步,即可完成KNN分类:
回归任务的步骤与分类高度相似:
现在,让我们用Python和scikit-learn库,亲身体验KNN分类的全过程。我们将使用经典的鸢尾花数据集。
首先,我们认识一下数据。鸢尾花数据集包含三种鸢尾花的150个样本,每个样本测量了4个特征。
# 导入必要的工具包from sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import StandardScalerfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn.metrics import accuracy_score, confusion_matrix, classification_report# 加载数据iris = load_iris()X = iris.data # 特征:4个测量值y = iris.target # 标签:3种类别feature_names = iris.feature_namestarget_names = iris.target_namesprint(f"数据形状:{X.shape}") # (150, 4) 表示150条数据,4个特征print(f"标签形状:{y.shape}") # (150,) 表示150个标签print(f"特征名:{feature_names}")print(f"类别名:{target_names}")原始数据需要稍作处理,才能更好地用于模型训练。
# 划分数据集:70%用于训练,30%用于测试X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42, stratify=y)print(f"训练集:{X_train.shape}, 测试集:{X_test.shape}")# 特征标准化:让所有特征处于同一尺度,这对KNN至关重要scaler = StandardScaler()X_train_scaled = scaler.fit_transform(X_train) # 学习训练集的尺度并转换X_test_scaled = scaler.transform(X_test) # 使用相同的尺度转换测试集用处理好的数据,训练我们的KNN分类器。
# 创建KNN分类器,设定K=5knn = KNeighborsClassifier(n_neighbors=5)# 开始训练!knn.fit(X_train_scaled, y_train)print("模型训练完毕!")是骡子是马,拉出来溜溜。用测试集检验模型的真实能力。
# 让模型对测试集进行预测y_pred = knn.predict(X_test_scaled)# 计算准确率:预测正确的比例accuracy = accuracy_score(y_test, y_pred)print(f"模型准确率:{accuracy:.2%}") # 例如:95.56%# 查看混淆矩阵,了解具体分对/分错了哪些类别print("\n混淆矩阵:")print(confusion_matrix(y_test, y_pred))# 生成详细评估报告print("\n分类性能报告:")print(classification_report(y_test, y_pred, target_names=target_names))模型训练好后,就可以用来预测新数据了。
# 假设我们有一朵新的鸢尾花,测量数据如下new_flower = [[5.1, 3.5, 1.4, 0.2]] # [萼长, 萼宽, 瓣长, 瓣宽]# 重要:新数据必须使用相同的标准进行转换new_flower_scaled = scaler.transform(new_flower)# 进行预测prediction = knn.predict(new_flower_scaled)flower_type = target_names[prediction[0]]print(f"这朵新鸢尾花的预测品种是:{flower_type}")# 输出:这朵新鸢尾花的预测品种是:setosa本期没有作业,拿一个简单的算法来举例子让人更直观的体验一下整体套路。实际上在机器学习的运用过程中,有一些必要环节,我们后面展开来说。
恭喜你!至此,你已经掌握了KNN算法的核心思想与实战技能。我们从“物以类聚”的直观概念出发,一步步实现了数据预处理、模型训练、评估与预测的完整链条。
记住两个关键点:选择合适的K值和做好特征标准化,这是提升KNN模型性能的秘诀。同时也要了解,KNN在预测时需要计算与所有训练样本的距离,因此更适合数据量不大的场景。
最后强调:机器学习是一门实践的艺术。请务必运行文中的每一段代码,并认真完成作业,这比读十篇文章更有价值。
| 算法核心 | 核心思想 | |
| 关键参数 K | ||
| 工作流程 | 分类步骤 | 1. 算距离 |
| 回归步骤 | 1. 算距离 | |
| 距离度量 | ||
| 实战要点 | 数据预处理 | 必须进行标准化StandardScaler),以消除不同特征尺度带来的偏差。 |
| 数据集划分 | train_test_split分出训练集和测试集,这是检验模型泛化能力的黄金标准。 | |
| 模型评估 | ||
| 代码工具 (sklearn) | 数据加载 | from sklearn.datasets import load_iris, load_wine |
| 数据划分 | from sklearn.model_selection import train_test_split | |
| 特征处理 | from sklearn.preprocessing import StandardScaler | |
| 建模 | from sklearn.neighbors import KNeighborsClassifierKNeighborsRegressor (回归) | |
| 核心操作 | .fit(X_train, y_train).predict(X_test) 用于预测。 | |
| 注意事项 | K值的影响 | K值小 |
| 算法特点 | 优点 | |
| 重要原则 | 避免数据泄露 |