Мы написали следующий код, где нам нужно классифицировать данный документ по отрасли, которой он принадлежит. Но фактические данные сильно несбалансированы, и поэтому мы подумали о применении методов избыточной выборки для повышения предсказуемости. Ниже приведена часть кода, в которой мы пытаемся применить метод выборки:
my_tags = list(df['label'].unique())
df['text'].apply(lambda x: len(x.split(' '))).sum()
X = df.text
y = df.label
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state = 42)
tv = TfidfVectorizer(stop_words=None, max_features=100000)
encoder = preprocessing.LabelEncoder()
y_tfidf = pd.Series(encoder.fit_transform(y))
X_tfidf = pd.DataFrame(tv.fit_transform(X))
ros = RandomOverSampler(random_state=777)
X_ROS, y_ROS = ros.fit_resample(X_tfidf, y_tfidf)
Мы смогли запустить RandomOverSampler, но столкнулись со следующей ошибкой для SMOTE
AttributeError
Traceback (most recent call last)
<ipython-input-30-fd4d6778ffbf> in <module>
----> 1 X_smote, y_smote = smotenc.fit_resample(X_tfidf, y_tfidf)
******************\lib\site-packages\imblearn\base.py in fit_resample(self, X, y)
73 """
74 check_classification_targets(y)
---> 75 X, y, binarize_y = self._check_X_y(X, y)
76
77 self.sampling_strategy_ = check_sampling_strategy(
******************\lib\site-packages\imblearn\over_sampling\_smote.py in _check_X_y(self, X, y)
909
910 y, binarize_y = check_target_type(y, indicate_one_vs_all=True)
--> 911 X, y = check_X_y(X, y, accept_sparse=["csr", "csc"], dtype=None)
912 return X, y, binarize_y
913
******************\lib\site-packages\sklearn\utils\validation.py in check_X_y(X, y, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, multi_output, ensure_min_samples, ensure_min_features, y_numeric, warn_on_dtype, estimator)
753 ensure_min_features=ensure_min_features,
754 warn_on_dtype=warn_on_dtype,
--> 755 estimator=estimator)
756 if multi_output:
757 y = check_array(y, 'csr', force_all_finite=True, ensure_2d=False,
******************\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)
576 if force_all_finite:
577 _assert_all_finite(array,
--> 578 allow_nan=force_all_finite == 'allow-nan')
579
580 if ensure_min_samples > 0:
******************lib\site-packages\sklearn\utils\validation.py in _assert_all_finite(X, allow_nan, msg_dtype)
62 # for object dtype data, we only check for NaNs (GH-13254)
63 elif X.dtype == np.dtype('object') and not allow_nan:
---> 64 if _object_dtype_isnan(X).any():
65 raise ValueError("Input contains NaN")
66
AttributeError: 'bool' object has no attribute 'any'
Обратите внимание, что RandomOverSampler хорошо работает с данными, но не SMOTE (ошибка показана выше), SMOTE-N C. Также пробовал ADASYN, но возвращал различный тип ошибки для каждой техники. Не удалось определить причину проблемы root