多类平衡的 SMOTE 改变了我的数据集的形状

数据挖掘 Python 神经网络 多类分类 朱庇特 打击
2022-03-03 22:06:13

所以我有一个形状数据集(430,17),它由 13 个类(不平衡)和 17 个特征组成。最终目标是创建一个 NN,当我导入不平衡数据集时它会起作用,但是当我尝试在 jupyter notebook 中使用 SMOTE 对少数类进行过度采样时,这些类确实得到了平衡,但形状也会发生变化。

from imblearn.over_sampling import SMOTE
from sklearn.preprocessing import OneHotEncoder
from imblearn.pipeline import Pipelineenter 

steps = [('onehot', OneHotEncoder()), ('smt', SMOTE())]
pipeline = Pipeline(steps=steps)

X_res, y_res = pipeline.fit_resample(X, y)

y_res 形状是 (754,) 从 y 形状是 (430,),所以上采样工作,也通过检查:

unique, counts = np.unique(y_res, return_counts=True)
print(np.asarray((unique, counts)).T)

班级已经平衡。但是,X_res 形状现在已从 (430, 17) 的 X 形状更改为 (754, 5553)。然后,如果我将这些数据放入我的 NN 中,它当然不起作用,因为我的输入层的 input_dim 已经改变。

我的问题是,SMOTE 过程是否不仅添加了行来平衡类,还添加了列? 我不应该得到形状为 (754, 17) 的 X_res 吗?并且因为我需要为 NN 提供这些数据,所以它们必须是数组或 numpys,而不是 pd.dataframes,这也很难理解 5553 列的来源。

我是 python 和 jupyter 的新手,所以我不知道如何解决这个问题,我非常感谢任何帮助:)

1个回答

您的理解是正确的:像 SMOTE 这样的数据平衡技术只会添加/删除行(数据点)而不是列(特征)。我怀疑您的额外尺寸是由于单热编码造成的。