imblearn.oversampling SMOTENC ValueError



这是我第一次使用SMOTENC对分类数据进行上采样。然而,我一直在犯错。你能建议我在SMOTENC中应该通过什么类别功能吗?

from imblearn.over_sampling import SMOTENC
x=df.drop("A",1)
y=df["A"]
smote_nc = SMOTENC(categorical_features=['A','B','C','D','E','F','G','H'], random_state=0)
X_resampled, y_resampled = smote_nc.fit_resample(x, y)

错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-26-f6c9d8a17967> in <module>
---> 14 X_resampled, y_resampled = smote_nc.fit_resample(x, y)
15 #sm = SMOTE(random_state=100)
16 #ros = RandomOverSampler()
~/.local/lib/python3.5/site-packages/imblearn/base.py in fit_resample(self, X, y)
82             self.sampling_strategy, y, self._sampling_type)
83 
---> 84         output = self._fit_resample(X, y)
85 
86         if binarize_y:
~/.local/lib/python3.5/site-packages/imblearn/over_sampling/_smote.py in _fit_resample(self, X, y)
986     def _fit_resample(self, X, y):
987         self.n_features_ = X.shape[1]
--> 988         self._validate_estimator()
989 
990         # compute the median of the standard deviation of the minority class
~/.local/lib/python3.5/site-packages/imblearn/over_sampling/_smote.py in _validate_estimator(self)
979                 raise ValueError(
980                     'Some of the categorical indices are out of range. Indices'
--> 981                     ' should be between 0 and {}'.format(self.n_features_))
982             self.categorical_features_ = categorical_features
983         self.continuous_features_ = np.setdiff1d(np.arange(self.n_features_),
ValueError: Some of the categorical indices are out of range. Indices should be between 0 and 7

根据文档:

categorical_features : ndarray, shape (n_cat_features,) or (n_features,)
Specified which features are categorical. Can either be:
- array of indices specifying the categorical features;
- mask array of shape (n_features, ) and ``bool`` dtype for which
``True`` indicates the categorical features.

所以,只需更换

smote_nc = SMOTENC(categorical_features=['A','B','C','D','E','F','G','H'], random_state=0)

使用

smote_nc = SMOTENC(categorical_features=[df.dtypes==object], random_state=0)

试试这个:

categorical_feature_mask = df.dtypes == object
smt=SMOTENC(categorical_features=categorical_feature_mask,random_state=99)

最新更新