多类分类:连续多列的SMOTE过采样

时间:2018-07-19 12:35:25

标签: python text-classification oversampling

我有一个不平衡的数据集,包含在名为 city_country 的数据框中,该数据框由5列组成:

  1. tweet的内容= 已预处理
  2. 事件类型(例如,与地震有关的推文=“地震”,台风=“台风”等)= event_type
  3. 发推文的纬度= 纬度
  4. 发送推文的经度=
  5. 事件标签(例如,与地震相关的推文= 1,台风= 2,等等)= event_id

在名为 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 值加入。

1 个答案:

答案 0 :(得分:0)

imblearn.over_sampling中的

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)

然后您可以根据输出进行拆分