Phân tích dữ liệu lớn - Học trực tuyến

Học trực tuyến là một lĩnh vực con của học máy cho phép mở rộng mô hình học có giám sát thành tập dữ liệu lớn. Ý tưởng cơ bản là chúng ta không cần phải đọc tất cả dữ liệu trong bộ nhớ để phù hợp với một mô hình, chúng ta chỉ cần đọc từng thể hiện tại một thời điểm.

Trong trường hợp này, chúng tôi sẽ trình bày cách triển khai thuật toán học trực tuyến bằng cách sử dụng hồi quy logistic. Như trong hầu hết các thuật toán học có giám sát, có một hàm chi phí được giảm thiểu. Trong hồi quy logistic, hàm chi phí được định nghĩa là:

$$ J (\ theta) \: = \: \ frac {-1} {m} \ left [\ sum_ {i = 1} ^ {m} y ^ {(i)} log (h _ {\ theta} ( x ^ {(i)})) + (1 - y ^ {(i)}) log (1 - h _ {\ theta} (x ^ {(i)})) \ right] $$

trong đó J (θ) đại diện cho hàm chi phí và h θ (x) đại diện cho giả thuyết. Trong trường hợp hồi quy logistic, nó được định nghĩa theo công thức sau:

$$ h_ \ theta (x) = \ frac {1} {1 + e ^ {\ theta ^ T x}} $$

Bây giờ chúng ta đã xác định hàm chi phí, chúng ta cần tìm một thuật toán để giảm thiểu nó. Thuật toán đơn giản nhất để đạt được điều này được gọi là descent gradient ngẫu nhiên. Quy tắc cập nhật của thuật toán cho các trọng số của mô hình hồi quy logistic được định nghĩa là:

$$ \ theta_j: = \ theta_j - \ alpha (h_ \ theta (x) - y) x $$

Có một số cách triển khai của thuật toán sau đây, nhưng thuật toán được triển khai trong thư viện wabbit thềpal cho đến nay là cách được phát triển nhất. Thư viện cho phép đào tạo các mô hình hồi quy quy mô lớn và sử dụng lượng RAM nhỏ. Theo lời của chính những người sáng tạo, nó được mô tả là: "Dự án Vowpal Wabbit (VW) là một hệ thống học tập nhanh ngoài lõi được tài trợ bởi Microsoft Research và (trước đây) là Yahoo! Research".

Chúng tôi sẽ làm việc với bộ dữ liệu titanic từ một kagglecuộc thi. Dữ liệu gốc có thể được tìm thấy trongbda/part3/vwthư mục. Ở đây, chúng tôi có hai tệp -

  • Chúng tôi có dữ liệu đào tạo (train_titanic.csv) và
  • dữ liệu chưa được gắn nhãn để đưa ra các dự đoán mới (test_titanic.csv).

Để chuyển đổi định dạng csv sang vowpal wabbit định dạng đầu vào sử dụng csv_to_vowpal_wabbit.pytập lệnh python. Rõ ràng bạn sẽ cần phải cài đặt python cho việc này. Điều hướng đếnbda/part3/vw thư mục, mở terminal và thực hiện lệnh sau:

python csv_to_vowpal_wabbit.py

Lưu ý rằng đối với phần này, nếu bạn đang sử dụng windows, bạn sẽ cần cài đặt một dòng lệnh Unix, hãy nhập trang web cygwin cho điều đó.

Mở thiết bị đầu cuối và cả trong thư mục bda/part3/vw và thực hiện lệnh sau:

vw train_titanic.vw -f model.vw --binary --passes 20 -c -q ff --sgd --l1 
0.00000001 --l2 0.0000001 --learning_rate 0.5 --loss_function logistic

Hãy để chúng tôi phân tích từng đối số của vw call có nghĩa.

  • -f model.vw - có nghĩa là chúng tôi đang lưu mô hình trong tệp model.vw để đưa ra dự đoán sau này

  • --binary - Báo cáo tổn thất dưới dạng phân loại nhị phân với -1,1 nhãn

  • --passes 20 - Dữ liệu được sử dụng 20 lần để tìm hiểu trọng số

  • -c - tạo một tệp bộ nhớ cache

  • -q ff - Sử dụng các tính năng bậc hai trong không gian tên f

  • --sgd - sử dụng cập nhật dốc nghiêng ngẫu nhiên thường xuyên / cổ điển / đơn giản, tức là, không có bản gốc, không chuẩn hóa và không bất biến.

  • --l1 --l2 - Chính quy định mức L1 và L2

  • --learning_rate 0.5 - Tốc độ học tập αas được xác định trong công thức quy tắc cập nhật

Đoạn mã sau đây cho thấy kết quả của việc chạy mô hình hồi quy trong dòng lệnh. Trong kết quả, chúng tôi nhận được tổn thất log trung bình và một báo cáo nhỏ về hiệu suất thuật toán.

-loss_function logistic
creating quadratic features for pairs: ff  
using l1 regularization = 1e-08 
using l2 regularization = 1e-07 

final_regressor = model.vw 
Num weight bits = 18 
learning rate = 0.5 
initial_t = 1 
power_t = 0.5 
decay_learning_rate = 1 
using cache_file = train_titanic.vw.cache 
ignoring text input in favor of cache input 
num sources = 1 

average    since         example   example  current  current  current 
loss       last          counter   weight    label   predict  features 
0.000000   0.000000          1      1.0    -1.0000   -1.0000       57 
0.500000   1.000000          2      2.0     1.0000   -1.0000       57 
0.250000   0.000000          4      4.0     1.0000    1.0000       57 
0.375000   0.500000          8      8.0    -1.0000   -1.0000       73 
0.625000   0.875000         16     16.0    -1.0000    1.0000       73 
0.468750   0.312500         32     32.0    -1.0000   -1.0000       57 
0.468750   0.468750         64     64.0    -1.0000    1.0000       43 
0.375000   0.281250        128    128.0     1.0000   -1.0000       43 
0.351562   0.328125        256    256.0     1.0000   -1.0000       43 
0.359375   0.367188        512    512.0    -1.0000    1.0000       57 
0.274336   0.274336       1024   1024.0    -1.0000   -1.0000       57 h 
0.281938   0.289474       2048   2048.0    -1.0000   -1.0000       43 h 
0.246696   0.211454       4096   4096.0    -1.0000   -1.0000       43 h 
0.218922   0.191209       8192   8192.0     1.0000    1.0000       43 h 

finished run 
number of examples per pass = 802 
passes used = 11 
weighted example sum = 8822 
weighted label sum = -2288 
average loss = 0.179775 h 
best constant = -0.530826 
best constant’s loss = 0.659128 
total feature number = 427878

Bây giờ chúng ta có thể sử dụng model.vw chúng tôi đã đào tạo để tạo dự đoán với dữ liệu mới.

vw -d test_titanic.vw -t -i model.vw -p predictions.txt

Các dự đoán được tạo trong lệnh trước đó không được chuẩn hóa để phù hợp với phạm vi [0, 1]. Để làm điều này, chúng tôi sử dụng một phép biến đổi sigmoid.

# Read the predictions
preds = fread('vw/predictions.txt')  

# Define the sigmoid function 
sigmoid = function(x) { 
   1 / (1 + exp(-x)) 
} 
probs = sigmoid(preds[[1]])  

# Generate class labels 
preds = ifelse(probs > 0.5, 1, 0) 
head(preds) 
# [1] 0 1 0 0 1 0