处理类别不平衡的数据:K近邻算法的应用与优化
在机器学习领域中,我们经常会面对类别不平衡的数据集,其中某些类别的样本数量远远超过其他类别。这种情况下,传统的分类算法可能会受到影响,因为它们倾向于偏向于拥有更多样本的类别。K近邻(KNN)算法是一种简单而有效的分类算法,但在处理类别不平衡的数据时,需要采取一些措施以提高其性能和鲁棒性。
介绍
KNN算法是一种基于实例的学习方法,它通过查找与待分类样本最相似的K个邻居来进行分类。其基本思想是“近朱者赤,近墨者黑”,即认为样本的类别由其邻近的样本决定。
算法原理
给定一个待分类的样本$x_q$,KNN算法的分类过程如下:
- 计算$x_q$与训练集中所有样本的距离;
- 根据距离找出离$x_q$最近的K个样本;
- 统计这K个样本中每个类别的出现次数;
- 将$x_q$分配给出现次数最多的类别。
公式推导
假设样本空间中的两个样本分别为$x_i$和$x_j$,它们的特征向量分别为$\mathbf{x}i$和$\mathbf{x}_j$,则它们之间的欧氏距离$d{ij}$可以表示为:
$$
d_{ij} = \sqrt{\sum_{l=1}^{n}(x_{il} – x_{jl})^2}
$$
其中,$n$表示特征的维度。
计算步骤
- 计算待分类样本与训练集中所有样本的距离;
- 根据距离找出最近的K个样本;
- 统计这K个样本中每个类别的出现次数;
- 将待分类样本分配给出现次数最多的类别。
Python代码示例
下面是一个简单的Python示例,演示如何使用Scikit-learn库中的KNeighborsClassifier来处理类别不平衡的数据。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, classification_report
# 生成虚拟数据集
X, y = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0,
n_clusters_per_class=1, weights=[0.95, 0.05], flip_y=0, random_state=42)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 初始化KNN分类器
knn = KNeighborsClassifier(n_neighbors=5)
# 训练模型
knn.fit(X_train, y_train)
# 预测测试集
y_pred = knn.predict(X_test)
# 评估模型
print("Accuracy:", accuracy_score(y_test, y_pred))
print(classification_report(y_test, y_pred))
# 可视化决策边界
plt.figure(figsize=(8, 6))
# 生成网格点
xx, yy = np.meshgrid(np.linspace(X[:, 0].min() - 1, X[:, 0].max() + 1, 100),
np.linspace(X[:, 1].min() - 1, X[:, 1].max() + 1, 100))
Z = knn.predict(np.c_[xx.ravel(), yy.ravel()])
# 将结果可视化
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, alpha=0.8)
# 绘制训练样本和测试样本
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, marker='o', edgecolors='k', label='Train set')
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, marker='x', edgecolors='k', label='Test set')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('KNN Classifier with Imbalanced Data')
plt.legend()
plt.show()
代码细节解释
- 首先,我们使用
make_classification
函数生成了一个具有两个特征的虚拟数据集,其中一个类别的样本数量明显少于另一个类别。 - 然后,我们将数据集划分为训练集和测试集,其中80%用于训练,20%用于测试。
- 我们初始化了一个KNN分类器,并使用训练集训练了模型。
- 接下来,我们使用测试集进行预测,并评估了模型的性能。
- 最后,我们通过绘制决策边界将分类结果可视化,以便直观地了解模型的分类效果。
通过以上步骤,我们展示了如何使用KNN算法处理类别不平衡的数据,并通过Python代码实现了这一过程。 KNN算法是一种简单而有效的分类方法,但在处理类别不平衡数据时,我们需要注意调整参数以获得更好的性能。
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/828449/
转载文章受原作者版权保护。转载请注明原作者出处!