SciKit Learn中的多类逻辑回归

5

我在使用Scikit的Logistic Regression来处理多类别的问题时遇到了麻烦。我正在使用lbgfs solver,并且已经将multi_class参数设置为multinomial。

对于训练模型时如何传递真实的类别标签,我并不清楚。我曾经认为它与随机森林分类器多类别问题相似/相同,可以通过传递[n_samples, m_classes]数据框来实现。然而,在这样做时,我会收到一个错误,指出数据的形状不正确。 ValueError: bad input shape (20, 5) -- 在这个小例子中,有5个类别,20个样本。

检查fit方法的文档后发现,真实值以[n_samples,]的形式传递,这与我得到的错误信息相匹配 - 然而,我不知道如何使用这种方法来训练具有多类别的模型。因此,我的问题是:如何将完整的类别标签集传递给拟合函数?

我无法在互联网上找到相关示例代码,也没有在StackOverflow上看到这个问题...但我确信有人一定知道如何解决!

在下面的代码中,train_features = [n_samples, nn_features],truth_train = [n_samples, m_classes]

clf = LogisticRegressionCV(class_weight='balanced', multi_class='multinomial', solver='lbfgs')
clf.fit(train_features, truth_train)
pred = clf.predict(test_features)
1个回答

18
您似乎将“多类别(multiclass)”和“多标签(multilabel)”的术语混淆了http://scikit-learn.org/stable/modules/multiclass.html,简而言之:
  • 多类别分类是指具有两个以上类别的分类任务; 例如,对一组水果图像进行分类,这些图像可以是橙子,苹果或梨子。 多类别分类假设每个样本都只分配给一个标签:一个水果可以是苹果或梨子,但不能同时是两者。
因此,数据为[n_samples, n_features],标签为[n_samples]
  • 多标签分类为每个样本分配一组目标标签。 可以将此视为预测数据点的属性,这些属性不是互斥的,例如文档相关的主题。 一篇文章可能同时涉及宗教、政治、金融或教育等主题,也可能没有这些内容。
因此,数据为[n_samples, n_features],标签为[n_samples, n_labels]
您似乎正在寻找多标签问题(对于多类别,标签应为一维)。 目前,在sklearn中支持多标签的唯一方法是:决策树,随机森林,最近邻居和岭回归。
如果您想使用不同的模型学习多标签问题,请简单地使用OneVsRestClassifier作为LogisticRegression周围的多标签包装器 http://scikit-learn.org/stable/modules/generated/sklearn.multiclass.OneVsRestClassifier.html#sklearn.multiclass.OneVsRestClassifier

谢谢您的回复。实际上,我正在寻找多类分类,也就是说,每个样本只属于一个类别。但是,我使用随机森林时将类别分配转换为布尔数组,这就是我得到 n x m 数组的原因。所以,如果我理解您的意思正确的话,我应该将我的类标签转换为整数,并创建一个单一的 n_sample 长度的数组,其中它可以取的值映射到不同的类标签。这样对吗?感谢您的帮助。 - Renée
是的,你应该对树也做同样的处理。否则你会拟合多标签模型。 - lejlot
@lejlot 我使用了 scikit 学习库的逻辑回归,进行标量的多重预测。在 https://dev59.com/M1oV5IYBdhLWcg3wCrPH 中,dukebody 的答案对我也起了作用。也许我误解了你的回复? - blue-sky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接