【问题标题】:ValueError: Setting an array element with a sequence - ImblearnValueError:使用序列设置数组元素 - Imblearn
【发布时间】:2024-05-15 23:15:02
【问题描述】:

我正在尝试从 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_over = oversampler.fit_resample(X,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 所必需的

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

【问题讨论】:

  • “'a' 列的每一行都是长度为 118 的 'list' 类型”是什么意思?它是一个字符串还是一个浮点数列表?
  • 整数列表。我已经编辑了我的问题以明确这一点。

标签: python arrays numpy scikit-learn imblearn


【解决方案1】:

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

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,(100,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

【讨论】: