- 🍨 本文为🔗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=1∑N(xi,n−xj,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 值对模型性能至关重要。