LogisticRegression: onbekend labeltype: ‘continu’ met sklearn in python

Ik heb de volgende code om enkele van de meest populaire ML-algoritmen van de sklearn python-bibliotheek te testen:

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))

De eerste twee werken goed, maar ik kreeg de volgende fout in de LogisticRegression-aanroep:

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'

De invoergegevens zijn hetzelfde als bij de vorige oproepen, dus wat is hier aan de hand?

En trouwens, waarom is er een enorm verschil in de eerste voorspelling van LinearRegression() en SVR() algoritmen (15.72 vs 3.95)?


Antwoord 1, autoriteit 100%

Je geeft floats door aan een classifier die categorische waarden verwacht als de doelvector. Als je het naar int converteert, wordt het als invoer geaccepteerd (hoewel het de vraag is of dat de juiste manier is).

Het is beter om uw trainingsscores om te zetten met van scikit labelEncoder functie.

Hetzelfde geldt voor je DecisionTree en KNeighbours kwalificatie.

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

Antwoord 2, autoriteit 33%

Ik worstelde met hetzelfde probleem toen ik dobbers aan de classifiers probeerde te geven. Ik wilde floats behouden en geen gehele getallen voor de nauwkeurigheid. Probeer regressoralgoritmen te gebruiken. Bijvoorbeeld:

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')

Antwoord 3, autoriteit 32%

LogisticRegression is niet voor regressie maar voor classificatie !

De variabele Y moet de classificatieklasse zijn,

(bijvoorbeeld 0 of 1)

En niet een continuous variabele,

dat zou een regressie probleem zijn.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

20 − sixteen =

Other episodes