L4 KNN 算法

devtools/2024/10/18 20:02:49/
  • 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
  • 🍖 原作者:K同学啊
    KNN 算法用于约会数据集分类

在这周中,学习如何使用 K 近邻(K-Nearest Neighbors, KNN)算法对一个约会数据集进行分类。KNN 是一种简单的、基于实例的分类算法,广泛用于解决分类和回归问题。

1. KNN 算法简介

KNN 算法的核心思想是:给定一个样本点,找到其在特征空间中最接近的 ( k ) 个邻居,然后通过邻居的类别多数投票来决定该样本的分类。它是一个非参数的、基于距离的算法

1.1 公式推导

在 KNN 中,欧氏距离(Euclidean Distance)是最常用的距离度量方式,其公式为:

d ( x i , x j ) = ∑ n = 1 N ( x i , n − x j , n ) 2 d(x_i, x_j) = \sqrt{\sum_{n=1}^{N} (x_{i,n} - x_{j,n})^2} d(xi,xj)=n=1N(xi,nxj,n)2

其中:

  • ( d(x_i, x_j) ) 表示样本 ( x_i ) 和 ( x_j ) 之间的距离,
  • ( x_{i,n} ) 和 ( x_{j,n} ) 分别是样本 ( x_i ) 和 ( x_j ) 在第 ( n ) 个特征上的值,
  • ( N ) 是特征的总数。

通过计算测试样本与所有训练样本之间的距离,我们可以选出距离最近的 ( k ) 个邻居,并通过它们的类别标签来决定测试样本的分类结果。

2. 数据集介绍

我们使用的是一个模拟的约会数据集 datingTestSet2.txt,每一行包含 3 个特征以及 1 个标签(类别)。这些特征可能代表不同的度量,比如:

  • 每年获得的飞行常客里程数,
  • 玩游戏所占的时间百分比,
  • 每周消费的冰淇淋公升数。

3. Python 代码实现

接下来,我们通过 Python 实现 KNN 算法的分类过程,包括数据加载、模型训练和评估。

3.1 加载数据集

首先,我们通过 pandas 加载数据集,并将前 3 列作为特征,最后一列作为标签。

import pandas as pd# 加载约会数据集
data = pd.read_table('data/datingTestSet2.txt', sep='\t', header=None)
data.head()# 提取特征矩阵 X 和目标变量 y
X = data.iloc[:,:3]
y = data.iloc[:,3]
3.2 划分训练集与测试集

使用 train_test_split 函数将数据划分为 75% 的训练集和 25% 的测试集。

from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=3)
3.3 构建与训练 KNN 模型

我们使用 Scikit-learn 提供的 KNeighborsClassifier 进行模型构建。通过 fit 函数在训练集上训练模型。

from sklearn.neighbors import KNeighborsClassifier# 实例化 KNN 模型
knc = KNeighborsClassifier()# 训练模型
knc.fit(X_train, y_train)
3.4 模型预测与评估

训练好模型后,我们使用 predict 函数对整个数据集进行预测,并将结果加入到数据框中。同时,我们使用 score 函数评估模型在测试集上的准确率。

# 使用训练好的模型进行预测
data["预测结果"] = knc.predict(data.iloc[:,:3])# 输出前 10 行数据,包含原始数据和预测结果
print(data.head(10))# 计算模型在测试集上的准确率
scoreK = knc.score(X_test, y_test)
print(f"模型准确率: {scoreK}")
3.5 标准化数据(可选)

由于 KNN 基于距离进行分类,如果特征的量纲差异很大,可能会导致某些特征主导距离的计算,因此建议在 KNN 模型前对数据进行标准化。

from sklearn.preprocessing import StandardScaler# 对特征进行标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)# 重新划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.25, random_state=3)# 训练标准化后的 KNN 模型
knc.fit(X_train, y_train)

4. 结果与评估

当我们运行上述代码后,模型将对测试集进行预测,并输出测试集上的准确率。
在这里插入图片描述

模型准确率: 0.796

5. 超参数调优

KNN 模型的性能高度依赖于参数 ( k ) 的选择,常用的优化方法包括交叉验证来寻找最佳的 ( k ) 值。此外,正如上文提到的,特征标准化也是提升 KNN 模型性能的常用方法。

我们可以通过如下代码调整 ( k ) 值:

# 实例化 KNN 模型,设置 k 值
knc = KNeighborsClassifier(n_neighbors=5)# 训练并评估模型
knc.fit(X_train, y_train)

6. 总结

KNN 算法是一种简单易用的分类算法,它的优点在于无需显式的训练过程,适合小规模的数据集,但在面对大数据集时计算复杂度较高。此外,特征的标准化和合理选择 k 值对模型性能至关重要。


http://www.ppmy.cn/devtools/123028.html

相关文章

HTB:Oopsie[WriteUP]

目录 连接至HTB服务器并开启靶机 1.With what kind of tool can intercept web traffic? 2.What is the path to the directory on the webserver that returns a login page? 3.What can be modified in Firefox to get access to the upload page? 4.What is the acc…

前端练习小项目 —— 让图片变得更 “色”

前言:相信读者在学习完了HTML、CSS和JavaScript之后已经想要迫不及待的想找一个小型的项目来练练手,那么这篇文章就正好能满足你的 “需求”。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 在开始学习…

用java编写飞机大战

游戏界面使用JFrame和JPanel构建。背景图通过BG类绘制。英雄机和敌机在界面上显示并移动。子弹从英雄机发射并在屏幕上移动。游戏有四种状态:READY、RUNNING、PAUSE、GAMEOVER。状态通过鼠标点击进行切换:点击开始游戏(从READY变为RUNNING&am…

免费 Oracle 各版本 离线帮助使用和介绍

文章目录 Oracle 各版本 离线帮助使用和介绍概要在线帮助下载离线文档包:解压离线文档:访问离线文档:导航使用:目录介绍Install and Upgrade(安装和升级):Administration(管理&#…

Java Web 开发

Java Web 开发是指使用 Java 编程语言及相关技术进行 Web 应用程序开发的过程。随着互联网的迅猛发展,Java Web 开发已成为企业级应用开发的主流方式之一。本文将全面探讨 Java Web 开发的历史发展、应用场景、示例以及未来发展趋势。 2. Java Web 开发的历史发展 2.1 Java …

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-04

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-04 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-04目录1. A Multiple-Fill-in-the-Blank Exam Approach for Enhancing Zero-Resource Hallucination Detection in Large Langua…

Qt小bug — LINK : fatal error LNK1158: 无法运行“rc.exe“

Qt小bug —— LINK :fatal error LNK1158:无法运行"rc.exe" 环境 Qt 5.14.2 MSVC 2015 x64 现象 解决 在电脑上找到rc.exe 和rcdll.dll (一般在C:\Program Files(x86)\Windows Kits*\bin\x64下面)拷贝到 C:\Qt\Qt5…

idea远程连接docker

idea远程连接docker docker、ubuntu、linux、远程连接、IntelliJ idea注意!本文中开启docker远程连接的方法只能在确定环境安全的内网中使用,不可在公网服务器设置,有极大安全风险! 注意!本文中开启docker远程连接的…