LogisticRegression: Unbekannter Etikettentyp: 'Continuous' mit sklearn in Python

73

Ich habe den folgenden Code, um einige der beliebtesten ML-Algorithmen der sklearn Python-Bibliothek zu 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))

Die ersten beiden funktionieren in Ordnung, aber ich habe beim LogisticRegressionAufruf den folgenden Fehler erhalten :

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'

Die Eingabedaten sind die gleichen wie in den vorherigen Aufrufen. Was ist hier also los?

Und übrigens, warum gibt es einen großen Unterschied in der ersten Vorhersage LinearRegression()und den SVR()Algorithmen (15.72 vs 3.95)?

harrison4
quelle

Antworten:

82

Sie übergeben Floats an einen Klassifizierer, der kategoriale Werte als Zielvektor erwartet. Wenn Sie es konvertieren, intwird es als Eingabe akzeptiert (obwohl es fraglich ist, ob dies der richtige Weg ist).

Es ist besser, Ihre Trainingsergebnisse mithilfe der labelEncoderFunktion von scikit umzuwandeln .

Gleiches gilt für Ihr DecisionTree- und KNeighbors-Qualifikationsmerkmal.

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
Maximilian Peters
quelle
1
Vielen Dank! Also habe ich zu konvertieren haben 2.3zu 23und so weiter, ist es nicht? Gibt es eine elegante Möglichkeit, diese Konvertierung mit Numpy oder Pandas durchzuführen?
Harrison4
3
In diesem Beispiel haben die Eingabedaten jedoch Gleitkommazahlen mit der LogisticRegression-Funktion: machinelearningmastery.com/… ... und es funktioniert einwandfrei . Warum?
Harrison4
2
Die Eingabe kann Floats sein, aber die Ausgabe muss kategorisch sein, dh int. Spalte 8 ist in diesem Beispiel nur 0 oder 1. Normalerweise ist es umgekehrt, dass Sie kategoriale Bezeichnungen haben, z. B. ['rot', 'groß', 'krank'] und diese numerischen Werte konvertieren müssen. Versuchen Sie es mit scikit-learn.org/stable/modules/… oder scikit-learn.org/stable/modules/generated/…
Maximilian Peters
Sind 2.3und 23gleich?
Ajay Kulkarni
24

Ich hatte mit dem gleichen Problem zu kämpfen, als ich versuchte, den Klassifikatoren Schwimmer zuzuführen. Ich wollte Floats und keine ganzen Zahlen für die Genauigkeit behalten. Versuchen Sie es mit Regressor-Algorithmen. Zum Beispiel:

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')
Sam Perry
quelle
19

LogisticRegressionist nicht für die Regression, sondern für die Klassifizierung !

Die YVariable muss die Klassifizierungsklasse sein.

(zum Beispiel 0oder 1)

Und keine continuousVariable,

das wäre ein Regressionsproblem .

Thomas G.
quelle
Ich hoffe, dies ist kein Spam, aber ich bin oft hier gelandet und die Fehlermeldung ist nicht sehr intuitiv.
Thomas G.
Dies sollte die richtige Antwort sein. In der Tat ist LogisticRegression ein Klassifikator. Daher der Fehler.
Nav