当前位置: 首页 > news >正文

【人工智能】【Python】在Scikit-Learn中使用KNN(K最近邻算法)

今天机器学习课上的代码,在此记录一下。

# 导入包
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.neighbors import KNeighborsClassifier
# 导入数据
data = pd.read_excel("a.xlsx")
X = data[["搞笑镜头", "拥抱镜头", "打斗镜头"]]
y = data["分类"]
# stratify=y 可以使得y_test的数据分布和y_train的一样
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=114514, stratify=y)
# 分层操作验证
from collections import Counter
print(Counter(y_train))
print(Counter(y_test))
# 数据标准化
from sklearn.preprocessing import StandardScaler
sd = StandardScaler()
X_train = sd.fit_transform(X_train)
X_test = sd.transform(X_test)
# 创建模型
k_values = [1,3,5]
acc = dict()
# 寻找最优k值
for k in k_values:
    knn = KNeighborsClassifier(n_neighbors=k)
    # cv是几折交叉验证
    scores = cross_val_score(knn, X_train, y_train, cv=3, scoring="accuracy")
    acc[k] = scores.mean()
# print(acc)
best_k = max(acc, key=acc.get)
knn = KNeighborsClassifier(n_neighbors=best_k)
# 创建模型
k_values = [1,3,5]
acc = dict()
# 寻找最优k值
for k in k_values:
    knn = KNeighborsClassifier(n_neighbors=k)
    # cv是几折交叉验证
    scores = cross_val_score(knn, X_train, y_train, cv=3, scoring="accuracy")
    acc[k] = scores.mean()
# print(acc)
best_k = max(acc, key=acc.get)
knn = KNeighborsClassifier(n_neighbors=best_k)
# 训练模型
knn.fit(X_train, y_train)
print(knn.score(X_test, y_test))
# 预测
y_pred = knn.predict(X_test)
# 输出真实标签
print(y_test)
# 输出预测值
print(y_pred)
# 输出预测概率
print(knn.predict_proba(X_test))
# 类别
print(knn.classes_)

数据处理与划分

通过pandas导入结构化数据,选取"搞笑镜头"等三个特征作为输入变量,影片分类作为目标变量。采用分层抽样(stratify=y)将数据按8:2比例划分训练集和测试集,确保两个集合的类别分布比例与原数据集一致,这对于类别不平衡数据的建模尤为重要。标准化处理(StandardScaler)消除特征量纲差异,这是基于距离计算的KNN算法的必要预处理步骤。

模型调参与优化

针对KNN的核心超参数k值(最近邻数量),采用网格搜索策略测试[1,3,5]三个候选值。通过3折交叉验证(cross_val_score)在训练集上评估不同k值的平均准确率(accuracy),最终选择验证集表现最优的k值构建最终模型。这种交叉验证方法能有效避免单次数据划分带来的偶然性,提升超参数选择的可靠性。

模型评估与输出

在独立测试集上计算模型准确率(score方法)作为最终性能指标,同时输出预测结果的三类核心信息:真实标签(y_test)、预测标签(y_pred)和预测概率(predict_proba)。预测概率矩阵的列顺序与classes_属性显示的类别顺序对应,这对多分类问题的结果解析具有重要意义。

实现特点

代码体现了机器学习项目的典型工作流:数据准备→特征工程→模型训练→参数调优→性能评估。特别值得注意的是对数据分布保持(stratify)、特征标准化、交叉验证等机器学习最佳实践的完整实现,这些细节处理对模型性能有实质性影响。最终的预测概率输出也为后续的决策阈值调整等业务场景应用提供了扩展接口。

本次代码如果搞懂了,使用Scikit-Learn实现机器学习的50%基本上就学会了(老师原话),相比PyTorch的深度学习框架,Scikit-Learn集成了很多传统的机器学习算法,使用起来非常方便简洁。

相关文章:

  • Ruoyi+uniapp+websocket点对点和广播通知消息
  • 分享几个论文校对相关的deepseek提示词
  • Linux脚本编程
  • python基础课程整理--字典的基础
  • 图像滑块对比功能的开发记录
  • 芋道打包时报错:缺失@unocss插件
  • WLAN无线组网 WI-FI
  • 使用 Python pandas操作 Excel 文件
  • leetcode0020 - 有效的括号 easy
  • 精选一百道备赛蓝桥杯——2.K倍区间
  • YOLOv10改进之MHAF(多分支辅助特征金字塔)
  • BookChatApp通用书籍阅读APP
  • 云渲染技术在影视特效制作中的核心优势
  • Spring AI+硅基流动DeepSeek语音识别全栈方案:从FFmpeg预处理到分布式推理
  • 量子计算:气候模型的新纪元
  • 采用大模型技术进行知识图谱实体对齐的技术和开源项目
  • flask学习2-应用(博客)
  • 深度理解指针与内存
  • 使用数据库和缓存的时候,是如何解决数据不一致的问题的?
  • android edittext 防止输入多个小数点或负号
  • 6月底将返回中国,旅日大熊猫获颁“感谢状”
  • 为小龙虾洗清这些“黑锅”,这份科学吃虾指南请收好
  • 春决火爆的背后,PEL如何做大这块电竞蛋糕
  • 住建部:我国超9.4亿人生活在城镇
  • 黄仁勋的新逻辑:从“卖铲人”到“全球AI基建运营商”
  • 抖音开展“AI起号”专项治理,整治利用AI生成低俗猎奇视频等