ValueError:使用序列设置数组元素 - Imblearn

问题描述

我正在尝试从 imblearn 中进行 SMOTE 过采样。这是我的代码

X = data[['a','b','c']]
y = data['targets']

oversampler = SMOTE(random_state=42)

X_over,y_over = oversampler.fit_resample(X,y)

而且,最后一行 X_over,y) 引发错误 setting an array elemenet with a sequence

我确定原因是因为我的“X”的形状。

X 是一个数据框,其中列 'a' 的每一行是一个长度为 118 的列表,列 'b' 的每一行都是一个长度为 15 的列表,列 'c' 是一个整数列。

例如

a(length - 118)                 b(length -15)                            c

[1,2,3,4,.....0]                [4,7,8,9...0]                            3

现在,我如何将此数据帧 X 转换为形状数组 (n_samples,n_features),根据 documentation

有人可以帮我转换输入数据框以消除此错误吗?

解决方法

您可以展开列,首先检查长度是否相同:

import pandas as pd
import numpy as np
from imblearn.over_sampling import SMOTE

data = pd.DataFrame({'targets':np.random.binomial(1,0.15,100),'a':np.random.randint(0,10,(100,2)).tolist(),'b':np.random.randint(11,20,3)).tolist(),'c':np.random.randint(0,100,100)
})

data['a'].apply(len).value_counts()
2    100

扩展列的功能,新列将被命名为例如 a0..aN,并且之前的列表列将被删除:

def expand_cols(da,col_list):
    for C in col_list:
        ix = [C+str(i) for i in range(len(da[C][0]))]
        da[ix] = pd.DataFrame(data[C].tolist(),columns = ix)
    
    da = da.drop(col_list,axis=1)
    return da

您的代码,我们会在合适时对其进行扩展:

X = data[['a','b','c']]
y = data['targets']

oversampler = SMOTE(random_state=42)

X_over,y_over = oversampler.fit_resample(expand_cols(X,['a','b']),y)

看起来像这样:

X_over.head()

    c  a0  a1  b0  b1  b2
0  67   4   0  19  15  16
1  12   3   7  12  17  19
2  41   8   9  15  18  18
3  35   8   0  11  13  11
4  46   0   5  12  12  12