Python 如何在使用SMOTE进行过采样后返回文本数据作为输出?

Python 如何在使用SMOTE进行过采样后返回文本数据作为输出?,python,imblearn,Python,Imblearn,我有一个多类文本数据,由于少数标签,我想SMOTE。我已经这样做了,但是我得到了Space矩阵作为我的输出 有没有办法在SMOTE之后恢复文本数据 以下是我的代码示例: X_train = df['transcript'] y_train = df['label'] from imblearn.over_sampling import SMOTE sm = SMOTE(random_state = 2) X_train_res, y_train_res = sm.fit_sample(X_t

我有一个多类文本数据,由于少数标签,我想
SMOTE
。我已经这样做了,但是我得到了Space矩阵作为我的输出

有没有办法在SMOTE之后恢复文本数据

以下是我的代码示例:

X_train = df['transcript']
y_train = df['label']
from imblearn.over_sampling import SMOTE 
sm = SMOTE(random_state = 2) 
X_train_res, y_train_res = sm.fit_sample(X_train, y_train)

SMOTE.fit_示例
使用Scikit内部学习的
标签_二进制化

在应用
SMOTE
之前,应在
y
值上手动使用
sklearn.preprocessing.LabelBinarizer

从IMBRearn.over\u采样导入SMOTE
从sklearn.preprocessing导入LabelBinarizer
sm=SMOTE(随机状态=2)
lb=LabelBinarizer()
y_列_bin=lb.fit_变换(y_列)
X\U列,y\U列,y\U列,y\U列=sm.拟合样本(X\U列,y\U列,y\U列)
然后,您可以从安装的
LabelBinarizer恢复文本标签。逆变换方法:

y\u train\u res=lb.逆变换(y\u train\u res\u bin)

实际上
SMOTE
期望
X
仅为数字数据。这不是标签的问题,标签可以是字符串

阅读以了解SMOTE如何在内部工作。基本上,它使用所选邻居的凸组合为少数类创建一个合成数据点

因此,使用
TfidfVectorizer
CountVectorizer
将文本数据(成绩单)转换为数字。您可以使用这些矢量器的
逆变换
方法来获取文本,但问题是您会失去单词的顺序

import pandas as pd
df = pd.DataFrame({'transcripts': ['I want to check this',
                                    'how about one more sentence',
                                    'hopefully this works well fr you',
                                    'I want to check this',
                                    'This is the last sentence or transcript'],
                    'labels': ['good','bad', 'bad', 'good','bad']})
from sklearn.feature_extraction.text import TfidfVectorizer
vec = TfidfVectorizer()
X = vec.fit_transform(df['transcripts'])

from imblearn.over_sampling import SMOTE 
sm = SMOTE(k_neighbors=1, random_state = 2) 
X_train_res, y_train_res = sm.fit_sample(X, df.labels) 


vec.inverse_transform(X_train_res)
# [array(['this', 'check', 'to', 'want'], dtype='<U10'),
#  array(['sentence', 'more', 'one', 'about', 'how'], dtype='<U10'),
#  array(['you', 'fr', 'well', 'works', 'hopefully', 'this'], dtype='<U10'),
#  array(['this', 'check', 'to', 'want'], dtype='<U10'),
#  array(['transcript', 'or', 'last', 'the', 'is', 'sentence', 'this'],
#        dtype='<U10'),
#  array(['want', 'to', 'check', 'this'], dtype='<U10')]
将熊猫作为pd导入
df=pd.DataFrame({'transcripts':['I want to check this',
“再来一句怎么样?”,
“希望这对你很有效”,
“我想检查一下”,
“这是最后一句话或文字记录”],
‘标签’:[‘好’、‘坏’、‘坏’、‘好’、‘坏’]})
从sklearn.feature\u extraction.text导入TfidfVectorizer
vec=TfidfVectorizer()
X=vec.fit_变换(df['transcripts'])
从IMBRearn.over_采样导入SMOTE
sm=SMOTE(k_邻居=1,随机状态=2)
X\u序列分辨率,y\u序列分辨率=sm.fit\u样本(X,df.labels)
矢量逆变换(X列)

#[array(['this','check','to','want'],dtype='您能发布完整的代码吗?谢谢,我已经对代码进行了调整。数据位于一个包含两列的数据框中:label和transcript。我已经完成了清理。但是一些标签很小,这就是为什么我需要对其进行清理。除了清理之外,我没有做任何其他事情。我以前也尝试过,但是我遇到了一个错误t说:ValueError:无法将字符串转换为浮点:这一行:'X_train_res,y_train_res_bin=sm.fit_sample(X_train,y_train_bin)'非常感谢这一点……这很有效。我想在转换后将
向量逆变换(X_train_res)
放在带有相应标签的数据帧中。这可能吗?