2013-02-23 38 views
7

Tôi đang chơi với trình phân loại hồi quy logistic một lần so với sử dụng Scikit-Learn (sklearn). Tôi có một tập dữ liệu lớn quá chậm để chạy tất cả cùng một lúc; Tôi cũng muốn nghiên cứu đường cong học tập như tiền thu được.Gốc liên tục theo từng bước với scikit (sklearn)

Tôi muốn sử dụng hàng loạt gradient gốc để đào tạo phân loại của tôi theo lô, ví dụ, 500 mẫu. Có cách nào để sử dụng sklearn để làm điều này không, hay tôi nên bỏ qua sklearn và "cuộn của riêng tôi"?

Đây là những gì tôi có cho đến nay:

from sklearn.linear_model import LogisticRegression 
from sklearn.multiclass import OneVsRestClassifier 

# xs are subsets of my training data, ys are ground truth for same; I have more 
# data available for further training and cross-validation: 
xs.shape, ys.shape 
# => ((500, 784), (500)) 
lr = OneVsRestClassifier(LogisticRegression()) 
lr.fit(xs, ys) 
lr.predict(xs[0,:]) 
# => [ 1.] 
ys[0] 
# => 1.0 

Tức là nó xác định chính xác một mẫu đào tạo (có, tôi nhận ra sẽ tốt hơn nếu đánh giá nó với dữ liệu mới - đây chỉ là một thử nghiệm khói nhanh).

R.e. hàng loạt gradient gốc: Tôi đã không nhận được như xa như tạo đường cong học tập, nhưng có thể chỉ đơn giản là chạy fit nhiều lần trên các tập con tiếp theo của dữ liệu đào tạo? Hoặc là có một số chức năng khác để đào tạo theo lô? Tài liệu và Google khá im lặng về vấn đề này. Cảm ơn!

+0

Đặt cược tốt nhất của bạn có thể xem xét mã nguồn của thư viện này. – Arcturus

Trả lời

20

Điều bạn muốn không phải là độ dốc của hàng loạt, mà là gốc gốc ngẫu nhiên; hàng loạt học tập có nghĩa là học tập trên toàn bộ tập huấn luyện trong một lần, trong khi những gì bạn mô tả được gọi là học tập nhỏ gọn. Điều đó được thực hiện trong sklearn.linear_model.SGDClassifier, phù hợp với mô hình hồi quy logistic nếu bạn cho nó tùy chọn loss="log".

Với SGDClassifier, giống như với LogisticRegression, không cần phải quấn bộ ước tính trong một OneVsRestClassifier - cả hai thực hiện một lần so với tất cả đào tạo ngoài hộp.

# you'll have to set a few other options to get good estimates, 
# in particular n_iterations, but this should get you going 
lr = SGDClassifier(loss="log") 

Sau đó, để đào tạo trên xe buýt nhỏ, hãy sử dụng phương pháp partial_fit thay vì fit. Lần đầu tiên xung quanh, bạn có để nuôi nó một danh sách các lớp vì không phải tất cả các lớp học có thể có mặt trong mỗi minibatch:

import numpy as np 
classes = np.unique(["ham", "spam", "eggs"]) 

for xs, ys in minibatches: 
    lr.partial_fit(xs, ys, classes=classes) 

(Ở đây, tôi đang đi qua classes cho mỗi minibatch, đó là không cần thiết nhưng không làm tổn thương hoặc làm cho mã ngắn hơn.)

+0

Cảm ơn câu trả lời chi tiết, tôi sẽ thử ASAP. Về định nghĩa, tôi đã theo thuật ngữ từ lớp Coursera của Andrew Ng; trong danh pháp của mình, stochastic gradient descent liên quan đến việc thay đổi gradient với mỗi mẫu đào tạo, và những gì bạn gọi minibatch ông gọi là hàng loạt gradient gốc. Nhưng đặt tên tuy nhiên, tôi có thể thấy rằng đây là những gì tôi đã yêu cầu - cảm ơn rất nhiều! – JohnJ

+1

@JohnJ: thực sự SGD có thể được sử dụng trong chế độ hàng loạt, minibatch hoặc trực tuyến (một mẫu tại một thời điểm). Các thuật ngữ tôi sử dụng ở đây là của prof. Lớp Coursera NN/ML của Hinton, mà tôi đã tìm thấy cho đến nay để phù hợp với hầu hết các tài liệu. –

+0

Tuyệt vời, cảm ơn. Câu trả lời của bạn cũng làm việc tốt cho tôi. Bạn có đề nghị lớp học đó không? Cảm ơn một lần nữa. – JohnJ

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