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和欠采样技术,还有其他一些方法可以处理不平衡数据集,如:
- 数据增强:通过对少数类样本进行变换,生成新的样本。
- 集成学习:使用多个模型进行投票,提高少数类的分类准确率。
- 代价敏感学习:在模型训练过程中,对少数类赋予更高的权重。
在实际应用中,我们可以根据具体问题选择合适的技术,以达到最佳效果。
Comments NOTHING