我有一个很不平衡的多标签数据集。
结果出现意想不到的事情。正如预期的那样,使用逻辑回归分类器,具有更高频率的标签实现了合理的f1分数和auc分数(即:0.6-0.7),并且那些数据中表示少于10%的标签预期为f-1和0.5的0。对于auc-score。
但是当我使用SVC和朴素贝叶斯分类器运行相同的东西时,这些低频标签中的一些(例如:7000个样本中的一个,次要类可能有10个样本)显示100%准确度,f-1 ,精确,召回和auc-score,我不明白。鉴于这种低培训样本,我不相信这些完美的结果。我还尝试了不同的随机种子来分割训练和测试集,并得到了相同的结果。
量词
Logistic regression classifier
Pipeline(memory=None,
steps=[('tfidf', TfidfVectorizer(analyzer='word', binary=False, decode_error='strict',
dtype=<class 'numpy.int64'>, encoding='utf-8', input='content',
lowercase=True, max_df=1.0, max_features=None, min_df=1,
ngram_range=(1, 1), norm='l2', preprocessor=None, smooth_idf=True,
..._state=None, solver='sag', tol=0.0001,
verbose=0, warm_start=False),
n_jobs=1))])
Naive Bayes classifier
Pipeline(memory=None,
steps=[('tfidf', TfidfVectorizer(analyzer='word', binary=False, decode_error='strict',
dtype=<class 'numpy.int64'>, encoding='utf-8', input='content',
lowercase=True, max_df=1.0, max_features=None, min_df=1,
ngram_range=(1, 1), norm='l2', preprocessor=None, smooth_idf=True,
...assifier(estimator=MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True),
n_jobs=1))])
SVC classifier
Pipeline(memory=None,
steps=[('tfidf', TfidfVectorizer(analyzer='word', binary=False, decode_error='strict',
dtype=<class 'numpy.int64'>, encoding='utf-8', input='content',
lowercase=True, max_df=1.0, max_features=None, min_df=1,
ngram_range=(1, 1), norm='l2', preprocessor=None, smooth_idf=True,
...lti_class='ovr', penalty='l2', random_state=None, tol=0.0001,
verbose=0),
n_jobs=1))])
答案 0 :(得分:0)
对我来说,你的结果似乎至少可信。 Logistic回归趋向于数据的中值表征,找到一个方程来表征类之间的差异。鉴于非平凡数量的数据,它寻找适合该等式的最小误差。
SVC和贝叶斯对可辨别的边界更加敏感,即使远离“主流数据”。这些算法更多地依赖于每个类别的“我们对抗世界”(又名“一对一”)。我不会感到惊讶的是,他们可以找到一种合理的方法来区分一组十个元素和“其他一切”。您能找到一个有用的可视化工具来显示每种方法找到的边界吗?如果没有,您是否可以至少可视化数据集,并使用颜色编码的观察结果?如果你可以看到一组十个点的明显分离,那么我期望 SVC或朴素贝叶斯找到可比的东西。
答案 1 :(得分:0)
您是否检查过这些指标计算了多少个样本?如果存在,例如,考虑到测试样品的数量很少,那么仅两个样品进行100%的测试就不那么奇怪了。
此外,由于您的数据不平衡,您是否考虑过采用诸如平衡精度或Mathews相关系数(MCC)之类的方法来深入了解预测性能?模型可以具有很高的AUC,而完全忽略少数派。如果这也与例如测试集中的多数类样本相吻合,那么这也可能导致这些意外结果。