2016-02-06 18 views
8

Tôi đang sử dụng Python sklearn (phiên bản 0,17) để chọn mô hình lý tưởng trên tập dữ liệu. Để thực hiện việc này, tôi đã thực hiện theo các bước sau:python sklearn: sự khác nhau giữa precision_score và điểm số học tập là gì?

  1. Chia bộ dữ liệu bằng cách sử dụng cross_validation.train_test_split với test_size = 0.2.
  2. Sử dụng GridSearchCV để chọn bộ phân loại k-lân cận gần nhất lý tưởng trên tập huấn luyện.
  3. Chuyển bộ phân loại được trả lại bởi GridSearchCV đến plot_learning_curve. plot_learning_curve đã đưa ra âm mưu được hiển thị bên dưới.
  4. Chạy trình phân loại được trả về bởi GridSearchCV trên tập kiểm tra thu được.

Từ cốt truyện, chúng ta có thể thấy rằng điểm số cho giá thầu CPC kích thước đào tạo là khoảng 0,43. Điểm số này là điểm số được trả về bởi hàm sklearn.learning_curve.learning_curve.

Nhưng khi tôi chạy phân loại tốt nhất trên tập kiểm tra tôi nhận được một số điểm chính xác của 0,61, như được trả về bởi sklearn.metrics.accuracy_score (dự đoán một cách chính xác nhãn/số nhãn)

Liên kết đến hình ảnh: graph plot for KNN classifier

này là mã tôi đang sử dụng. Tôi đã không bao gồm chức năng plot_learning_curve vì nó sẽ chiếm nhiều không gian. Tôi đã lấy số plot_learning_curve từ here

import pandas as pd 
import numpy as np 
from sklearn.neighbors import KNeighborsClassifier 
from sklearn.metrics import accuracy_score 
from sklearn.metrics import classification_report 
from matplotlib import pyplot as plt 
import sys 
from sklearn import cross_validation 
from sklearn.learning_curve import learning_curve 
from sklearn.grid_search import GridSearchCV 
from sklearn.cross_validation import train_test_split 


filename = sys.argv[1] 
data = np.loadtxt(fname = filename, delimiter = ',') 
X = data[:, 0:-1] 
y = data[:, -1] # last column is the label column 


X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=2) 

params = {'n_neighbors': [2, 3, 5, 7, 10, 20, 30, 40, 50], 
      'weights': ['uniform', 'distance']} 

clf = GridSearchCV(KNeighborsClassifier(), param_grid=params) 
clf.fit(X_train, y_train) 
y_true, y_pred = y_test, clf.predict(X_test) 
acc = accuracy_score(y_pred, y_test) 
print 'accuracy on test set =', acc 

print clf.best_params_ 
for params, mean_score, scores in clf.grid_scores_: 
    print "%0.3f (+/-%0.03f) for %r" % (
     mean_score, scores.std()/2, params) 

y_true, y_pred = y_test, clf.predict(X_test) 
#pred = clf.predict(np.array(features_test)) 
acc = accuracy_score(y_pred, y_test) 
print classification_report(y_true, y_pred) 
print 'accuracy last =', acc 
print 

plot_learning_curve(clf, "KNeighborsClassifier", 
       X, y, 
       train_sizes=np.linspace(.05, 1.0, 5)) 

Điều này có bình thường không? Tôi có thể hiểu rằng có thể có sự khác biệt về điểm số nhưng đây là sự khác biệt 0,18, khi chuyển đổi thành tỷ lệ phần trăm là 43% so với 61%. Việc phân loại_report cũng cho một trung bình 0,61 nhớ lại.

Tôi có làm gì sai không? Có sự khác biệt trong cách tính toán số điểm learning_curve không? Tôi cũng đã cố gắng chuyển chức năng scoring='accuracy' tới learning_curve để xem liệu nó có phù hợp với điểm chính xác hay không, nhưng nó không tạo ra bất kỳ sự khác biệt nào.

Bất kỳ lời khuyên nào cũng hữu ích.

Tôi đang sử dụng chất lượng rượu vang (trắng) data set from UCI và cũng đã xóa tiêu đề trước khi chạy mã.

+1

Mã của bạn cho plot_learning_curve() ở đâu? Dường như đây là nơi không nhất quán. Điểm chính xác xác nhận chéo từ GridSearchCV là gần đúng với độ chính xác được tính toán trên tập kiểm tra. – SPKoder

+0

@SPKoder Tôi đoán anh ấy đã sử dụng chức năng từ trang web của sklearn: http://scikit-learn.org/stable/auto_examples/model_selection/plot_learning_curve.html#example-model-selection-plot-learning-curve-py. Btw, tôi đã làm nhiều bài kiểm tra và tôi khá chắc chắn rằng tôi đã tìm thấy một lời giải thích, bạn có thể kiểm tra nó ra và kiểm tra lại giả thuyết của tôi –

Trả lời

8

Khi bạn gọi hàm learning_curve, nó thực hiện xác thực chéo trên toàn bộ dữ liệu của bạn. Khi bạn để trống tham số cv, nó là chiến lược tách xác thực chéo 3 lần. Và ở đây có phần phức tạp bởi vì như đã nêu trong tài liệu "Nếu bộ ước lượng là bộ phân loại hoặc nếu y không phải là nhị phân hay đa giác, thì KFold được sử dụng". Và ước tính của bạn là một trình phân loại.

Vì vậy, sự khác nhau giữa KFold và StratifiedKFold là gì?

KFold = chia tập dữ liệu vào k nếp gấp liên tiếp (mà không xáo trộn theo mặc định)

StratifiedKFold = "Các nếp gấp được thực hiện bằng cách gìn giữ tỷ lệ mẫu cho mỗi lớp."

Hãy làm một ví dụ đơn giản:

  • nhãn dữ liệu của bạn là [4.0, 4.0, 4.0, 5.0, 5.0, 5.0, 6.0, 6.0, 6.0]
  • bởi không phân tầng 3 lần bạn chia thành các tập con: [4.0, 4.0, 4.0], [5.0, 5.0, 5.0], [6.0, 6.0, 6.0]
  • mỗi lần được sử dụng một lần xác thực một lần trong khi k - 1 (3-2) Ví dụ: đào tạo trên [5.0, 5.0, 5.0, 6.0, 6.0, 6.0] và xác thực trên [4.0, 4.0, 4.0]

Điều này giải thích độ chính xác thấp của bạn vẽ đường cong học tập của bạn (~ 0,43%). Tất nhiên đây là ví dụ cực kỳ để minh họa cho tình huống, nhưng dữ liệu của bạn được cấu trúc bằng cách nào đó và bạn cần phải trộn nó.

Nhưng khi bạn có được độ chính xác ~ 61% bạn đã chia nhỏ dữ liệu theo phương pháp train_test_split theo mặc định sẽ thực hiện trộn ngẫu nhiên trên dữ liệu và giữ tỷ lệ.

Chỉ cần nhìn vào điều này, tôi đã thực hiện một thử nghiệm đơn giản để hỗ trợ giả thuyết của tôi:

X_train2, X_test2, y_train2, y_test2 = train_test_split(X, y, test_size=0., random_state=2) 

Trong ví dụ của bạn, bạn cho ăn learning_curve với tất cả các dữ liệu của bạn X,y. Tôi đang thực hiện một mẹo nhỏ ở đây là chia dữ liệu cho biết test_size=0. nghĩa là tất cả dữ liệu nằm trong các biến số train. Bằng cách này, tôi vẫn giữ tất cả dữ liệu, nhưng bây giờ nó xáo trộn khi nó đi qua chức năng train_test_split.

Sau đó, tôi đã gọi chức năng âm mưu của mình nhưng với dữ liệu xáo trộn:

plot_learning_curve(clf, "KNeighborsClassifier",X_train2, y_train2, train_sizes=np.linspace(.05, 1.0, 5)) 

Bây giờ đầu ra với các mẫu huấn luyện num tối đa thay vì 0.430.59 có ý nghĩa nhiều hơn với kết quả GridSearch của bạn.

Observation: Tôi nghĩ rằng toàn bộ các điểm vẽ đường cong học tập là để xác định thời tiết thêm nhiều mẫu để công tác đào tạo thiết lập ước lượng của chúng tôi là có thể thực hiện tốt hơn hay không (vì vậy bạn có thể quyết định ví dụ như khi có không cần thêm nhiều ví dụ nữa). Như trong các train_sizes bạn chỉ cần cung cấp các giá trị np.linspace(.05, 1.0, 5) --> [ 0.05 , 0.2875, 0.525 , 0.7625, 1. ] Tôi không hoàn toàn chắc chắn rằng đây là cách sử dụng bạn đang theo đuổi trong loại thử nghiệm này.

Các vấn đề liên quan