Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

Dự báo xu hướng với Linear Regression trong Ruby: Hướng dẫn thực tế

Nhiều lựa chọn chúng ta làm xoay quanh mối quan hệ số học.

  • Chúng ta ăn thực phẩm nhất định vì khoa học nói chúng giảm cholesterol
  • Chúng ta tiếp tục học vì có khả năng lương tăng
  • Chúng ta mua nhà ở khu vực tin rằng sẽ tăng giá nhất

Làm sao đến kết luận này? Có lẽ ai đó thu thập lượng lớn data và dùng nó để rút ra kết luận. Một kỹ thuật phổ biến là linear regression, dạng supervised learning. Để info thêm về supervised learning và ví dụ dùng, xem Phần 1 loạt bài.

Mối quan hệ tuyến tính

Khi hai giá trị — gọi x và y — có quan hệ tuyến tính, nghĩa là thay đổi x 1 đơn vị luôn khiến y thay đổi một lượng cố định. Dễ hiểu qua ví dụ:

  • 10 pizza giá 10x giá 1 pizza.
  • Tường cao 10 feet cần gấp đôi sơn so với tường 5 feet.

Toán học, quan hệ này mô tả bằng phương trình đường thẳng:

y = mx + b 

Toán học có thể gây nhầm lẫn, nhưng đôi khi giống phép màu. Khi đầu tiên học phương trình đường thẳng, tôi nhớ nghĩ thật đẹp để tính khoảng cách, độ dốc, và điểm khác trên đường chỉ với một công thức.

Nhưng làm sao có công thức này, nếu chỉ có data points? Câu trả lời là linear regression — công cụ machine learning rất phổ biến.

Ví dụ Linear Regression

Trong bài này, chúng ta khám phá xem beats per minute (BPM) trong bài hát có dự đoán được popularity trên Spotify không.

Linear regression mô hình hóa quan hệ giữa hai biến. Một gọi "explanatory variable" (biến giải thích), kia "dependent variable" (biến phụ thuộc).

Trong ví dụ, muốn xem BPM có "giải thích" popularity không. Vậy BPM là explanatory variable. Popularity thành dependent variable.

Model dùng least-squares regression tìm best fitting line dạng, bạn đoán đúng, y = mx + b.

Mặc dù có thể nhiều explanatory variable, ví dụ này chỉ làm simple linear regression với một biến.

Least-Squares là gì?

Có vài cách làm linear regression. Một gọi "least-squares". Nó tính best fitting line bằng cách minimize tổng bình phương độ lệch dọc từ mỗi data point đến line.

Tôi biết nghe rối, nhưng cơ bản chỉ nói, "Xây line minimize khoảng cách giữa line và data points."

Lý do bình phương và cộng là tránh cancel giữa giá trị dương và âm.

Dự báo xu hướng với Linear Regression trong Ruby: Hướng dẫn thực tế

Ảnh từ Quora giải thích khá tốt.

Dataset

Chúng ta dùng dataset Kaggle: https://www.kaggle.com/leonardopena/top50spotify2019 Tải CSV.

Dataset có 16 cột; tuy nhiên chỉ quan tâm ba — "Track Name", "Beats Per Minute", "Popularity". Bước quan trọng nhất ML là format data đúng, thường gọi "munging". Bạn xóa tất cả data trừ ba cột trên.

CSV nên trông như: Dự báo xu hướng với Linear Regression trong Ruby: Hướng dẫn thực tế

Dùng Ruby làm Regression

Ví dụ này dùng gem ruby_linear_regression. Cài:

gem install ruby_linear_regression 

OK, sẵn sàng code! Tạo file Ruby mới thêm require:

require "ruby_linear_regression" require "csv" 

Tiếp, đọc CSV data và gọi #shift, bỏ header row. Hoặc xóa dòng đầu CSV.

csv = CSV.read("top50.csv") csv.shift 

Tạo hai mảng rỗng cho x-data points và y-data points.

x_data = [] y_data = [] 

...và lặp .each thêm Beats Per Minute vào x array, Popularity vào y array.

Nếu tò mò xem thực sự xảy ra gì, test log row với puts hoặc p. Ví dụ: puts row

csv.each do |row| x_data.push( [row[1].to_i] ) y_data.push( row[2].to_i ) end 

Giờ dùng gem ruby_linear_regression. Tạo instance regression model, load data, train model:

linear_regression = RubyLinearRegression.new linear_regression.load_training_data(x_data, y_data) linear_regression.train_normal_equation 

Tiếp, in mean square error (MSE) — đo sự khác biệt giữa giá trị quan sát và dự đoán. Khác biệt bình phương để giá trị âm/dương không cancel. Muốn minimize MSE vì không muốn khoảng cách predicted và actual lớn.

puts "Trained model with the following cost fit #{linear_regression.compute_cost}" 

Cuối cùng, dùng model dự đoán. Cụ thể, bài hát 250 BPM popularity bao nhiêu? Thoải mái đổi giá trị trong prediction_data.

prediction_data = [250] predicted_popularity = linear_regression.predict(prediction_data) puts "Predicted popularity: #{predicted_popularity.round}" 

Kết quả

Chạy chương trình console xem!

➜ ~ ruby spotify_regression.rb Trained model with the following cost fit 9.504882197447587 Predicted popularity: 91 

Tuyệt! Đổi "250" thành "50" xem model dự đoán gì.

➜ ~ ruby spotify_regression.rb Trained model with the following cost fit 9.504882197447587 Predicted popularity: 86 

Có vẻ bài hát BPM cao hơn phổ biến hơn.

Chương trình hoàn chỉnh

Đây là file hoàn chỉnh của tôi:

require 'csv' require 'ruby_linear_regression' x_data = [] y_data = [] csv = CSV.read("top50.csv") csv.shift # Load data từ CSV vào hai mảng -- một cho independent variables X (x_data) và một cho dependent variable y (y_data) # Row[0] = title # Row[1] = BPM # Row[2] = Popularity csv.each do |row| x_data.push( [row[1].to_i] ) y_data.push( row[2].to_i ) end # Create regression model linear_regression = RubyLinearRegression.new # Load training data linear_regression.load_training_data(x_data, y_data) # Train model dùng normal equation linear_regression.train_normal_equation # Output cost puts "Trained model with the following cost fit #{linear_regression.compute_cost}" # Predict popularity bài hát 250 BPM prediction_data = [250] predicted_popularity = linear_regression.predict(prediction_data) puts "Predicted popularity: #{predicted_popularity.round}" 

Bước tiếp theo

Đây ví dụ rất đơn giản, nhưng bạn vừa chạy linear regression đầu tiên, kỹ thuật quan trọng cho ML. Nếu thèm thêm, vài điều có thể làm: - Xem source code gem Ruby dùng để thấy toán học dưới lớp - Quay lại dataset gốc thử thêm biến vào model chạy multi-variable linear regression xem có giảm MSE không. Ví dụ, "valence" (tính tích cực bài hát) có vai trò popularity không. - Thử gradient descent model, cũng chạy được bằng gem ruby_linear_regression.