SVM sử dụng scikit learn chạy vô tận và không bao giờ hoàn thành thực thi


76

Tôi đang cố gắng chạy SVR bằng scikit learn (python) trên tập dữ liệu huấn luyện có 595605 hàng và 5 cột (tính năng) và tập dữ liệu thử nghiệm có 397070 hàng. Các dữ liệu đã được xử lý trước và thường xuyên.

Tôi có thể chạy thành công các ví dụ thử nghiệm nhưng khi thực hiện bằng cách sử dụng tập dữ liệu của mình và để nó chạy trong hơn một giờ, tôi vẫn không thể thấy bất kỳ đầu ra hoặc kết thúc chương trình nào. Tôi đã thử thực thi bằng một IDE khác và thậm chí từ thiết bị đầu cuối nhưng dường như đó không phải là vấn đề. Tôi cũng đã thử thay đổi giá trị tham số 'C' từ 1 thành 1e3.

Tôi đang đối mặt với các vấn đề tương tự với tất cả các triển khai svm bằng scikit.

Tôi không chờ đợi đủ để nó hoàn thành? Việc thực hiện này mất bao nhiêu thời gian?

Theo kinh nghiệm của tôi, nó không cần quá vài phút.

Đây là cấu hình hệ thống của tôi: Ubuntu 14.04, RAM 8GB, nhiều bộ nhớ trống, bộ xử lý i7 thế hệ thứ 4


Bạn có thể cung cấp mã? Ngoài ra, nó đào tạo hoặc kiểm tra mất rất nhiều thời gian? Làm thế nào về bộ dữ liệu đào tạo / thử nghiệm nhỏ hơn?

Tôi chỉ đọc dữ liệu từ tệp csv vào khung dữ liệu gấu trúc và chuyển nó đến hàm tìm hiểu scikit. Đó là tất cả! Cung cấp mã sẽ không thực sự giúp đỡ ở đây
tejaskhot

6
Việc triển khai SVM của sklearn bao gồm ít nhất 3 bước: 1) tạo đối tượng SVR, 2) khớp với mô hình, 3) giá trị dự đoán. Bước đầu tiên mô tả kernel đang sử dụng, giúp hiểu các quy trình bên trong tốt hơn nhiều. Bước thứ hai và thứ ba khá khác nhau, và chúng ta cần biết ít nhất là bước nào mất nhiều thời gian. Nếu đó là đào tạo, thì nó có thể ổn, vì đôi khi việc học chậm. Nếu nó đang thử nghiệm thì có lẽ có lỗi, vì thử nghiệm trong SVM thực sự rất nhanh. Ngoài ra, có thể việc đọc CSV mất nhiều thời gian và không phải là SVM. Vì vậy, tất cả những chi tiết này có thể quan trọng.

Tôi cũng đang đối mặt với cùng một vấn đề thông qua svm nhưng ai đó có thể cho tôi biết sẽ mất bao nhiêu thời gian sau khi bình thường hóa không?
kashyap kitchlu

Câu trả lời:


69

Các SVM hạt nhân yêu cầu tính toán một hàm khoảng cách giữa mỗi điểm trong tập dữ liệu, đó là chi phí chi phối của . Việc lưu trữ khoảng cách là một gánh nặng cho bộ nhớ, vì vậy chúng được tính toán lại một cách nhanh chóng. Rất may, hầu hết các điểm gần ranh giới quyết định là cần thiết trong hầu hết thời gian. Khoảng cách tính toán thường xuyên được lưu trữ trong một bộ đệm. Nếu bộ đệm bị xóa, thời gian chạy sẽ tăng lên .Ôi(viết sai rồiđặc trưng×viết sai rồiquan sát2)Ôi(viết sai rồiđặc trưng×viết sai rồiquan sát3)

Bạn có thể tăng bộ đệm này bằng cách gọi SVR là

model = SVR(cache_size=7000)

Nói chung, điều này sẽ không làm việc. Nhưng mọi thứ chưa hẳn đã mất. Bạn có thể lấy mẫu dữ liệu và sử dụng phần còn lại làm bộ xác thực hoặc bạn có thể chọn một mô hình khác. Trên phạm vi quan sát 200.000, thật khôn ngoan khi chọn người học tuyến tính.

Kernel SVM có thể được xấp xỉ, bằng cách xấp xỉ ma trận kernel và đưa nó vào một SVM tuyến tính. Điều này cho phép bạn đánh đổi giữa độ chính xác và hiệu suất trong thời gian tuyến tính.

Một phương tiện phổ biến để đạt được điều này là sử dụng 100 hoặc hơn các trung tâm cụm được tìm thấy bởi kmeans / kmeans ++ làm cơ sở cho chức năng hạt nhân của bạn. Các tính năng dẫn xuất mới sau đó được đưa vào mô hình tuyến tính. Điều này hoạt động rất tốt trong thực tế. Các công cụ như sophia-mlvowpal w thôi là cách Google, Yahoo và Microsoft làm điều này. Đầu vào / đầu ra trở thành chi phí chi phối cho người học tuyến tính đơn giản.

Trong sự phong phú của dữ liệu, các mô hình không tham số thực hiện gần như giống nhau cho hầu hết các vấn đề. Các ngoại lệ được cấu trúc đầu vào, như văn bản, hình ảnh, chuỗi thời gian, âm thanh.

đọc thêm


16

SVM giải quyết vấn đề tối ưu hóa bậc hai.

Tôi không có bất cứ điều gì để thêm mà chưa được nói ở đây. Tôi chỉ muốn đăng một liên kết trang sklearn về SVC để làm rõ những gì đang diễn ra:

Việc thực hiện dựa trên libsvm. Độ phức tạp thời gian phù hợp nhiều hơn bậc hai với số lượng mẫu khiến cho việc chia tỷ lệ thành tập dữ liệu với hơn một vài 10000 mẫu là khó khăn.

Nếu bạn không muốn sử dụng hạt nhân và một SVM tuyến tính đủ, thì có linearSVR nhanh hơn nhiều vì nó sử dụng phương pháp tối ưu hóa hồi quy tuyến tính ala. Tuy nhiên, bạn sẽ phải bình thường hóa dữ liệu của mình, trong trường hợp bạn chưa làm như vậy, bởi vì nó áp dụng chính quy hóa cho hệ số chặn, đây có thể không phải là điều bạn muốn. Điều đó có nghĩa là nếu trung bình dữ liệu của bạn khác xa 0, nó sẽ không thể giải quyết thỏa đáng.

Những gì bạn cũng có thể sử dụng là giảm độ dốc ngẫu nhiên để giải quyết vấn đề tối ưu hóa. Sklearn có tính năng SGDRegressor . Bạn phải sử dụng loss='epsilon_insensitive'để có kết quả tương tự với SVM tuyến tính. Xem tài liệu. Mặc dù vậy, tôi chỉ sử dụng độ dốc giảm dần như là phương sách cuối cùng bởi vì nó ngụ ý nhiều điều chỉnh của siêu đường kính để tránh bị kẹt trong cực tiểu cục bộ. Sử dụng LinearSVRnếu bạn có thể.


Tôi đã có một bộ dữ liệu với nhiều dòng. SVC bắt đầu mất quá nhiều thời gian cho tôi khoảng 150K hàng dữ liệu. Tôi đã sử dụng đề xuất của bạn với linearSVR và một triệu hàng chỉ mất vài phút. PS cũng tìm thấy trình phân loại LogisticRegression tạo ra kết quả tương tự như linearSVR (trong trường hợp của tôi) và thậm chí còn nhanh hơn.
jeffery_the_wind

8

Bạn đã bao gồm mở rộng quy mô trong bước tiền xử lý của bạn? Tôi đã có vấn đề này khi chạy SVM của tôi. Tập dữ liệu của tôi là ~ 780.000 mẫu (hàng) với 20 tính năng (col). Bộ đào tạo của tôi là ~ 235k mẫu. Hóa ra tôi chỉ quên quy mô dữ liệu của mình! Nếu đây là trường hợp, hãy thử thêm bit này vào mã của bạn:

chia tỷ lệ dữ liệu thành [-1,1]; tăng tốc độ SVM:

từ sklearn.pre processing nhập MinMaxScaler
scaling = MinMaxScaler (Feature_range = (- 1,1)). fit (X_train)
X_train = scaling.transform (X_train)
X_test = scaling.transform (X_test)


2
Bất cứ ai có thể giải thích tại sao điều này tăng tốc độ phù hợp với SVM?
lppier

1
Có lý do tại sao bạn chọn MinMaxScaler thay vì bất kỳ lý do nào khác không? StandardScaler chẳng hạn?
raspi

@Ippier: về cơ bản, bạn đang giảm không gian ranh giới có thể cho mỗi tùy chọn theo cách làm cho mức độ nỗ lực ít hơn nhiều cho máy của bạn.
ike

7

Với một bộ dữ liệu khổng lồ như vậy tôi nghĩ rằng bạn sẽ tốt hơn khi sử dụng mạng lưới thần kinh, học sâu, rừng ngẫu nhiên (chúng tốt đến mức đáng ngạc nhiên), v.v.

Như đã đề cập trong các câu trả lời trước đó, thời gian thực hiện tỷ lệ thuận với sức mạnh thứ ba của số lượng mẫu đào tạo. Ngay cả thời gian dự đoán là đa thức về số lượng vectơ kiểm tra.

Nếu bạn thực sự phải sử dụng SVM thì tôi khuyên bạn nên sử dụng GPU tăng tốc hoặc giảm kích thước tập dữ liệu huấn luyện. Trước tiên hãy thử với một mẫu (10.000 hàng có thể) của dữ liệu để xem liệu đó có phải là vấn đề với định dạng hoặc phân phối dữ liệu hay không.

Như đã đề cập trong các câu trả lời khác, hạt nhân tuyến tính nhanh hơn.


3

Gần đây tôi đã gặp phải vấn đề tương tự vì quên quy mô các tính năng trong bộ dữ liệu của mình, trước đây được sử dụng để huấn luyện loại mô hình đồng bộ. Việc không mở rộng quy mô dữ liệu có thể là thủ phạm có khả năng được chỉ ra bởi Shelby Matlock. Bạn có thể thử các bộ chia tỷ lệ khác nhau có sẵn trong sklearn, chẳng hạn như RobustScaler :

from sklearn.preprocessing import RobustScaler scaler = RobustScaler() X = scaler.fit_transfrom(X)

X hiện đã được chuyển đổi / thu nhỏ và sẵn sàng để được cung cấp cho mô hình mong muốn của bạn.


2

Điều này thật ý nghĩa. IIUC, tốc độ thực hiện các hoạt động vectơ hỗ trợ bị ràng buộc bởi số lượng mẫu, không phải theo chiều. Nói cách khác, nó bị giới hạn bởi thời gian CPU chứ không phải RAM. Tôi không chắc chính xác sẽ mất bao nhiêu thời gian, nhưng tôi đang chạy một số điểm chuẩn để tìm hiểu.


1

Để nó chạy qua đêm hoặc tốt hơn trong 24 giờ. Việc sử dụng CPU của bạn là gì? Nếu không có lõi nào đang chạy ở mức 100% thì bạn có vấn đề. Có lẽ là với trí nhớ. Bạn đã kiểm tra xem liệu dữ liệu của bạn có phù hợp với 8GB không? Bạn đã thử SGDClassifier chưa? Đây là một trong những nhanh nhất ở đó. Đáng để thử nó trước tiên hy vọng nó hoàn thành trong một giờ hoặc lâu hơn.


SGDClassifierkhông hỗ trợ hạt nhân. Nếu OP muốn SVM tuyến tính, thì tôi khuyên bạn nên thử trước LinearSVR. Nó nhanh hơn nhiều so với SVRvì nó giải quyết vấn đề bằng cách sử dụng thư viện hồi quy tuyến tính và mức tối thiểu toàn cầu được đảm bảo (không giống như độ dốc giảm dần).
Ricardo Cruz

Đánh giá cao bình luận của bạn. Bạn có thể giải thích tại sao hỗ trợ kernel là một vấn đề?
Diego

Từ các tài liệu , The loss function to be used. Defaults to ‘hinge’, which gives a linear SVM.điều tương tự cho SGDRegressor. SGDRegressortương đương với việc sử dụng SVR(kernel='linear'). Nếu đó là những gì OP muốn, điều đó thật tuyệt. Tôi có ấn tượng rằng anh ấy muốn sử dụng SVM với kernel. Nếu đó không phải là trường hợp, tôi sẽ khuyên anh ấy thử đầu tiên LinearSVR.
Ricardo Cruz

1

Hãy thử bình thường hóa dữ liệu thành [-1,1]. Tôi đã đối mặt với một vấn đề tương tự và khi bình thường hóa mọi thứ hoạt động tốt. Bạn có thể bình thường hóa dữ liệu bằng cách sử dụng:

from sklearn import preprocessing X_train = preprocessing.scale(X_train) X_test = preprocessing.scale(X_test)


@Archie Đây là câu trả lời cho một câu hỏi, không phải câu hỏi.
timleathart

1

Tôi đã gặp phải vấn đề này và cache_sizenhư những người khác đang đề nghị không giúp ích gì cả. Bạn có thể xem bài đăng nàybài đăng này là người đóng góp chính đề nghị bạn nên thay đổi mã theo cách thủ công.

Như bạn đã biết, SVCSVRlà các vấn đề tối ưu hóa và chúng dừng lại khi biên lỗi rất ít khi việc tối ưu hóa thêm là vô ích. Vì vậy, có một tham số khác trong đó max_iter, nơi bạn có thể đặt bao nhiêu lần lặp.

Tôi đã sử dụng sklearntrong python và e1071trong R và R nhanh hơn để đạt được kết quả mà không cần thiết lập max_itersklearnmất 2-4 lần lâu hơn. Cách duy nhất mà tôi có thể giảm thời gian tính toán cho trăn là sử dụng max_iter. Đó là liên quan đến sự phức tạp của mô hình của bạn, số lượng tính năng, hạt nhân và siêu tham số, nhưng đối với tập dữ liệu nhỏ tôi đã sử dụng cho khoảng 4000 datapoint và max_iter10000kết quả không khác nhau chút nào và đó là chấp nhận được.


0

Tôi chỉ gặp vấn đề tương tự với bộ dữ liệu chỉ chứa 115 yếu tố và chỉ có một tính năng duy nhất (dữ liệu của hãng hàng không quốc tế). Giải pháp là mở rộng quy mô dữ liệu. Điều tôi đã bỏ lỡ trong các câu trả lời cho đến nay là việc sử dụng Đường ống:

from sklearn.svm import SVR
from sklearn.preprocessing import StandardScaler, MinMaxScaler

model = Pipeline([('scaler', StandardScaler()),
                  ('svr', SVR(kernel='linear'))])

Bạn có thể đào tạo modelnhư một mô hình phân loại / hồi quy thông thường và đánh giá nó theo cùng một cách. Không có gì thay đổi, chỉ có định nghĩa của mô hình.


Pipelinegì Bạn không nhập nó.
Bram Vanroy

0

Bạn cần mở rộng quy mô dữ liệu của bạn. Chia tỷ lệ sẽ bình thường hóa các điểm dữ liệu của bạn thành phạm vi -1 đến 1, điều này sẽ giúp hội tụ nhanh hơn.

Hãy thử sử dụng mã sau đây:

# X is your numpy data array.

from sklearn import preprocessing

X = preprocessing.scale(X)

Chào mừng đến với Khoa học dữ liệu SE! Bạn có thể giải thích đề nghị của bạn sẽ giúp OP như thế nào? Những gì bạn đang đề xuất là một tỷ lệ của một mảng. Không rõ làm thế nào mà có thể hoặc không ảnh hưởng đến thuật toán SVR trong scikit learn.
Âm thanh nổi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.