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)
放在带有相应标签的数据帧中。这可能吗?