Python 语言 不平衡数据集处理 SMOTE / 欠采样 实战

Python阿木 发布于 21 小时前 1 次阅读


Python 不平衡数据集处理实战:SMOTE 与欠采样技术应用

在机器学习领域,不平衡数据集是一个常见的问题。在不平衡数据集中,某些类别的样本数量远多于其他类别,这可能导致模型偏向于多数类,从而忽略少数类的特征。为了解决这个问题,我们可以采用多种技术,如过采样、欠采样、合成样本生成(如SMOTE)等。本文将围绕Python语言,结合SMOTE和欠采样技术,进行不平衡数据集处理的实战。

1. 数据集准备

我们需要准备一个不平衡的数据集。这里我们以鸢尾花数据集为例,该数据集包含150个样本,其中三个类别(Iris-setosa、Iris-versicolor、Iris-virginica)的样本数量分别为50、50、50。

python
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

加载数据集
iris = load_iris()
X, y = iris.data, iris.target

划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

查看类别分布
print("训练集类别分布:", np.bincount(y_train))
print("测试集类别分布:", np.bincount(y_test))

2. 欠采样技术

欠采样是一种减少不平衡数据集中多数类样本数量的方法。这里我们使用`imbalanced-learn`库中的`RandomUnderSampler`类进行欠采样。

python
from imblearn.under_sampling import RandomUnderSampler

创建欠采样器
rus = RandomUnderSampler(random_state=42)

欠采样
X_resampled, y_resampled = rus.fit_resample(X_train, y_train)

查看欠采样后的类别分布
print("欠采样后训练集类别分布:", np.bincount(y_resampled))

3. SMOTE技术

SMOTE(Synthetic Minority Over-sampling Technique)是一种合成样本生成技术,通过在少数类样本之间插值生成新的样本,从而增加少数类的样本数量。

python
from imblearn.over_sampling import SMOTE

创建SMOTE生成器
smote = SMOTE(random_state=42)

SMOTE过采样
X_resampled, y_resampled = smote.fit_resample(X_train, y_train)

查看SMOTE过采样后的类别分布
print("SMOTE过采样后训练集类别分布:", np.bincount(y_resampled))

4. 模型训练与评估

接下来,我们使用过采样和欠采样后的数据集分别训练模型,并评估模型的性能。

python
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, accuracy_score

使用欠采样后的数据集训练模型
rf_rus = RandomForestClassifier(random_state=42)
rf_rus.fit(X_resampled, y_resampled)

使用SMOTE过采样后的数据集训练模型
rf_smote = RandomForestClassifier(random_state=42)
rf_smote.fit(X_resampled, y_resampled)

使用测试集评估模型
y_pred_rus = rf_rus.predict(X_test)
y_pred_smote = rf_smote.predict(X_test)

输出评估结果
print("欠采样模型评估结果:")
print(classification_report(y_test, y_pred_rus))
print("SMOTE过采样模型评估结果:")
print(classification_report(y_test, y_pred_smote))

5. 总结

本文通过Python语言,结合SMOTE和欠采样技术,对不平衡数据集进行了处理。实验结果表明,SMOTE和欠采样技术可以有效提高不平衡数据集的分类性能。在实际应用中,我们可以根据具体问题选择合适的技术,以达到最佳效果。

6. 扩展

除了SMOTE和欠采样技术,还有其他一些方法可以处理不平衡数据集,如:

- 数据增强:通过对少数类样本进行变换,生成新的样本。
- 集成学习:使用多个模型进行投票,提高少数类的分类准确率。
- 代价敏感学习:在模型训练过程中,对少数类赋予更高的权重。

在实际应用中,我们可以根据具体问题选择合适的技术,以达到最佳效果。