2017-01-29 2 views
13

Ich habe den folgenden Code einige der beliebtesten ML-Algorithmen von sklearn Python-Bibliothek zu testen:Logistische Regression: Unknown Label Typ: ‚kontinuierlich‘ mit sklearn in Python

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 Werke in Ordnung, aber ich habe der folgende Fehler in LogisticRegression Aufruf:

[email protected]:/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 Eingangsdaten ist das gleiche wie in den vorherigen Anrufen, also was ist hier los?

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

Antwort

19

Sie übergeben Floats an einen Klassifikator, der kategoriale Werte als Zielvektor erwartet. Wenn Sie es in int konvertieren, wird es als Eingabe akzeptiert (obwohl es fraglich sein wird, ob das der richtige Weg ist).

Es wäre besser, Ihre Trainingsergebnisse mit scikits labelEncoder Funktion zu konvertieren.

Das gleiche gilt für Ihren DecisionTree und KNeighbors Qualifier.

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 
+1

Vielen Dank! Also muss ich '2.3' in' 23' umwandeln, oder? Es gibt einen eleganten Weg, um diese Umwandlung mit Numpy oder Pandas zu machen? – harrison4

+1

Aber in diesem Beispiel haben die Eingabedaten Float-Nummern mit LogisticRegression-Funktion: http://machinelearningmastery.com/compare-machine-learning-algorithms-python-sikit-learn/ ... und es funktioniert ok. Warum? – harrison4

+0

Die Eingabe kann floats sein, aber die Ausgabe muss kategorial sein, d. H. Int. Spalte 8 ist in diesem Beispiel nur 0 oder 1. Normalerweise ist es anders herum, dass Sie kategorische Labels, z. ['rot', 'groß', 'krank'] und Sie müssen es numerische Werte konvertieren. Versuchen Sie http://scikit-learn.org/stable/modules/preprocessing.html#encoding-categorical-features oder http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html –

3

Ich kämpfte mit dem gleichen Problem, wenn man versucht Schwimmer zu den Klassifizierer zu füttern. Ich wollte Floats und keine ganzen Zahlen für die Genauigkeit behalten. Verwenden Sie 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') 
Verwandte Themen