当前位置:首页>python>python从基础到AI-机器学习-从KNN开始

python从基础到AI-机器学习-从KNN开始

  • 2026-08-28 09:42:09
python从基础到AI-机器学习-从KNN开始
点击蓝字,立即关注
如果您对人工智能方面的分享感兴趣,欢迎您关注,我们的公众号:
已经完成的读书笔记,如您感兴趣,请移步,往期文章精选:
python机器学习读书笔记导航
《LangChain实战派》读书笔记-目录
《基于大模型的RAG应用开发与优化》读书笔记-导航
如果您对在家做菜也有兴趣,欢迎您关注我们的联合公众号:

写在前面

这是一个新系列的文章,从python基础到AI应用,从基础变成语言到算法使用。不讲原理,只讲用法。
每次留下一个小问题,并在下一次文章开头进行解答。
本系列文章内容,全部由AI来写。

引言

踏入机器学习的世界,你是否在寻找一个直观易懂的起点?K最近邻(KNN)算法正是为你准备的。它没有复杂的数学公式,其核心思想简单而有力:相似的事物总是聚在一起。

本文紧接上一讲《机器学习相关概念》,将带你从理论走向实践。我们会深入浅出地解析KNN的原理,并手把手带你用经典的鸢尾花数据集完成一个完整的机器学习项目。学完本文,你不仅能懂KNN,更能亲手实现它。


KNN算法介绍

概念和用途

K最近邻是一种“懒惰”却聪明的监督学习算法,既能解决分类问题,也能应对回归任务。

  • 核心思想
    :要判断一个新样本,就在已知数据中找到它的 K个“最像”的邻居,然后听听邻居们的意见。
  • 如何分类
    :邻居们投票决定。看看K个邻居里哪个类别最多,新样本就属于哪个类别。
  • 如何回归
    :邻居们商量出个平均数。将K个邻居的目标值平均一下,结果就是新样本的预测值。
  • 关键一步——选K值
    :K值就像你的参考范围。太小(如K=1)容易受个别噪声影响;太大又可能参考了不相关的信息。通常,我们需要通过实验(如交叉验证)来找到那个“刚刚好”的K值。

分类问题实现过程

只需五步,即可完成KNN分类:

  1. 准备数据
    :收集好已标注类别的训练数据。
  2. 选定K值
    :确定要参考的邻居数量(例如3或5)。
  3. 计算距离
    :测量新样本与每个训练样本之间的“远近”(常用欧氏距离)。
  4. 找到邻居
    :挑出距离最近的K个训练样本。
  5. 投票决定
    :统计K个邻居的类别,票数最多的类别胜出。

回归问题实现过程

回归任务的步骤与分类高度相似:

  1. 准备数据
    :收集带有连续数值标签的训练数据(如房价、温度)。
  2. 选定K值
    :同上,选择一个合适的K。
  3. 计算距离与寻找邻居
    :找到K个最近的样本。
  4. 计算预测值
    :将这K个邻居的标签值取平均值,即为预测结果。

鸢尾花数据集案例实践

现在,让我们用Python和scikit-learn库,亲身体验KNN分类的全过程。我们将使用经典的鸢尾花数据集。

1. 数据获取与初探

首先,我们认识一下数据。鸢尾花数据集包含三种鸢尾花的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}")

2. 数据预处理与划分

原始数据需要稍作处理,才能更好地用于模型训练。

# 划分数据集: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)       # 使用相同的尺度转换测试集

3. 训练KNN模型

用处理好的数据,训练我们的KNN分类器。

# 创建KNN分类器,设定K=5knn = KNeighborsClassifier(n_neighbors=5)# 开始训练!knn.fit(X_train_scaled, y_train)print("模型训练完毕!")

4. 评估模型表现

是骡子是马,拉出来溜溜。用测试集检验模型的真实能力。

# 让模型对测试集进行预测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))

5. 使用模型进行预测

模型训练好后,就可以用来预测新数据了。

# 假设我们有一朵新的鸢尾花,测量数据如下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. 算距离
 -> 2. 找K邻 -> 3. 多数表决。
回归步骤1. 算距离
 -> 2. 找K邻 -> 3. 取平均值。
距离度量
最常用欧氏距离,用于衡量样本在特征空间中的“远近”。
实战要点数据预处理必须进行标准化
(如 StandardScaler),以消除不同特征尺度带来的偏差。
数据集划分
使用 train_test_split分出训练集和测试集,这是检验模型泛化能力的黄金标准。
模型评估
分类任务看准确率、混淆矩阵、分类报告;回归任务看均方误差(MSE)等。
代码工具 (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 KNeighborsClassifier
 (分类) / KNeighborsRegressor (回归)
核心操作.fit(X_train, y_train)
 用于训练,.predict(X_test) 用于预测。
注意事项K值的影响K值小
:模型敏感,容易过拟合;K值大:模型平滑,可能欠拟合。
算法特点优点
:原理简单,无需训练过程(惰性学习)。缺点:预测时计算开销大,不适合大规模数据。
重要原则避免数据泄露
:测试集的任何预处理(如标准化)必须使用从训练集学到的参数,绝不能重新拟合。

最新文章

随机文章