我有一个不平衡的数据集,包含在名为 city_country 的数据框中,该数据框由5列组成:
在名为 city_country 的数据框中,类( event_id )是不平衡的。在测试不同文本分类器的预测能力之前,要根据一条推文(已预处理)的内容来预测 event_id ,我想对少数类进行过度采样。
重要的是,当我复制属于少数类的条目时,必须复制所有5列。
到目前为止,我所做的(错误地)只是对tweet内容(预处理和 event_id )进行了过度采样。在下面的代码中,我将tweet转换为矢量(这是我不想做的,但据我所知我必须这样做,然后过度代表少数派类,这只会对矢量化推文( x_words )和event_id( y )。
tfidf_words = TfidfVectorizer(sublinear_tf=True, min_df=0, norm='l2', encoding='latin-1', ngram_range=(1,1), stop_words='english')
x_words = tfidf_words.fit_transform(city_country.preprocessed).toarray()
# new dataframe 'label' that contains the event_id for each preprocessed tweet
y = city_country.event_id
x_train_words, x_test_words, y_train, y_test = train_test_split(x_words, y, test_size = 0.25, random_state = 0)
# Use SMOTE to oversample the minority classes
from imblearn.over_sampling import SMOTE
sm = SMOTE(random_state=12)
x_train_words_sm, y_train_words_sm = sm.fit_sample(x_train_words, y_train)
# Count the number of occurences in the y_train sets to ensure that the oversampling worked
from collections import Counter
class_check_woSMOTE = Counter(y_train)
class_check_words = Counter(y_train_words_sm)
据我所知,在 imblearn.over_sampling 中使用 SMOTE 要求您提供实际值(而不是字符串),并且只提供2个值-“ x”和'y'。在这种情况下,“ x”是我的推文矢量化训练集,而“ y”是我的事件标签。
是否有一种方法可以将我的数据帧简单地分为训练和测试集,然后对少数类对所有5列进行过采样,以便输出是包含所有5列的较大数据帧?然后,我可以使用它来预测event_id并希望执行与vlookup等效的操作,以便可以将推文及其各自的 lat 和 long 值加入。
答案 0 :(得分:0)
SMOTE可以接受sparse_vector作为输入。您可以进行过度采样,然后分成测试/训练集。
如果我正确理解了您的问题,以下内容对我有用;
尝试以下操作:
from sklearn.feature_extraction.text import Tfidfvectorizer
from imblearn.over_sampling import SMOTE
strings = city_country.preprocessed
def create_vec(strings):
tf = TfidfVectorizer(analyzer = 'char_wb',ngram_range=(2,3))
tf.fit(strings)
X = tf.transform(strings)
return X
vecs = create_vec(strings)
y = city_country.event_id
sm = SMOTE(random_state=42)
X_res, y_res = sm.fit_resample(X, y)
然后您可以根据输出进行拆分