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

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

python 复制代码
# 导入包
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.neighbors import KNeighborsClassifier
python 复制代码
# 导入数据
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)
python 复制代码
# 分层操作验证
from collections import Counter
print(Counter(y_train))
print(Counter(y_test))
python 复制代码
# 数据标准化
from sklearn.preprocessing import StandardScaler
sd = StandardScaler()
X_train = sd.fit_transform(X_train)
X_test = sd.transform(X_test)
python 复制代码
# 创建模型
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)
python 复制代码
# 创建模型
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)
python 复制代码
# 训练模型
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集成了很多传统的机器学习算法,使用起来非常方便简洁。

相关推荐
九河云11 分钟前
华为云ECS与Flexus云服务器X实例:差异解析与选型指南
大数据·运维·服务器·网络·人工智能·华为云
AI优秘企业大脑12 分钟前
如何提升自动化业务流程的效率?
大数据·人工智能
这张生成的图像能检测吗13 分钟前
(论文速读)视觉语言模型的无遗忘学习
人工智能·深度学习·计算机视觉·clip·持续学习·灾难性遗忘
杰克逊的日记21 分钟前
LLM(大语言模型)
人工智能·语言模型·自然语言处理
Q_Q196328847523 分钟前
python+django/flask基于深度学习的个性化携程美食数据推荐系统
spring boot·python·深度学习·django·flask·node.js·php
夏文强24 分钟前
HarmonyOS开发-系统AI视觉能力-图片识别
人工智能·华为·harmonyos
胡耀超26 分钟前
通往AGI的模块化路径:一个可能的技术架构(同时解答微调与RAG之争)
人工智能·python·ai·架构·大模型·微调·agi
说私域28 分钟前
定制开发AI智能名片S2B2C商城小程序的发展与整合资源策略研究
人工智能·小程序
落羽的落羽29 分钟前
【C++】现代C++的新特性constexpr,及其在C++14、C++17、C++20中的进化
linux·c++·人工智能·学习·机器学习·c++20·c++40周年
User_芊芊君子40 分钟前
【深入浅出】:人工智能从入门到实战
人工智能