Я думаю, что я что-то упустил в коде ниже.
from sklearn.model_selection import train_test_split
from imblearn.over_sampling import SMOTE
# Split into training and test sets
# Testing Count Vectorizer
X = df[['Spam']]
y = df['Value']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=40)
X_resample, y_resampled = SMOTE().fit_resample(X_train, y_train)
sm = pd.concat([X_resampled, y_resampled], axis=1)
как я получаю ошибку
ValueError: не удалось преобразовать строку в число с плавающей запятой: ---> 19 X_resampled, y_resampled = SMOTE().fit_resample(X_train, y_train)
Пример данных
Spam Value
Your microsoft account was compromised 1
Manchester United lost against PSG 0
I like cooking 0
Я бы подумал о преобразовании как обучающих, так и тестовых наборов, чтобы исправить проблему, вызывающую ошибку, но я не знаю, как применить к обоим. Я попробовал несколько примеров в Google, но это не решило проблему.
@StupidWolf, только для проверки качества и разделения на набор поездов, тестовый набор и набор проверки. Мне также понадобится для создания вектора признаков - матрицы терминов документа
поэтому вам нужно передать векторизованные подсчеты в smote, как предлагает ответ ниже. Я не думаю, что разумно помещать их во фрейм данных после этого. Вам не нужен фрейм данных для чего-либо нижестоящего
Я сделал что-то подобное, когда передискретизировал набор данных. Поэтому я создал несколько функций и использовал уже встроенные, которые принимают в качестве параметров train_set, test_set и valid_set после разделения исходного набора данных на train и test.
class_1 = tr_set[tr_set.Label == 1] class_0 = tr_set[tr_set.Label == 0] oversample = resample(class_1, replace=True, n_samples=len(class_0), random_state=1) over_train = pd.concat([class_0, oversample])
. Как я мог сделать что-то подобное после использования SMOTE? Разве не имеет смысла то, что я сделал для передискретизации/я хотел бы сделать для SMOTE? Я читаю много тем по этому поводу, статьи, веб-сайты... Кажется, все не имеют ни малейшего представления о том, как использовать re -выборка. Я учусь, поэтому я следую тому, что предлагают другие.
преобразовать текстовые данные в числовые перед применением SMOTE, как показано ниже.
from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer()
vectorizer.fit(X_train.values.ravel())
X_train=vectorizer.transform(X_train.values.ravel())
X_test=vectorizer.transform(X_test.values.ravel())
X_train=X_train.toarray()
X_test=X_test.toarray()
а затем добавьте свой код SMOTE
x_train = pd.DataFrame(X_train)
X_resample, y_resampled = SMOTE().fit_resample(X_train, y_train)
какова форма X_train?
Я думаю, что векторизатор подсчета работает не так, как предполагалось. сколько точек данных у вас есть в df?
Давайте продолжим обсуждение в чате.
спасибо Рави. Однако этот подход из-за toarray() кажется неработающим, когда я пытаюсь объединить x_resampled и y_resampled в уникальный набор данных: TypeError: невозможно объединить объект типа '<class 'numpy.ndarray'>'; допустимы только объекты Series и DataFrame
добавьте эту строку перед вызовом smote "x_train = pd.DataFrame(X_train)"
но эта строка перед SMOTE должна по-прежнему использовать данные без выборки, не так ли? Потому что мне нужно что-то, что можно рассматривать как поезд, который я буду использовать после SMOTE.
нет, все, что мы делаем, это преобразование из массива NumPy в фрейм данных pandas. на самом деле ошибка произошла из-за попытки использовать NumPy в конкатенации pandas.
Вы можете использовать SMOTENC вместо SMOTE. SMOTENC напрямую работает с категориальными переменными.
Токенизация ваших строковых данных перед их подачей в SMOTE является опцией. Вы можете использовать любой токенизатор, и следующая реализация факела будет выглядеть примерно так:
dataloader = torch.utils.data.DataLoader(dataset, batch_size=64)
X, y = [], []
for batch in dataloader:
input_ids = batch['input_ids']
labels = batch['labels']
X.append(input_ids)
y.append(labels)
X_tensor = torch.cat(X, dim=0)
y_tensor = torch.cat(y, dim=0)
X = X_tensor.numpy()
y = y_tensor.numpy()
smote = SMOTE(random_state=42, sampling_strategy=0.6)
X_resampled, y_resampled = smote.fit_resample(X, y)
В чем смысл снова помещать их во фрейм данных? Векторизованный счет представляет собой разреженную матрицу, и он может быть очень большим в памяти, если вы конвертируете в массив.