2014-07-07 23 views
27

Tôi đang cố gắng sử dụng SGD để phân loại một tập dữ liệu lớn. Vì dữ liệu quá lớn để vừa với bộ nhớ, tôi muốn sử dụng phương thức partial_fit để đào tạo trình phân loại. Tôi đã chọn một mẫu của các bộ dữ liệu (100.000 hàng) phù hợp vào bộ nhớ để kiểm tra phù hợp vs partial_fit:Sklearn SGDClassifier partial fit

from sklearn.linear_model import SGDClassifier 

def batches(l, n): 
    for i in xrange(0, len(l), n): 
     yield l[i:i+n] 

clf1 = SGDClassifier(shuffle=True, loss='log') 
clf1.fit(X, Y) 

clf2 = SGDClassifier(shuffle=True, loss='log') 
n_iter = 60 
for n in range(n_iter): 
    for batch in batches(range(len(X)), 10000): 
     clf2.partial_fit(X[batch[0]:batch[-1]+1], Y[batch[0]:batch[-1]+1], classes=numpy.unique(Y)) 

sau đó tôi thử nghiệm cả hai phân loại với một tập kiểm tra giống hệt nhau. Trong trường hợp đầu tiên, tôi nhận được độ chính xác 100%. Theo tôi hiểu nó, SGD theo mặc định vượt qua 5 lần so với dữ liệu huấn luyện (n_iter = 5).

Trong trường hợp thứ hai, tôi phải vượt qua 60 lần dữ liệu để đạt được cùng độ chính xác.

Tại sao sự khác biệt này (5 so với 60)? Hay tôi đang làm gì sai?

+0

Give 'verbose = 1' để các nhà xây dựng SGD, mà có thể cung cấp cho bạn một gợi ý. –

+0

Trường hợp đầu tiên (phù hợp) kết thúc bằng "- Epoch 5 Norm: 29.25, NNZs: 300, Bias: -1.674706, T: 459595, Mất trung bình: 0.076786". Trường hợp thứ hai (partial_fit) sau khi 10 lượt kết thúc bằng "- Epoch 1 Norm: 22.99, NNZs: 300, Bias: -1.999685, T: 1918, Mất trung bình: 0.089302". Tôi nên tìm gì? thx –

+0

Mức lỗ trung bình. Kiểm tra xem nó giảm nhanh hơn trong trường hợp hàng loạt. –

Trả lời

46

Tôi cuối cùng đã tìm thấy câu trả lời. Bạn cần phải xáo trộn dữ liệu huấn luyện giữa mỗi lần lặp vì cài đặt ngẫu nhiên = True khi instantiating mô hình sẽ KHÔNG shuffle dữ liệu khi sử dụng partial_fit (nó chỉ áp dụng cho phù hợp với ). Lưu ý: sẽ hữu ích khi tìm thông tin này trên sklearn.linear_model.SGDClassifier page.

Mã sửa đổi lần đọc như sau:

from sklearn.linear_model import SGDClassifier 
import random 
clf2 = SGDClassifier(loss='log') # shuffle=True is useless here 
shuffledRange = range(len(X)) 
n_iter = 5 
for n in range(n_iter): 
    random.shuffle(shuffledRange) 
    shuffledX = [X[i] for i in shuffledRange] 
    shuffledY = [Y[i] for i in shuffledRange] 
    for batch in batches(range(len(shuffledX)), 10000): 
     clf2.partial_fit(shuffledX[batch[0]:batch[-1]+1], shuffledY[batch[0]:batch[-1]+1], classes=numpy.unique(Y)) 
Các vấn đề liên quan