文本分类中的不平衡数据集

数据挖掘 Python nlp 阶级失衡 不平衡学习
2022-03-01 04:46:50

我有一个从 Facebook 收集的数据集,包含 10 个类,每个类有 2500 个帖子,但是当计算每个类中唯一单词的数量时,它们的计数不同,如图所示每个班级的字数

这是由于字数导致的不平衡问题,还是根据帖子数量平衡的问题。如果不平衡,最好的解决方案是什么?

更新 我的 python 代码:

data = pd.read_csv('E:\cluster data\One_File_nonnormalizenew2norm.txt', sep="*")

data.columns = ["text", "class1"]
data.dropna(inplace=True)
data['class1'] = data.class1.astype('category').cat.codes
text = data['text']

y = (data['class1'])
sentences_train, sentences_test, y_train, y_test = train_test_split(text, y, test_size=0.25, random_state=1000)
from sklearn.feature_extraction.text import CountVectorizer
num_class = len(np.unique(data.class1.values))



vectorizer = CountVectorizer()
vectorizer.fit(sentences_train)

X_train = vectorizer.transform(sentences_train)
X_test  = vectorizer.transform(sentences_test)

model = Sequential()
max_words=5000
model.add(Dense(512, input_shape=(60874,)))
model.add(Dense(20,activation='softmax'))####
model.summary()
model.compile(loss='sparse_categorical_crossentropy',
  optimizer='rmsprop',
  metrics=['accuracy'])

model.fit(X_train, y_train,batch_size=150,epochs=10,verbose=2,validation_data=(X_test,y_test),shuffle=True)
predicted = model.predict(X_test)
predicted = np.argmax(predicted, axis=1)
accuracy_score(y_test, predicted)
predicted = model.predict(X_test)
predicted = np.argmax(predicted, axis=1)
accuracy_score(y_test, predicted)

0.9592031872509961
3个回答

谢谢你的消息艾哈迈德。有几点需要指出:

  1. 这是一个不平衡的问题吗?哪个问题?不是问题。这是数据。
  2. 将进行什么分析?在某些情况下,您需要帖子,而在某些情况下,您需要这些关键字。
  3. 该分析将采用什么方法?一些方法获取关键字作为输入,一些获取帖子。

但是关于数字本身;不必要。最小的类别拥有最大人口的 20%,而且规模相当大(20000 个样本)。所以它不一定是不平衡的类分布。再次,看看你想用这些数据做什么。这决定了答案更加准确。

希望它有所帮助。如果你写下你想做的任务,我可以在这里发布解决方案。

干杯,

更新

好吧,那么问题就很简单了。这些独特的词在这里可能没有多大意义。我当然建议您首先尝试使用 BoW 模型(TF-IDF经典 BoW)来对您的语料库进行建模。然后调整模型的超参数并使用简单的多项朴素贝叶斯,您将获得可接受的结果。

不平衡的数据不算在内。我遇到了一个问题,有些班级有 3000-4000 个样本,有些只有 20 个!这当然被称为不平衡,但在这里你仍然有足够的数据来代表你的少数类,而且你将使用 Precision-Recall 进行评估而不是 Accuracy,所以你会没事的。我强烈建议你看看这个Python 实现,并在实践中看到一些不平衡的数据。

DL的事情在评论中得到了回答。

我现在不知道你的问题是否正确。但是,如果你计算一个类中的所有单词,例如,单词“the”在每次出现时都会被计算在内。但是,如果您计算唯一词,则“the”一词将被计算一次。这就是为什么您的计数与您的情节不同的原因。每个类可以有不同数量的唯一词。

这是处理字数不平衡的简单方法。

您可以首先使用词嵌入转换标记的表示。有两种非常流行的公开可用模型:Word2Vec 和 GloVe。词嵌入非常有用,因为它们捕获了普通 BOW 模型中通常不可用的潜在语义和词汇信息。

https://nlp.stanford.edu/projects/glove/ https://radimrehurek.com/gensim/models/word2vec.html

接下来,使用词嵌入,对数据集中每个示例的集合取平均值。这将在某种意义上平衡类,因为您本质上是将问题简化为每个示例的平均嵌入表示。假设每个类的示例数量是平衡的,那么您的平衡问题就解决了。还可以考虑进行停用词过滤以删除无用的术语。

然后,您可以使用该表示作为您选择的分类模型的输入 - SVM、随机森林、逻辑回归等......但这是它自己要解决的问题。

您所做的每种特征工程都需要权衡取舍。请注意这一点并尽职尽责地评估这种类型的预处理将对您的结果产生何种类型的系统影响(如果有的话)。