首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SMOTE给出了所有类别数据集的数组大小/ ValueError

SMOTE给出了所有类别数据集的数组大小/ ValueError
EN

Stack Overflow用户
提问于 2020-05-16 01:18:14
回答 1查看 492关注 0票数 1

我使用SMOTE-NC对分类数据进行过采样。我只有一个功能和10500个样本。

在运行下面的代码时,我得到了错误:

代码语言:javascript
复制
   ---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-151-a261c423a6d8> in <module>()
     16 print(X_new.shape) # (10500, 1)
     17 print(X_new)
---> 18 sm.fit_sample(X_new, Y_new)

~\AppData\Local\Continuum\Miniconda3\envs\data-science\lib\site-packages\imblearn\base.py in fit_resample(self, X, y)
     81         )
     82 
---> 83         output = self._fit_resample(X, y)
     84 
     85         y_ = (label_binarize(output[1], np.unique(y))

~\AppData\Local\Continuum\Miniconda3\envs\data-science\lib\site-packages\imblearn\over_sampling\_smote.py in _fit_resample(self, X, y)
    926 
    927         X_continuous = X[:, self.continuous_features_]
--> 928         X_continuous = check_array(X_continuous, accept_sparse=["csr", "csc"])
    929         X_minority = _safe_indexing(
    930             X_continuous, np.flatnonzero(y == class_minority)

~\AppData\Local\Continuum\Miniconda3\envs\data-science\lib\site-packages\sklearn\utils\validation.py in check_array(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, warn_on_dtype, estimator)
    592                              " a minimum of %d is required%s."
    593                              % (n_features, array.shape, ensure_min_features,
--> 594                                 context))
    595 
    596     if warn_on_dtype and dtype_orig is not None and array.dtype != dtype_orig:

ValueError: Found array with 0 feature(s) (shape=(10500, 0)) while a minimum of 1 is required.

代码:

代码语言:javascript
复制
from imblearn.over_sampling import SMOTE
from imblearn.over_sampling import SMOTENC

sm = SMOTENC(random_state=27,categorical_features=[0,])

X_new = np.array(X_train.values.tolist())
Y_new = np.array(y_train.values.tolist())

print(X_new.shape) # (10500,)
print(Y_new.shape) # (10500,)

X_new = np.reshape(X_new, (-1, 1)) # SMOTE require 2-D Array, Hence changing the shape of X_mew

print(X_new.shape) # (10500, 1)
print(X_new)
sm.fit_sample(X_new, Y_new)

如果我理解正确,X_new的形状应该是(n_samples,n_features),即10500 X 1。我不确定为什么在ValueError中它将其视为shape=(10500,0)。

有人能帮帮我吗?

EN

回答 1

Stack Overflow用户

发布于 2020-05-16 01:27:19

我已经重现了您的问题,将docs中的示例修改为数据中的单个分类特征:

代码语言:javascript
复制
from collections import Counter
from numpy.random import RandomState
from sklearn.datasets import make_classification
from imblearn.over_sampling import SMOTENC

X, y = make_classification(n_classes=2, class_sep=2,
 weights=[0.1, 0.9], n_informative=1, n_redundant=0, flip_y=0,
 n_features=1, n_clusters_per_class=1, n_samples=1000, random_state=10)

# simulate the only column to be a categorical feature
X[:, 0] = RandomState(10).randint(0, 4, size=(1000))
X.shape
# (1000, 1)

sm = SMOTENC(random_state=42, categorical_features=[0,]) # same behavior with categorical_features=[0]

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

这给出了相同的错误:

代码语言:javascript
复制
ValueError: Found array with 0 feature(s) (shape=(1000, 0)) while a minimum of 1 is required.

原因实际上很简单,但您必须稍微挖掘一下原始的SMOTE paper;引用相关的section (重点是我的):

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

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

换句话说,尽管没有明确说明,但很明显,为了使算法工作,它需要至少一个连续的特征。这里的情况并非如此,因此算法失败并不令人意外。

我猜测,在内部,在步骤1(中位数计算)期间,算法会暂时从数据中删除所有分类特征;在这里这样做时,它实际上面临着(1000, 0) (或在您的情况下是(10500, 0) )的形状,即没有数据,因此错误消息中有特定的引用。

因此,这里没有任何实际的编程问题需要解决,只是您尝试使用SMOTE-NC算法所做的事情实际上是不可能的(请注意,算法名称中的首字母NC的意思是Nominal Continuous)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61824892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档