2012-07-29 34 views
12

Làm cách nào để sử dụng tính năng tìm hiểu để đào tạo mô hình trên dữ liệu csv lớn (~ 75MB) mà không gặp sự cố về bộ nhớ?Scikit và Pandas: Lắp dữ liệu lớn

Tôi đang sử dụng máy tính xách tay IPython làm môi trường lập trình và các gói gấu trúc + sklearn để phân tích dữ liệu từ hướng dẫn nhận dạng chữ số của kaggle.

Các dữ liệu có sẵn trên webpage, liên kết đến my code, và đây là error message:

KNeighborsClassifier được sử dụng để dự đoán.

Vấn đề:

"MemoryError" xảy ra khi tải dữ liệu lớn sử dụng read_csv chức năng. Để tạm thời bỏ qua vấn đề này, tôi phải khởi động lại hạt nhân , sau đó hàm read_csv tải thành công tệp, nhưng cùng một lỗi xảy ra khi tôi chạy lại cùng một ô.

Khi read_csv chức năng tải các tập tin thành công, sau khi thực hiện thay đổi đối với dataframe, tôi có thể vượt qua các tính năng và nhãn để phù hợp của KNeighborsClassifier() chức năng. Tại thời điểm này, lỗi bộ nhớ tương tự xảy ra.

tôi thử như sau:

Duyệt qua tệp CSV trong khối, và phù hợp với những dữ liệu cho phù hợp, nhưng vấn đề là mô hình tiên đoán được ghi đè tất cả thời gian cho một đoạn dữ liệu.

Bạn nghĩ tôi có thể làm gì để đào tạo thành công mô hình của mình mà không gặp phải vấn đề về bộ nhớ?

+0

Mã + dữ liệu của bạn chạy tốt trên máy tính xách tay. Nó đòi hỏi khoảng 1,2 GB bộ nhớ. Hệ thống của bạn có bao nhiêu bộ nhớ? – Sicco

+1

Đã làm việc bằng cách sử dụng loadtxt. Ngay cả khi không có sự xuất hiện của lỗi bộ nhớ, chỉ chạy ~ 75MB dữ liệu trên thuật toán chiếm hơn 1GB ram ... Tôi không chắc liệu tôi có làm gì sai trong mã của mình hay không. (http://pastie.org/4354911) (sổ ghi chép ipython). Nếu đó chỉ là thuật toán thực hiện việc này lâu, bạn tải gigabyte dữ liệu trên thuật toán như thế nào mà không mất quá nhiều thời gian để tạo một mô hình? –

+4

Bạn có thể sử dụng thuật toán có thể được đào tạo từng bước, do đó chỉ xử lý một phần nhỏ dữ liệu tại một thời điểm. Một bộ ước lượng trong scikit-learn có khả năng làm điều này nếu nó thực hiện phương thức 'partial_fit'. – Sicco

Trả lời

10

Lưu ý: khi bạn tải dữ liệu bằng gấu trúc, nó sẽ tạo đối tượng DataFrame trong đó mỗi cột có kiểu dữ liệu đồng nhất cho tất cả các hàng nhưng 2 cột có thể có kiểu dữ liệu riêng biệt (ví dụ: số nguyên, ngày, chuỗi).

Khi bạn chuyển một ví dụ DataFrame đến mô hình học hỏi, trước tiên nó sẽ phân bổ mảng numpy 2D đồng nhất với dtype np.float32 hoặc np.float64 (tùy thuộc vào việc triển khai mô hình). Tại thời điểm này, bạn sẽ có 2 bản sao của tập dữ liệu của bạn trong bộ nhớ.

Để tránh điều này, bạn có thể viết/sử dụng lại trình phân tích cú pháp CSV phân bổ trực tiếp dữ liệu theo định dạng nội bộ/dtype được mong đợi bằng mô hình tìm hiểu. Bạn có thể thử ví dụ numpy.loadtxt (xem chuỗi tài liệu cho các tham số). Ngoài ra nếu dữ liệu của bạn rất thưa thớt (nhiều giá trị bằng 0) thì tốt hơn là sử dụng cơ sở dữ liệu scipy.sparse và mô hình học hỏi có thể xử lý định dạng đầu vào như vậy (kiểm tra tài liệu để biết). Tuy nhiên, định dạng CSV không phù hợp lắm với dữ liệu thưa thớt và tôi không chắc có tồn tại trình phân tích cú pháp CSV-to- scipy.sparse trực tiếp hay không.

Edit: để tham khảo KNearestNeighborsClassifer phân bổ khoảng cách mảng tạm thời với hình dạng (n_samples_predict, n_samples_train) mà là rất lãng phí khi chỉ (n_samples_predict, n_neighbors) là cần thiết để thay thế.Sự cố này có thể được theo dõi tại đây:

https://github.com/scikit-learn/scikit-learn/issues/325

+0

loadtxt đang hoạt động tuyệt vời! –

+0

mô hình tìm hiểu scikit cũng không gây ra bất kỳ ngoại lệ bộ nhớ nào. Chỉ có vấn đề bây giờ là ... vì dữ liệu quá lớn, thuật toán mất nhiều thời gian để tạo ra một mô hình. Tôi muốn có một cách để làm cho điều này nhanh hơn nhiều ... –

+2

Bạn nên cố gắng sử dụng 'KNeighborsClassifier' trong chế độ bruteforce (thay vì balltree) nhưng sau đó thời gian dự đoán có thể quá chậm. Ngoài ra, bạn có thể sử dụng các mô hình đơn giản như 'sklearn.linear_model.Perceptron',' sklearn.naive_bayes.MultinomialNB' hoặc 'sklearn.neighbors.NearestCentroidClassifier'. Cuối cùng, bạn cũng có thể thử đào tạo một mô hình trên một mẫu nhỏ dữ liệu của bạn để có ý tưởng nhanh về độ chính xác dự đoán và sau đó tăng gấp đôi kích thước của tập dữ liệu và lặp lại. – ogrisel

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