KNN如何处理类别不平衡的数据?

处理类别不平衡的数据:K近邻算法的应用与优化

在机器学习领域中,我们经常会面对类别不平衡的数据集,其中某些类别的样本数量远远超过其他类别。这种情况下,传统的分类算法可能会受到影响,因为它们倾向于偏向于拥有更多样本的类别。K近邻(KNN)算法是一种简单而有效的分类算法,但在处理类别不平衡的数据时,需要采取一些措施以提高其性能和鲁棒性。

介绍

KNN算法是一种基于实例的学习方法,它通过查找与待分类样本最相似的K个邻居来进行分类。其基本思想是“近朱者赤,近墨者黑”,即认为样本的类别由其邻近的样本决定。

算法原理

给定一个待分类的样本$x_q$,KNN算法的分类过程如下:

  1. 计算$x_q$与训练集中所有样本的距离;
  2. 根据距离找出离$x_q$最近的K个样本;
  3. 统计这K个样本中每个类别的出现次数;
  4. 将$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$表示特征的维度。

计算步骤

  1. 计算待分类样本与训练集中所有样本的距离;
  2. 根据距离找出最近的K个样本;
  3. 统计这K个样本中每个类别的出现次数;
  4. 将待分类样本分配给出现次数最多的类别。

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/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球