This is my first time using SMOTENC to upsampling my categorical data. However, I’ve been getting error. Can you please advice what should I pass for categorical_features in 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)
ERROR:
--------------------------------------------------------------------------- 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
Advertisement
Answer
As per documentation:
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.
So, just replace the line
smote_nc = SMOTENC(categorical_features=['A','B','C','D','E','F','G','H'], random_state=0)
with the line
smote_nc = SMOTENC(categorical_features=[df.dtypes==object], random_state=0)