Học máy có thể dự đoán nghèo đói?


Dương Hồng Lâm
1 năm trước
Hữu ích 3 Chia sẻ Viết bình luận 0
Đã xem 7959

Nguồn: Wikimedia

Ngân hàng Thế giới đã tổ chức một cuộc thi dự đoán nghèo trên trang web lưu trữ cạnh tranh drivendata.org. Chúng tôi quyết định thử các kỹ năng học máy của chúng tôi trên bộ dữ liệu này. Hầu hết công việc thường xuyên tại ParallelDots xoay quanh ba chủ đề: phân tích hình ảnh trên hình ảnh và video, chăm sóc sức khỏe AI và NLP, cả ba đều được giải quyết bằng các kỹ thuật học sâu. Cuộc thi này là cơ hội để thử một cái gì đó mới và xây dựng cơ sở mã nội bộ của chúng tôi để xử lý các bộ dữ liệu dạng bảng như những gì chúng tôi có trong cuộc thi.

Những gì chúng tôi muốn đạt được từ cuộc thi là:

  1. Hãy thử vô số mô hình học máy có thể giải quyết vấn đề.
  2. Hãy thử các phương thức AutoML hiện có. (Các phương thức AutoML chỉ cần bạn thiết kế tính năng cho chúng và chúng sẽ tự mình tìm ra phần còn lại của đường ống.)
  3. Tạo một mô hình tốt nhất để giải quyết vấn đề mà không gặp phải quá nhiều mô hình và nâng cao điểm số. Vì AIaaS là ​​công việc hàng ngày của chúng tôi, việc tối ưu hóa cho một mô hình tốt là quan trọng hơn đối với chúng tôi vì các nhóm không thể triển khai như các dịch vụ.
  4. Xây dựng một kho lưu trữ mã để giải quyết các vấn đề về khoa học dữ liệu và máy học trong tương lai.

Phân tích bộ dữ liệu (không có nhiều mồ hôi)

Nhiệm vụ đầu tiên như trong bất kỳ dự án máy học nào là phân tích các bộ dữ liệu và xem các thuộc tính của chúng. Một số thông tin chúng ta có thể rút ra chỉ bằng cách xem tập dữ liệu là:

  1. Có các tệp dữ liệu cho ba quốc gia khác nhau.
  2. Tất cả các trường được ẩn danh và mã hóa, vì vậy bạn không biết ý nghĩa của các trường. Điều này làm giảm bất kỳ cơ hội kỹ thuật tính năng cụ thể miền nào về không.
  3. Dữ liệu cho cả ba quốc gia là hoàn toàn khác nhau, vì vậy một người cần xây dựng ba mô hình: một mô hình cho mỗi quốc gia.

Một cách để đi sâu hơn vào dữ liệu (một cách nhanh chóng) là sử dụng gói hồ sơ gấu trúc mới (có thể tải xuống từ GitHub tại đây ). Gói này thực hiện nhiều phân tích chính và lưu chúng dưới dạng các tệp HTML đẹp mà người ta có thể xem trên trình duyệt của họ. Chúng tôi đã chạy hồ sơ gấu trúc  trên dữ liệu của cả ba quốc gia để hiểu thêm về các kiểu dữ liệu, tần số, mối tương quan, v.v.

Đầu ra mẫu cho một trong các quốc gia có thể được nhìn thấy trong hình ảnh sau đây:

hồ sơ gấu trúc cho thấy một cái nhìn tổng quan về dữ liệu của Quốc gia C
Chi tiết thống kê cấp độ tính năng được tạo bởi hồ sơ gấu trúc 

Tương quan giữa các tính năng khác nhau

Một số kết luận khác chúng ta có thể rút ra là:

  1. Dường như có một giá trị mặc định cho hầu hết các trường phân loại là giá trị phổ biến nhất cho trường. (Ví dụ, trong hình trên, bạn có thể thấy trường AOSWkWKB có giá trị mặc định - phải mất 80% + lần.)
  2. Các bộ dữ liệu rất mất cân bằng; chúng ta cần phải chăm sóc điều đó trong khi đào tạo.

2 cách để mô hình hóa dữ liệu

Nếu nhìn vào các kiểu dữ liệu của các đối tượng, họ có thể thấy rằng dữ liệu là hỗn hợp của các giá trị phân loại (các thuộc tính có thể lấy một trong số các giá trị không thể đếm được) và các giá trị số (cả số float và số nguyên). Trên thực tế, đó là cách điểm chuẩn rừng ngẫu nhiên được cung cấp bởi các mô hình WorldBank hoạt động. Tuy nhiên, khi bạn xem số lượng, chúng không nhiều và có thể đại diện cho số lượng như ngày sinh, v.v. (Nếu bạn đã tham gia khóa học Coursera , Dmitry nói về một bộ trường tương tự trong phần Xử lý dữ liệu ẩn danh. ) Vì vậy, một cách tiếp cận khác mà chúng tôi muốn thử là coi tất cả các trường là thuộc tính phân loại. Chúng tôi đã kết thúc cố gắng cả hai.

Mất cân bằng dữ liệu

Một thuộc tính quan trọng khác của bộ dữ liệu là sự mất cân bằng giữa các lớp + ve-ve (người không nghèo vượt xa số người nghèo). Đối với Quốc gia A, dữ liệu vẫn được cân bằng, nhưng đối với B và C, dữ liệu có phân phối rất sai lệch. Để huấn luyện các mô hình trên dữ liệu sai lệch như vậy, chúng tôi đã thử các cách tiếp cận khác nhau bằng cách sử dụng thư viện tìm hiểu mất cân bằng trong Python:

  1. Đào tạo về bộ dữ liệu sai lệch (hoạt động tốt, nhưng không quá lớn).
  2. Đào tạo về một tập dữ liệu với một lớp phủ định được gạch dưới (hoạt động rất tệ; ngay cả những mô hình học máy tốt nhất cũng có thể hoạt động tốt như đường cơ sở với tập dữ liệu này).
  3. Oversampling lớp + ve (hoạt động khá tốt).
  4. Oversampling sử dụng thuật toán SMOTE (không hoạt động tốt như oversampling thông thường, chủ yếu là do thuật toán SMOTE không thực sự được xác định cho các thuộc tính phân loại).
  5. Overampling sử dụng ADASYN (không hoạt động tốt như oversampling thông thường).

Sơ chế

Bộ dữ liệu đã được xử lý trước như sau:

  1. Tất cả các tính năng phân loại đã được chuyển đổi thành các tính năng nhị phân.
  2. Các giá trị số đã được chuẩn hóa. Cả hai chuẩn hóa max-min và mean-std đã được thử nghiệm.
  3. Dữ liệu cấp độ hộ gia đình và cấp độ cá nhân đã được hợp nhất (dữ liệu cấp độ cá nhân có dữ liệu riêng cho từng thành viên của tất cả các hộ gia đình được cung cấp). Chỉ dữ liệu cấp hộ gia đình được giữ lại cho các thuộc tính phổ biến trong dữ liệu cá nhân và hộ gia đình. Chúng tôi lấy giá trị trung bình của tất cả các tính năng số trong dữ liệu hộ gia đình (có thể không phải là cách tốt nhất) và tất cả các giá trị phân loại được tổng hợp thành giá trị kỳ lạ nhất trong số các hộ gia đình (ví dụ: nếu Tính năng X có giá trị 1,1, 1,0 trong hộ gia đình, chúng tôi sẽ lấy giá trị kết hợp cho hộ gia đình là 0). Lý do là rất nhiều biến phân loại giữ giá trị mặc định và chúng tôi hy vọng giá trị lẻ sẽ có thêm thông tin.

Phương pháp tiếp cận chúng tôi đã thử

Bây giờ chúng tôi nói về nhiều cách tiếp cận mà chúng tôi đã cố gắng.

Những thứ không hoạt động :

  1. Chúng tôi nghĩ rằng các thuộc tính mặc định cho các trường phân loại có thể không hữu ích cho mô hình hóa. Để kiểm tra điều này, chúng tôi đã đào tạo các mô hình Machine Learning cả có và không có các thuộc tính mặc định. Các mô hình không được cung cấp các thuộc tính mặc định luôn hoạt động kém hơn các mô hình được cung cấp các giá trị mặc định.
  2. Quá khổ quá mức SMote và ADASYN không cho kết quả tốt hơn so với quá mức bình thường.
  3. Học máy hai giai đoạn: người đầu tiên tạo ra cây quyết định để có được tầm quan trọng của các tính năng và người còn lại để đào tạo về các tính năng quan trọng nhất. Chúng tôi đã không nhận được bất kỳ lợi ích bằng cách thử kỹ thuật này.
  4. Thử các phương pháp khác nhau để bình thường hóa dữ liệu số không thay đổi độ chính xác. Tuy nhiên, các thuộc tính số không được chuẩn hóa có độ chính xác kém hơn.

Thủ thuật giúp chúng tôi tăng điểm :

  1. Sự kết hợp của các tính năng số và phân loại đã làm việc tốt hơn để đào tạo các thuật toán hơn tất cả các thuộc tính phân loại - ít nhất là cho các cây quyết định.
  2. Việc lựa chọn các giá trị mặc định cho dữ liệu bị thiếu đã giúp chúng tôi cải thiện độ chính xác của chúng tôi. Chúng tôi đã bắt đầu bằng cách làm cho tất cả các giá trị bị thiếu là 0, nhưng sau đó được sử dụng -999, hoạt động tốt hơn.
  3. Tìm kiếm dạng lưới trên các siêu đường kính học máy giúp chúng tôi tốt hơn 2-4% trên bộ xác thực mà không cần nỗ lực.
  4. Một đường cơ sở AutoML mạnh mẽ đã giúp chúng tôi bắt đầu tốt.

Các thủ thuật mà chúng tôi muốn thử nhưng không thể / không / quá lười để viết mã :

  1. Kỹ thuật tính năng bằng cách lấy các sản phẩm của Cartesian với các giá trị phân loại không mặc định và sau đó chọn các tính năng quan trọng để đào tạo mô hình.
  2. Kỹ thuật tính năng bằng cách kết hợp các tính năng số theo các cách khác nhau và thực hiện lựa chọn tính năng trên các tính năng được tạo.
  3. Cố gắng tập hợp nhiều mô hình. Chúng tôi trước đó đã cố định mục tiêu để có được một mô hình tốt nhưng cuối cùng vẫn đào tạo được nhiều phương pháp. Chúng tôi có thể kết hợp chúng như một bản hòa tấu như xếp chồng.

Thuật toán học máy

Các thư viện chúng tôi đã sử dụng là SKLearn, XGBOOST và TPOT.

Bây giờ chúng ta sẽ nói về các phương pháp học máy mà chúng ta đã thử, nói về mọi thứ theo thứ tự thời gian, như thứ tự chúng ta đã thử tiếp cận. Xin lưu ý rằng tất cả các thủ thuật hoạt động cho chúng ta đều không có trong lần thử đầu tiên và chúng tôi đã bao gồm chúng từng cái một. Xin vui lòng xem các điểm cho mỗi thử nghiệm để hiểu đường ống tại thời điểm đó là gì. Tất cả các mô hình học máy được sử dụng là từ  thư viện scikit-learn trừ khi có quy định khác.

Các nghi phạm thông thường với các thông số mặc định

  1. Chúng tôi bắt đầu với việc thử các nghi phạm thông thường với các tham số mặc định: hồi quy logistic, SVM và các khu rừng ngẫu nhiên. Chúng tôi cũng đã thử một thư viện mới có tên CATBOOST, nhưng chúng tôi không thể tìm thấy nhiều tài liệu về siêu âm của nó và cũng không thể phù hợp với dữ liệu, vì vậy chúng tôi đã quyết định thay thế nó bằng XGBOOST nổi tiếng hơn. Chúng tôi cũng đã có kiến ​​thức về điều chỉnh siêu tham số XGBOOST (điều mà chúng tôi biết rằng chúng tôi phải thực hiện trong các giai đoạn sau).
  2. Nỗ lực đầu tiên mô hình hóa tất cả các cột dưới dạng dữ liệu phân loại và dữ liệu không cân bằng.
  3. Tất cả các mô hình đều phù hợp và cho chúng tôi độ chính xác cao hơn so với việc tung đồng xu vào dữ liệu xác nhận. Điều đó cho chúng ta biết rằng đường ống trích xuất dữ liệu vẫn ổn (không có lỗi rõ ràng nhưng cần phải được hoàn thiện thêm).
  4. Giống như đường cơ sở được cung cấp bởi các nhà cung cấp cạnh tranh, các khu rừng ngẫu nhiên và XGBOOST với các siêu đường kính mặc định cho thấy kết quả tốt.
  5. LR và SVM có thể mô hình hóa dữ liệu tốt (không tốt như RF và XGBOOST do ít phương sai trong các siêu đường kính mặc định). SVM (SKLearn SVC) cũng có độ chính xác tốt, nhưng xác suất mà nó trả về không thực sự có thể sử dụng được trong SKLearn (mà tôi thấy là một vấn đề phổ biến với siêu âm mặc định ), khiến chúng tôi bỏ SVM khi cuộc thi được đánh giá là mất log trung bình - và điều này sẽ đòi hỏi nỗ lực thêm để đảm bảo rằng các số xác suất là đúng. Đó chỉ là xác suất trả về SVC không phải là xác suất chính xác mà là một số loại điểm.

TPOT: AutoML tạo ra một đường cơ sở tốt

  1. Vẫn tiếp tục với tất cả các tính năng được coi là phân loại, chúng tôi đã cố gắng điều chỉnh đường cơ sở bằng phương pháp AutoML gọi là TPOT .
  2. TPOT sử dụng các thuật toán di truyền để tìm ra một hệ thống máy học tốt cho vấn đề hiện tại cùng với các siêu đường kính sẽ sử dụng với nó.
  3. Điều này đã đưa chúng tôi vào Top 100 trong bảng xếp hạng công chúng cạnh tranh tại thời điểm chúng tôi gửi nó.
  4. TPOT cần có thời gian để tìm ra đường ống dẫn và hội tụ trong vài giờ cho toàn bộ tập dữ liệu.

Mạng thần kinh có thể được sử dụng? Mạng lưới thần kinh, bất cứ ai?

Tình yêu mà chúng ta dành cho việc học sâu đã khiến đôi tay của chúng ta ngứa ngáy khi thử một cái gì đó mạng lưới thần kinh - y. Chúng tôi đặt ra trước để đào tạo một thuật toán mạng thần kinh tốt cũng có thể giải quyết vấn đề này. Xin lưu ý rằng tại thời điểm này, chúng tôi đang thực hiện các thử nghiệm coi tất cả các cột là phân loại. Một vấn đề có nhiều biến phân loại và cần dự đoán nhãn là gì? Phân loại văn bản. Đó là một nơi mà mạng lưới thần kinh tỏa sáng rất nhiều. Tuy nhiên, không giống như văn bản, bộ dữ liệu này không có khái niệm về trình tự, vì vậy chúng tôi đã quyết định sử dụng mạng thần kinh phổ biến trong phân loại văn bản nhưng không tính đến thứ tự. Thuật toán đó là FastText. Chúng tôi đã viết một phiên bản (sâu) của văn bản nhanh như thuật toán trong Keras để đào tạo về bộ dữ liệu. Một điều khác mà chúng tôi đã làm để đào tạo mạng lưới thần kinh là quá tải lớp thiểu số, vì nó không đào tạo tốt về dữ liệu mất cân bằng.

FFNN đã sử dụng

Chúng tôi đã thử đào tạo bằng cách sử dụng các mạng thần kinh tự chuẩn hóa gần đây. Điều này đã cho chúng tôi một sự chính xác miễn phí trên bộ xác nhận.

FFNN tự chuẩn hóa (TỰU) chúng tôi đã sử dụng

Mặc dù chúng tôi đã đạt được độ chính xác khi xác thực khi chúng tôi sử dụng các mạng thần kinh sâu, đặc biệt là Quốc gia B, nơi độ chính xác cao nhất mà chúng tôi từng nhận được (thậm chí tốt hơn mô hình hoạt động tốt nhất của chúng tôi) là sử dụng mạng thần kinh sâu tự chuẩn hóa - kết quả không dịch trên bảng xếp hạng nơi chúng tôi tiếp tục nhận được điểm thấp (logloss cao).

Hướng tới cải thiện đường cơ sở AutoML và điều chỉnh XGBOOST

Đường cơ sở AutoML mà chúng tôi tạo ra vẫn khiến chúng tôi nhìn chằm chằm, vì tất cả các phương pháp thủ công của chúng tôi vẫn còn tồi tệ hơn. Do đó, chúng tôi đã quyết định chuyển sang các mô hình XGBOOST đã thử nghiệm và thử nghiệm để cải thiện điểm số. Chúng tôi đã viết một đường truyền dữ liệu để thử các thủ thuật khác nhau mà chúng tôi đã đề cập (thành công / không thành công) và một đường ống dẫn để tìm kiếm trên các siêu đường kính khác nhau và thử xác thực chéo năm lần.

Ví dụ tìm kiếm lưới cho bộ xác nhận đơn

Các thủ thuật hoạt động ở trên kết hợp với tìm kiếm dạng lưới đã giúp tăng điểm số rất lớn và chúng tôi có thể đánh bại 0,2 logloss và sau đó là 0,9 điểm logloss. Chúng tôi đã thử một TPOT AutoML khác với bộ dữ liệu được tạo bởi các thủ thuật thành công của chúng tôi, nhưng nó chỉ có thể chiếm tới một đường ống có gần 0,2 logloss trên bảng xếp hạng. Vì vậy, cuối cùng, mô hình XGBOOST hóa ra là tốt nhất. Chúng tôi không thể có được độ chính xác của cùng một thứ tự khi chúng tôi cố gắng tìm kiếm lưới trên các tham số của thuật toán rừng ngẫu nhiên.

Điểm / thứ hạng của chúng tôi kém hơn một chút trên bảng xếp hạng tư nhân so với bảng xếp hạng cạnh tranh công khai. Chúng tôi đã kết thúc cuộc thi ở khoảng phần trăm thứ 90.

Hữu ích 3 Chia sẻ Viết bình luận 0
Đã xem 7959