我在使用Scikit的逻辑回归进行多类情况时遇到了问题。我使用的是lbgfs求解器,并且已经将multi_class参数设置为multinomial。
我不清楚如何在拟合模型时传递真实类标签。我原本以为这与随机森林分类器的多类情况类似/相同,即传递[n_samples, m_classes]的数据框。然而,当我这样做时,我得到了一个错误,指出数据形状不正确。ValueError: bad input shape (20, 5) —— 在这个小例子中,有5个类,20个样本。
经检查,fit方法的文档说明真实值是以[n_samples, ]的形式传递的 —— 这与我得到的错误相符 —— 然而,我不知道如何用多个类来训练模型。所以,我的疑问是:如何将完整的类标签集传递给fit函数?
我在网上找不到可以参考的示例代码,也没在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)
回答:
你似乎混淆了多类和多标签这两个术语 http://scikit-learn.org/stable/modules/multiclass.html ,简而言之:
- 多类分类意味着一个分类任务有超过两个类;例如,分类一组水果图片,这些水果可能是橙子、苹果或梨。多类分类假设每个样本只能分配给一个标签:一个水果可以是苹果或梨,但不能同时是两者。
因此数据是[n_samples, n_features]
,标签是[n_samples]
- 多标签分类为每个样本分配一组目标标签。这可以被认为是预测数据点的属性,这些属性不是互斥的,例如与文档相关的多个主题。一篇文本可能同时涉及宗教、政治、金融或教育,或者这些主题都不涉及。
因此数据是[n_samples, n_features]
,标签是[n_samples, n_labels]
你似乎在寻找多标签分类(因为对于多类分类,标签应该是1维的)。目前,在sklearn中,支持多标签分类的唯一方法是:决策树、随机森林、最近邻、岭回归。
如果你想用不同的模型学习多标签问题,只需使用OneVsRestClassifier
作为逻辑回归的多标签包装器即可