2017-01-29 21 views
13

Tôi có đoạn code sau để kiểm tra một số thuật toán ML phổ biến nhất của sklearn python thư viện:hồi quy logistic: Unknown loại nhãn: 'liên tục' sử dụng sklearn trong 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)) 

Hai tác phẩm đầu tiên ok, nhưng tôi đã nhận lỗi sau trong số LogisticRegression gọi:

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

Dữ liệu đầu vào giống như trong các cuộc gọi trước, vậy điều gì đang xảy ra ở đây?

Và bằng cách này, tại sao có sự khác biệt lớn trong dự đoán đầu tiên của các thuật toán LinearRegression()SVR()(15.72 vs 3.95)?

Trả lời

19

Bạn đang chuyển phao vào một trình phân loại, kỳ vọng các giá trị phân loại là vectơ mục tiêu. Nếu bạn chuyển đổi nó thành int nó sẽ được chấp nhận làm đầu vào (mặc dù nó sẽ là vấn đề nếu đó là cách đúng để làm điều đó).

Sẽ tốt hơn nếu bạn chuyển đổi điểm số đào tạo của mình bằng cách sử dụng chức năng labelEncoder của scikit.

Điều này cũng đúng với vòng loại DecisionTree và KNeighbors của bạn.

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

Cảm ơn bạn! Vì vậy, tôi đã có để chuyển đổi '2.3' để '23' và như vậy, phải không? Có một cách thanh lịch để thực hiện chuyển đổi này bằng cách sử dụng gấu trúc hoặc gấu trúc? – harrison4

+1

Nhưng, trong ví dụ này dữ liệu đầu vào có số phao bằng chức năng LogisticRegression: http://machinelearningmastery.com/compare-machine-learning-algorithms-python-scikit-learn/ ... và nó hoạt động tốt. Tại sao? – harrison4

+0

Đầu vào có thể là phao nhưng đầu ra cần phải được phân loại, tức là int. Cột 8 chỉ là 0 hoặc 1 trong ví dụ này. Thông thường, đó là cách khác mà bạn có nhãn phân loại, ví dụ: ['đỏ', 'lớn', 'bị bệnh'] và bạn cần phải chuyển đổi các giá trị số. Hãy thử http://scikit-learn.org/stable/modules/preprocessing.html#encoding-categorical-features hoặc http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html –

3

Tôi gặp khó khăn với cùng một vấn đề khi cố gắng nạp nổi cho các trình phân loại. Tôi muốn giữ phao và không phải là số nguyên cho độ chính xác. Thử sử dụng thuật toán hồi quy. Ví dụ:

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') 
Các vấn đề liên quan