SMOTE为所有分类数据集提供数组大小/ ValueError
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SMOTE为所有分类数据集提供数组大小/ ValueError相关的知识,希望对你有一定的参考价值。
我正在使用SMOTE-NC对我的分类数据进行过采样。我只有1个功能和10500个样本。
运行以下代码时,出现错误:
---------------------------------------------------------------------------
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)
~AppDataLocalContinuumMiniconda3envsdata-sciencelibsite-packagesimblearnase.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))
~AppDataLocalContinuumMiniconda3envsdata-sciencelibsite-packagesimblearnover_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)
~AppDataLocalContinuumMiniconda3envsdata-sciencelibsite-packagessklearnutilsvalidation.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.
代码:
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 X1。我不确定为什么在ValueError中将其视为shape =(10500,0)
有人可以在这里帮助我吗?
我针对数据中的单个分类特征,针对docs中的示例重现了您的问题:
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)
给出相同的错误:
ValueError: Found array with 0 feature(s) (shape=(1000, 0)) while a minimum of 1 is required.
原因实际上很简单,但是您必须对原始内容SMOTE paper进行一些挖掘;引用相关的section(强调我的意思):
虽然我们的SMOTE方法目前不not使用all名义特征,一般用于处理mixed个连续和名义特征。我们称这种方法为合成少数民族过采样技术-名义连续[SMOTE-NC]。我们在UCI存储库中的Adult数据集上测试了这种方法。的SMOTE-NC算法如下所述。
- 中位数计算:计算少数类所有连续特征的标准偏差的中位数。如果名义上样本与其潜在的最近邻居之间的特征不同,然后将该中值包括在欧几里得距离计算中。我们使用中位数惩罚名义特征的差异一定数量与连续特征的典型差异有关价值观。
- 最近邻居计算:计算k个最近邻居所在的特征向量之间的欧几里得距离识别(少数族裔样本)和其他特征向量(少数族裔样本)使用continuous特征空间。对于每个考虑的特征向量与其潜在的最近邻居,包括标准的中位数欧氏距离计算中先前计算的偏差。
换句话说,虽然没有明确说明,但是很明显,为了使算法起作用,它需要至少一个连续特征。这里不是这种情况,因此算法出人意料地失败了。
我想在内部,在第1步中,算法会暂时从数据中删除所有分类特征;这样做确实会遇到(1000, 0)
的形状(或您的情况下为(10500, 0)
的形状),即没有数据,因此错误消息中的特定引用。
因此,这里没有任何实际的编程问题可解决-只是您尝试使用SMOTE-NC算法实际上是不可能的。
以上是关于SMOTE为所有分类数据集提供数组大小/ ValueError的主要内容,如果未能解决你的问题,请参考以下文章