【问题标题】:LogisticRegression: Unknown label type: 'continuous' using sklearn in pythonLogisticRegression:未知标签类型:在 python 中使用 sklearn 的“连续”
【发布时间】:2017-06-14 23:25:09
【问题描述】:

我有以下代码来测试sklearn python库的一些最流行的ML算法:

import numpy as np
from sklearn                        import metrics, svm
from sklearn.linear_model           import LinearRegression
from sklearn.linear_model           import LogisticRegression
from sklearn.tree                   import DecisionTreeClassifier
from sklearn.neighbors              import KNeighborsClassifier
from sklearn.discriminant_analysis  import LinearDiscriminantAnalysis
from sklearn.naive_bayes            import GaussianNB
from sklearn.svm                    import SVC

trainingData    = np.array([ [2.3, 4.3, 2.5],  [1.3, 5.2, 5.2],  [3.3, 2.9, 0.8],  [3.1, 4.3, 4.0]  ])
trainingScores  = np.array( [3.4, 7.5, 4.5, 1.6] )
predictionData  = np.array([ [2.5, 2.4, 2.7],  [2.7, 3.2, 1.2] ])

clf = LinearRegression()
clf.fit(trainingData, trainingScores)
print("LinearRegression")
print(clf.predict(predictionData))

clf = svm.SVR()
clf.fit(trainingData, trainingScores)
print("SVR")
print(clf.predict(predictionData))

clf = LogisticRegression()
clf.fit(trainingData, trainingScores)
print("LogisticRegression")
print(clf.predict(predictionData))

clf = DecisionTreeClassifier()
clf.fit(trainingData, trainingScores)
print("DecisionTreeClassifier")
print(clf.predict(predictionData))

clf = KNeighborsClassifier()
clf.fit(trainingData, trainingScores)
print("KNeighborsClassifier")
print(clf.predict(predictionData))

clf = LinearDiscriminantAnalysis()
clf.fit(trainingData, trainingScores)
print("LinearDiscriminantAnalysis")
print(clf.predict(predictionData))

clf = GaussianNB()
clf.fit(trainingData, trainingScores)
print("GaussianNB")
print(clf.predict(predictionData))

clf = SVC()
clf.fit(trainingData, trainingScores)
print("SVC")
print(clf.predict(predictionData))

前两个工作正常,但我在LogisticRegression 调用中收到以下错误:

root@ubupc1:/home/ouhma# python stack.py 
LinearRegression
[ 15.72023529   6.46666667]
SVR
[ 3.95570063  4.23426243]
Traceback (most recent call last):
  File "stack.py", line 28, in <module>
    clf.fit(trainingData, trainingScores)
  File "/usr/local/lib/python2.7/dist-packages/sklearn/linear_model/logistic.py", line 1174, in fit
    check_classification_targets(y)
  File "/usr/local/lib/python2.7/dist-packages/sklearn/utils/multiclass.py", line 172, in check_classification_targets
    raise ValueError("Unknown label type: %r" % y_type)
ValueError: Unknown label type: 'continuous'

输入的数据和前面的调用一样,那么这里发生了什么?

顺便问一下,为什么LinearRegression()SVR()算法(15.72 vs 3.95)的第一次预测会有很大差异?

【问题讨论】:

    标签: python numpy scikit-learn


    【解决方案1】:

    您将浮点数传递给期望分类值作为目标向量的分类器。如果您将其转换为int,它将被接受为输入(尽管这是否是正确的做法值得怀疑)。

    最好使用scikit的labelEncoder函数来转换你的训练分数。

    DecisionTree 和 KNeighbors 限定符也是如此。

    from sklearn import preprocessing
    from sklearn import utils
    
    lab_enc = preprocessing.LabelEncoder()
    encoded = lab_enc.fit_transform(trainingScores)
    >>> array([1, 3, 2, 0], dtype=int64)
    
    print(utils.multiclass.type_of_target(trainingScores))
    >>> continuous
    
    print(utils.multiclass.type_of_target(trainingScores.astype('int')))
    >>> multiclass
    
    print(utils.multiclass.type_of_target(encoded))
    >>> multiclass
    

    【讨论】:

    • 谢谢!所以我必须将2.3 转换为23 等等,不是吗?有一种优雅的方法可以使用 numpy 或 pandas 进行这种转换?
    • 但是,在这个例子中,输入数据有使用 LogisticRegression 函数的浮点数:machinelearningmastery.com/… ... 并且工作正常。为什么?
    • 输入可以是浮点数,但输出需要是分类的,即 int。在此示例中,第 8 列仅为 0 或 1。通常相反,您有分类标签,例如['red', 'big', 'sick'] 您需要将其转换为数值。试试scikit-learn.org/stable/modules/…scikit-learn.org/stable/modules/generated/…
    • 2.323 一样吗?
    【解决方案2】:

    LogisticRegression 不是回归,而是分类

    Y 变量必须是分类类别,

    (例如01

    而不是continuous 变量,

    这将是一个回归问题。

    【讨论】:

    • 我希望这不是垃圾邮件,但我多次来到这里,错误提示不是很直观。
    • 这应该是正确的答案。事实上,LogisticRegression 是一个分类器。因此出现错误。
    【解决方案3】:

    在尝试将浮点数提供给分类器时,我遇到了同样的问题。为了准确性,我想保留浮点数而不是整数。尝试使用回归算法。例如:

    import numpy as np
    from sklearn import linear_model
    from sklearn import svm
    
    classifiers = [
        svm.SVR(),
        linear_model.SGDRegressor(),
        linear_model.BayesianRidge(),
        linear_model.LassoLars(),
        linear_model.ARDRegression(),
        linear_model.PassiveAggressiveRegressor(),
        linear_model.TheilSenRegressor(),
        linear_model.LinearRegression()]
    
    trainingData    = np.array([ [2.3, 4.3, 2.5],  [1.3, 5.2, 5.2],  [3.3, 2.9, 0.8],  [3.1, 4.3, 4.0]  ])
    trainingScores  = np.array( [3.4, 7.5, 4.5, 1.6] )
    predictionData  = np.array([ [2.5, 2.4, 2.7],  [2.7, 3.2, 1.2] ])
    
    for item in classifiers:
        print(item)
        clf = item
        clf.fit(trainingData, trainingScores)
        print(clf.predict(predictionData),'\n')
    

    【讨论】:

      猜你喜欢
      • 2020-05-11
      • 2018-07-22
      • 2018-02-15
      • 2018-01-20
      • 1970-01-01
      • 2017-07-16
      • 2017-08-29
      • 2018-12-10
      相关资源
      最近更新 更多