2017-01-29 8 views
13

I sklearnのPythonライブラリの中で最も人気のあるMLアルゴリズムのいくつかをテストするために、次のコードがあります。ロジスティック回帰:不明なラベルタイプ:パイソンの「連続」を使用してsklearn

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

最初の2つの作品[OK]を、私は得ましたLogisticRegressionコールに次のエラー:

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

入力されたデータは、以前の呼び出しの場合と同じであるので、ここで何が起こっていますか?

そして、なぜ、LinearRegression()SVR()アルゴリズムの最初の予測に大きな違いがあるのですか(15.72 vs 3.95)

答えて

19

カテゴリの値をターゲットベクトルとして期待する分類器に浮動小数点数を渡します。 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 
+1

ありがとうございます!だから私は '2.3'を' 23'に変換しなければならない、そうではない? numpyやpandasを使ってこの変換を行うには、エレガントな方法がありますか? – harrison4

+1

しかし、この例では、LogisticRegression関数を使用して入力データに浮動小数点数があります。http://machinelearningmastery.com/compare-machine-learning-algorithms-python-scikit-learn/ ...これは問題なく動作します。どうして? – harrison4

+0

入力を浮動させることができますが、出力はカテゴリ的、つまりintである必要があります。この例では、列8は0または1のみです。 通常、あなたはカテゴリラベルを持っています。 ['red'、 'big'、 'sick']と数値を変換する必要があります。 http://scikit-learn.org/stable/modules/preprocessing.html#encoding-categorical-featuresまたはhttp://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html –

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') 
関連する問題