L4 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_split

X_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 值对模型性能至关重要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值