【问题标题】:Scikit-learn categorisation: binomial log regression?Scikit-learn 分类:二项式对数回归?
【发布时间】:2014-10-09 15:45:11
【问题描述】:

我有从 -100 到 +100 连续评分的文本。我正在尝试将它们分类为正面或负面。

如何执行二项式对数回归以获得测试数据为 -100 或 +100 的概率?

我得到的最接近的是 SGDClassifier(penalty='l2',alpha=1e-05, n_iter=10),但是当我使用二项式对数回归进行预测时,它提供的结果与 SPSS 不同-100 和 +100 的概率。所以我猜这不是正确的功能?

【问题讨论】:

  • 最好在datascience.stackexchange.com 询问这个问题?
  • 我不认为逻辑回归的 sklearn 实现可以处理概率目标。他们只做标签。不过,拥有它会很酷。

标签: python classification scikit-learn


【解决方案1】:

SGDClassifier 提供对多个线性分类器的访问,所有分类器均使用随机梯度体面进行训练。它将默认为线性支持向量机,除非您使用不同的损失函数调用它。 loss='log' 将提供概率逻辑回归。

请参阅以下位置的文档: http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.SGDClassifier.html#sklearn.linear_model.SGDClassifier

或者,您可以使用 sklearn.linear_model.LogisticRegression 通过逻辑回归对文本进行分类。

由于实施上的差异,我不清楚您是否会得到与使用 SPSS 完全相同的结果。但是,我不希望看到统计上的显着差异。

编辑添加:

我怀疑使用 SPSS 逻辑回归获得的 99% 准确度是训练集准确度,而使用 scikits-learn 逻辑回归获得的 87% 是测试集准确度。我在数据科学堆栈交换中发现了这个问题,其中一个不同的人正在尝试和极其相似的问题,并且在训练集和测试集上获得了约 99% 的准确度和 90% 的准确度。

https://datascience.stackexchange.com/questions/987/text-categorization-combining-different-kind-of-features

我推荐的前进路径如下:在 scikits-learn 中尝试几种不同的基本分类器,包括标准逻辑回归和线性 SVM,并使用数据的不同训练/测试子集重新运行 SPSS 逻辑回归数次,比较结果。如果您继续发现分类器之间存在较大差异,而无法通过确保类似的训练/测试数据拆分来解决问题,请将您看到的结果发布到您的问题中,我们可以从那里继续前进。

祝你好运!

【讨论】:

  • 谢谢,我已将其更改为SGDClassifier( penalty='l2', alpha=1e-05, n_iter=10, loss='log')。但是,我如何让它只找到概率数据在 -100 或 +100 类中?我是否只向它提供标记为 -100 或 +100 的训练数据?还是我应该设置一个属性?
  • 我相信我可以回答你的问题。如果可能的话,在晚餐后,如果没有,那么今晚晚些时候在孩子们上床睡觉后。
  • 太棒了!敬请期待。
  • 我想我需要在这里澄清一下。这些数据的特征和标签是什么,你想找到什么?我的理解是数据是文本,特征是 +100 到 -100 的范围,并且您正在尝试使用逻辑回归,而不仅仅是对 +1 / -1 进行分类,而且您还想要每个文本的概率在每个班级。这是正确的吗?
  • 是的,我正在尝试将数据二进制分类为负 -1 或正 +1。数据是评级为 -100 到 +100 的推文。这些特征是推文的 TF-IDF。我尝试了 scikit-learn 中的所有分类器,但没有得到与 SPSS 中相同的准确度。在 Scikit-learn 中,我得到大约 0.87 的精度。在 SPSS 中,对于相同的数据和拆分,我得到 0.99。我使用的 SPSS 方法尝试计算推文为 -100 或 +100 的概率,并提供概率。
【解决方案2】:

如果 pos/neg 或 pos 的概率确实是您唯一需要作为输出的东西,那么您可以导出二进制标签 y as

y = score > 0

假设你有一个 NumPy 数组 score 中的分数。

然后,您可以将其提供给LogisticRegression 实例,使用连续得分来推导样本的相对权重:

clf = LogisticRegression()
sample_weight = np.abs(score)
sample_weight /= sample_weight.sum()
clf.fit(X, y, sample_weight)

这为得分为 ±100 的推文赋予最大权重,为标记为中性的推文赋予零权重,两者之间呈线性变化。

如果数据集非常大,那么正如@brentlance 所示,您可以使用SGDClassifier,但如果您想要逻辑回归模型,则必须提供loss="log";否则,你将得到一个线性 SVM。

【讨论】:

    猜你喜欢
    • 2020-10-10
    • 2014-06-19
    • 2013-06-20
    • 1970-01-01
    • 2021-12-24
    • 2014-06-17
    • 2017-01-12
    • 2020-08-08
    • 2018-04-02
    相关资源
    最近更新 更多