1

我正在处理一个只包含分类特征的数据框。为了重现我面临的问题,我将制作以下示例:

d = {'col1':['a','b','c','a','c','c','c','c','c','c'],
     'col2':['a1','b1','c1','a1','c1','c1','c1','c1','c1','c1'],
     'col3':[1,2,3,2,3,3,3,3,3,3]}
data = pd.DataFrame(d)

我要将数据拆分为测试和训练,并将 col3 作为我的目标特征。

train_data, test_data = train_test_split(data, test_size=0.2)
train_data = train_data.reset_index(drop=True)
test_data = test_data.reset_index(drop=True)

X_train = train_data.drop(['col3'], axis = 1)
X_test = test_data.drop(['col3'], axis = 1)
y_train = train_data["col3"]
y_test = test_data["col3"]

在 X_train 中,col1 和 col2 是我的分类特征,因此索引 0 和 1,因此我将 SMOTE-NC 执行为:

from imblearn.over_sampling import SMOTENC
cat_indx =[0,1]
sm = SMOTENC(categorical_features= cat_indx, random_state=0)
X_train_res, y_train_res = sm.fit_resample(X_train, y_train)

为此我收到以下错误:

ValueError: SMOTE-NC is not designed to work only with categorical features. It requires some numerical features.

鉴于 SMOTE-NC 旨在处理分类变量这一事实,我想知道如何解决这个问题?另请注意,我的目标变量是多类的,而不是二进制的,我认为这不会在这个级别引起任何问题。

4

1 回答 1

4

请注意,算法名称中的首字母 NC 表示Nominal-Continuous;正如错误消息明确指出的那样,该算法并非仅适用于分类(名义)特征。

要了解为什么会这样,您必须深入研究原始SMOTE 论文;引用相关部分(强调我的):

虽然我们的 SMOTE 方法目前不能处理具有所有名义特征的数据集,但它被推广到处理连续和名义特征的混合数据集 。我们将这种方法称为合成少数过采样 TEchnique-Nominal Continuous [SMOTE-NC]。我们在 UCI 存储库中的成人数据集上测试了这种方法。SMOTE-NC 算法如下所述。

  1. 中值计算:计算少数类所有连续特征的标准差的中值。如果样本与其潜在的最近邻居之间的名义特征不同,则该中值将包含在欧几里德距离计算中。我们使用中值来惩罚名义特征的差异,其数量与连续特征值的典型差异相关。
  2. 最近邻计算:使用连续特征空间计算正在识别 k 最近邻的特征向量(少数类样本)与其他特征向量(少数类样本)之间的欧几里德距离。对于所考虑的特征向量与其潜在最近邻之间的每个不同的标称特征,在欧几里得距离计算中包括先前计算的标准差的中值。

因此,很明显,为了使算法工作,它至少需要一个连续特征。这不是这里的情况,因此该算法在步骤 1(中值计算)期间毫无疑问会失败,因为没有任何连续特征可用于中值计算。

于 2020-11-19T03:05:36.080 回答