Làm thế nào để tăng độ chính xác của phân loại?


16

Tôi đang sử dụng ví dụ thư_recog.cpp của OpenCV để thử nghiệm trên các cây ngẫu nhiên và các phân loại khác. Ví dụ này có triển khai sáu phân loại - cây ngẫu nhiên, tăng tốc, MLP, kNN, Bayes ngây thơ và SVM. Bộ dữ liệu nhận dạng thư UCI với 20000 trường hợp và 16 tính năng được sử dụng, tôi chia làm một nửa để đào tạo và thử nghiệm. Tôi có kinh nghiệm với SVM vì vậy tôi nhanh chóng đặt lỗi nhận dạng của nó thành 3,3%. Sau một số thử nghiệm, những gì tôi nhận được là:

Nhận dạng thư UCI:

  • RTrees - 5,3%
  • Tăng - 13%
  • MLP - 7,9%
  • kNN (k = 3) - 6,5%
  • Bayes - 11,5%
  • SVM - 3,3%

Các thông số được sử dụng:

  • RTrees - max_num_of_trees_in_the_forrest = 200, max_depth = 20, min_sample_count = 1

  • Tăng - boost_type = REAL, yếu_count = 200, weight_trim_rate = 0.95, max_depth = 7

  • MLP - phương thức = BACKPROP, param = 0,001, max_iter = 300 (giá trị mặc định - quá chậm để thử nghiệm)

  • kNN (k = 3) - k = 3

  • Bayes - không

  • SVM - Hạt nhân RBF, C = 10, gamma = 0,01

Sau đó, tôi đã sử dụng cùng một tham số và thử nghiệm trên bộ dữ liệu Digits và MNIST bằng cách trích xuất các tính năng gradient trước (kích thước vectơ 200 phần tử):

Chữ số:

  • RTrees - 5,1%
  • Tăng - 23,4%
  • MLP - 4,3%
  • kNN (k = 3) - 7,3%
  • Bayes - 17,7%
  • SVM - 4.2%

MNIST:

  • RTrees - 1,4%
  • Tăng cường - hết bộ nhớ
  • MLP - 1,0%
  • kNN (k = 3) - 1,2%
  • Bayes - 34,33%
  • SVM - 0,6%

Tôi chưa quen với tất cả các phân loại trừ SVM và kNN, vì hai điều này tôi có thể nói kết quả có vẻ ổn. Còn những người khác thì sao? Tôi mong đợi nhiều hơn từ các cây ngẫu nhiên, trên MNIST kNN cho độ chính xác tốt hơn, có ý tưởng nào để làm cho nó cao hơn không? Boost và Bayes cho độ chính xác rất thấp. Cuối cùng, tôi muốn sử dụng các trình phân loại này để tạo ra một hệ thống phân loại nhiều. Có lời khuyên nào không?

Câu trả lời:


9

Giảm kích thước

Một thủ tục quan trọng khác là so sánh tỷ lệ lỗi trên tập dữ liệu huấn luyện và kiểm tra để xem bạn có bị thừa không (do "lời nguyền của chiều"). Ví dụ: nếu tỷ lệ lỗi của bạn trên tập dữ liệu kiểm tra lớn hơn nhiều so với lỗi trên tập dữ liệu huấn luyện, thì đây sẽ là một chỉ số.
Trong trường hợp này, bạn có thể thử các kỹ thuật giảm kích thước, chẳng hạn như PCA hoặc LDA.

Nếu bạn quan tâm, tôi đã viết về PCA, LDA và một số kỹ thuật khác ở đây: http://sebastianraschka.com/index.html#machine_learning và trong repo GitHub của tôi ở đây: https://github.com/rasbt/potype_ classifying

Xác nhận chéo

Ngoài ra, bạn có thể muốn xem xét các kỹ thuật xác thực chéo để đánh giá hiệu suất của các trình phân loại của bạn một cách khách quan hơn


Có, thực sự tỷ lệ lỗi trên tập dữ liệu huấn luyện là khoảng 0. Thay đổi tham số để giảm quá mức không dẫn đến độ chính xác cao hơn trên tập dữ liệu thử nghiệm trong trường hợp của tôi. Tôi sẽ xem xét các kỹ thuật bạn đề cập càng sớm càng tốt và nhận xét, cảm ơn bạn.
Mika

Tỷ lệ tương đối của đào tạo và dữ liệu thử nghiệm btw là gì? Một cái gì đó dòng 70:30, 60:40 hoặc 50:50?

Tập dữ liệu đầu tiên - Nhận dạng chữ cái UCI được đặt thành 50:50 (10000: 10000), Chữ số khoảng 51:49 (1893: 1796) và MNIST là khoảng 86:14 (60000: 10000).
Mika

Tôi đã thử nghiệm với PCA, vẫn không có kết quả tốt với việc tạm dừng ngẫu nhiên, nhưng boost và Bayes hiện cho kết quả tương tự như các phân loại khác. Tôi đã tìm thấy một cuộc thảo luận về forrest ngẫu nhiên ở đây: stats.stackexchange.com/questions/66543/NH Có thể tôi thực sự không bị thừa nhưng không thể tìm thấy lỗi dự đoán ngoài túi (OOB) được đề cập ở đó. Chạy thử nghiệm ngay bây giờ với một số lượng lớn cây để xem độ chính xác sẽ được cải thiện.
Mika

Được rồi, âm thanh bạn đang tiến bộ một chút :) Một câu hỏi nhỏ, nhưng bạn đã tiêu chuẩn hóa các tính năng của mình (điểm z) để chúng tập trung quanh giá trị trung bình với độ lệch chuẩn = 1?

5

Tôi mong đợi nhiều hơn từ cây ngẫu nhiên :

  • Với các khu rừng ngẫu nhiên, điển hình cho các tính năng N, các tính năng sqrt (N) được sử dụng cho mỗi lần xây dựng cây quyết định. Vì trong trường hợp của bạn N = 20, bạn có thể thử đặt max_depth (số lượng tính năng phụ để xây dựng mỗi cây quyết định) thành 5.

  • Thay vì cây quyết định, các mô hình tuyến tính đã được đề xuất và đánh giá như các công cụ ước tính cơ sở trong các khu rừng ngẫu nhiên, đặc biệt là hồi quy logistic đa thức và Bayes ngây thơ. Điều này có thể cải thiện độ chính xác của bạn.

Trên MNIST kNN cho độ chính xác tốt hơn, có ý tưởng nào để làm cho nó cao hơn không?

  • Hãy thử với giá trị K cao hơn (nói 5 hoặc 7). Giá trị cao hơn của K sẽ cung cấp cho bạn bằng chứng hỗ trợ nhiều hơn về nhãn lớp của một điểm.
  • Bạn có thể chạy Phân tích phân biệt đối xử tuyến tính của PCA hoặc Fisher trước khi chạy hàng xóm gần nhất k. Bằng cách này, bạn có khả năng có thể thoát khỏi các tính năng tương quan trong khi tính toán khoảng cách giữa các điểm và do đó, hàng xóm k của bạn sẽ mạnh mẽ hơn.
  • Hãy thử các giá trị K khác nhau cho các điểm khác nhau dựa trên phương sai trong khoảng cách giữa các lân cận K.

Tôi tin rằng bạn đang đề cập đến tham số OpenCV nactive_vars (không phải max_depth), mà tôi đặt thành giá trị sqrt (N) mặc định, đó là nactive_vars = sqrt (16) cho tập dữ liệu đầu tiên và sqrt (200) cho hai tập dữ liệu khác. max_depth xác định xem cây có phát triển đến độ sâu đầy đủ hay không (25 là giá trị tối đa của nó) và cân bằng giữa việc thiếu và thừa, thêm về nó ở đây: stats.stackexchange.com/questions/66209/. Không chắc chắn về min_sample_count nhưng tôi đã thử nhiều giá trị khác nhau 1 làm việc tốt nhất.
Mika

Tài liệu OpenCV đưa ra lời giải thích ngắn gọn về các tham số: docs.opencv.org/modules/ml/doc/iêu Bây giờ tôi muốn làm cho các cây ngẫu nhiên hoạt động tốt một cách hợp lý và giữ mọi thứ đơn giản vì tôi muốn tập trung vào làm việc với hệ thống nhiều phân loại.
Mika

Về kNN - đây đều là những gợi ý thực sự tốt, nhưng điều tôi muốn nói là kNN hoạt động tốt hơn so với phân loại cây ngẫu nhiên và tôi nghĩ có rất nhiều chỗ để cải thiện với các cây ngẫu nhiên.
Mika

vâng, tôi không chắc tại sao rừng ngẫu nhiên không hoạt động tốt (hoặc tốt hơn) so với cách tiếp cận k-NN đơn giản ... đó có thể là trường hợp một cách tiếp cận dựa trên hạt nhân mà bạn trực tiếp cố gắng ước tính P (y | D) (dữ liệu đã cho) như trong k-NN mà không ước tính P (theta | D) (mô hình đã cho dữ liệu tiềm ẩn), chẳng hạn như trong các mô hình tham số.
Khởi nghiệp
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.