Giới thiệu về Redis-ML (Phần 1)


Phạm Bảo Ngọc
2 năm trước
Hữu ích 4 Chia sẻ Viết bình luận 0
Đã xem 9081

Mặc dù quan tâm rộng rãi đến học máy (ML), sử dụng nó hiệu quả trong môi trường thời gian thực là một vấn đề phức tạp chưa được các nhà phát triển khung công nhận đủ. Gần như mọi ngôn ngữ đều có một khung để triển khai phần học tập của học tập trên máy học, nhưng rất ít khung hỗ trợ cho phần tiên đoán về khía cạnh của máy học.

Khi bạn đã đào tạo một mô hình ML, làm thế nào bạn có thể xây dựng một ứng dụng thời gian thực dựa trên mô hình đó? Với nhiều bộ công cụ, bạn phải xây dựng ứng dụng của riêng mình. Chúng ta mới bắt đầu thấy các khung tập trung vào khía cạnh dự đoán của học máy.

Trong bài đăng này, chúng ta sẽ đi sâu hơn vào học máy, giải thích một số kỹ thuật theo cách có thể truy cập và chỉ ra cách bạn có thể tăng cường hệ thống máy học với Redis. Ví dụ, chúng tôi sẽ duyệt mã cho một chương trình mẫu để dự đoán giá nhà ở trung bình từ các tính năng khác nhau của một khu phố.

Mã mẫu trong bài viết này được viết bằng Python 3 bằng nhiều gói có sẵn miễn phí cho máy học. Bạn sẽ cần cài đặt các gói sau bằng pip3 hoặc trình quản lý gói ưa thích để chạy các mẫu:

  • scikit-learn (0.18.2)
  • numpy (1.13.1)
  • scipy (0.19.1)
  • làm lại (2.10.5)

Bạn cũng sẽ cần một phiên bản Redis 4.0.0 và mô-đun Redis-ML. Shay Nativ, nhà phát triển đằng sau mô-đun Redis-ML, đã tạo ra một container Docker với Redis 4.0.0 và mô-đun Redis-ML được tải sẵn. Để sử dụng vùng chứa đó kết hợp với mã trong bài đăng này, hãy khởi chạy vùng chứa bằng lệnh:

docker run -it -p 6379:6379 shaynativ/redis-ml

Docker sẽ tự động tải xuống và chạy container, ánh xạ cổng Redis mặc định ( 6379 ) từ container sang máy tính của bạn.

Để xây dựng công cụ dự đoán giá nhà đất, chúng tôi sẽ sử dụng một kỹ thuật học máy được gọi là hồi quy tuyến tính.

Hồi quy tuyến tính là một phần của hộp công cụ của nhà thống kê từ lâu trước khi học máy thuật toán được phát minh. Với hồi quy tuyến tính, chúng tôi cố gắng dự đoán một kết quả (đôi khi được gọi là giá trị phụ thuộc) từ một hoặc nhiều đại lượng đã biết (biến giải thích). Để hồi quy tuyến tính hoạt động, chúng ta phải có khả năng ước tính chính xác kết quả của mình bằng một đường thẳng.

Nguồn

Trong biểu đồ trên, chúng ta có thể thấy cách các điểm dữ liệu của chúng ta tập hợp xung quanh một đường lý tưởng hóa. Tập dữ liệu này là một ứng cử viên tốt cho hồi quy tuyến tính. Trong thực tế, hồi quy tuyến tính được sử dụng để mô hình một loạt các vấn đề trong thế giới thực trong đó mối quan hệ tuyến tính từ các quan sát có thể dự đoán chính xác kết quả, chẳng hạn như giá của một ngôi nhà dựa trên thước vuông, hoặc điểm trung bình đại học từ điểm trung bình GPA và SAT .

Từ đại số, chúng ta biết rằng một dòng được biểu diễn bằng một phương trình có dạng y = b + ax , vì vậy để học được mô hình của dạng này, chúng ta cần áp dụng một thuật toán để khám phá các tham số của đường - độ dốc và đánh chặn. Không có gì lạ mắt lạ thường. Trên thực tế, trước khi học máy bằng thuật toán, hầu hết các nhà thống kê sẽ phù hợp với các mô hình này bằng tay. Ngày nay, việc sử dụng máy tính để tìm các tham số của dòng và nhiều bộ công cụ khác nhau (ví dụ: TensorFlow, Scikit, Apache Spark) là có sẵn để giải quyết vấn đề hồi quy tuyến tính. Điều quan trọng cần nhớ là một khi chúng ta đã học được mô hình hồi quy tuyến tính, chúng ta có một công thức toán học để dự đoán kết quả có thể được thực hiện bởi bất kỳ hệ thống nào.

Chúng ta hãy làm việc thông qua một ví dụ về thực hiện hồi quy tuyến tính và khám phá các tham số mô hình bằng cách sử dụng gói scikit-learn phổ biến của Python và Bộ dữ liệu nhà ở Boston.

Bộ dữ liệu nhà ở Boston là một bộ dữ liệu cổ điển được sử dụng trong giảng dạy thống kê và học máy. Bộ dữ liệu dự đoán giá nhà ở trung bình cho một khu phố trong khu vực Boston sử dụng các đặc điểm của khu phố như số phòng trung bình trong một ngôi nhà, khoảng cách từ các trung tâm việc làm chính của Boston hoặc tỷ lệ tội phạm. Để dễ hình dung hơn quy trình hồi quy tuyến tính, chúng tôi sẽ làm việc với một tính năng duy nhất của dữ liệu: các phòng trung bình trên mỗi cột nhà ở (RM).

Bộ dữ liệu nhà ở Boston được cung cấp như một phần của gói học tập scikit, vì vậy, hãy bắt đầu bằng cách vẽ dữ liệu của chúng tôi để hình dung mối quan hệ giữa số lượng phòng (RM) và giá trung bình (MEDV):

Mặc dù không phải là một dòng hoàn hảo, chúng ta có thể thấy một mối quan hệ tuyến tính khá mạnh mẽ giữa số lượng phòng trung bình và giá nhà trung bình trong một khu phố. Chúng ta thậm chí có thể vẽ một biểu diễn lý tưởng hóa của mối quan hệ và xem cách các điểm dữ liệu tập hợp xung quanh nó.

Đoạn mã sau trình bày cách tải tập dữ liệu Nhà ở Boston bằng scikit. Bộ dữ liệu nhà ở Boston bao gồm mười hai tính năng khác nhau được sử dụng để dự đoán giá nhà đất, vì vậy sau khi tải tập dữ liệu, chúng tôi trích xuất dữ liệu từ cột thứ năm (cột RM) từ dữ liệu cho mẫu của chúng tôi.

from sklearn.datasets import load_boston

boston = load_boston()

boston_RM = boston.data[:,5]
boston_PRICE = boston.target

Bây giờ chúng tôi chia dữ liệu của chúng tôi thành hai bộ: một bộ đào tạo và một bộ thử nghiệm. Ví dụ của chúng tôi, chúng tôi tạo tập huấn luyện của chúng tôi từ 400 mẫu đầu tiên và bộ thử nghiệm từ 106 mẫu còn lại.

# slice the data into train and test sets
x_train = boston_RM[:400].reshape(-1, 1)
x_test = boston_RM[400:].reshape(-1, 1)
y_train = boston.target[:400]
y_test = boston.target[400:]

Phương pháp phân tách này đảm bảo chúng tôi luôn chạy với cùng một bộ cho kết quả có thể lặp lại.

Bây giờ chúng tôi đã xây dựng các bộ kiểm tra và đào tạo của mình, chúng tôi có thể sử dụng mô hình hồi quy tuyến tính được cung cấp bởi scikit để khớp một dòng với dữ liệu của chúng tôi:

lm = LinearRegression()
lm.fit(x_train, y_train)

coef = lm.coef_[0]
int = lm.intercept_
print('Coef: {coef}, Intercept: {int}'.format(coef=coef, int=int))

Sau khi chạy mã của chúng tôi, chúng tôi thấy rằng scikit phù hợp với một dòng dữ liệu của chúng tôi với hệ số 9.40550212 và chặn -35.26094818316348.

Bây giờ chúng ta có các tham số này, chúng ta có thể thực hiện mô hình tuyến tính để dự đoán giá nhà ở khu vực Boston dựa trên số phòng trung bình trong một ngôi nhà trong khu vực lân cận. Bây giờ tôi có mô hình này, làm cách nào tôi có thể xây dựng một ứng dụng để đưa ra dự đoán theo thời gian thực và sử dụng chức năng của một ứng dụng hoặc trang web?

Gói Scikit cung cấp một chức năng dự đoán để đánh giá một mô hình được đào tạo, nhưng sử dụng một chức năng trong một ứng dụng đòi hỏi phải triển khai một loạt các dịch vụ khác để làm cho nó nhanh và đáng tin cậy. Đây là nơi Redis có thể tăng cường hệ thống máy học của bạn.

Mô-đun Redis-ML tận dụng API Mô-đun mới để thêm hồi quy tuyến tính tiêu chuẩn làm kiểu dữ liệu gốc. Mô-đun có thể tạo hồi quy tuyến tính cũng như sử dụng chúng để dự đoán các giá trị.

Để thêm hồi quy tuyến tính vào Redis, bạn cần sử dụng ML.LINREG.SET lệnh để thêm hồi quy tuyến tính vào cơ sở dữ liệu. Các ML.LINGREG.SET lệnh có dạng như sau:

ML.LINREG.SET key intercept coeef [...]

Theo quy ước, tất cả các lệnh trong mô-đun Redis-ML bắt đầu bằng mã định danh của mô-đun, ML. Tất cả các lệnh hồi quy tuyến tính được bắt đầu bằng LINGREG.

Để thiết lập Redis trở thành một công cụ dự đoán cho giá nhà ở Boston bằng cách sử dụng dòng chúng tôi phù hợp với scikit, trước tiên chúng tôi cần tải mô-đun Redis-ML bằng cách sử dụng lệnh loadmodule .

redis-server --loadmodule /path/to/redis-ml/module.so

Sau đó, chúng tôi đặt một khóa để biểu diễn hồi quy tuyến tính bằng cách sử dụng các hằng số từ scikit bằng cách thực hiện ML.LINREG.SET lệnh. Hãy nhớ rằng phần chặn là giá trị đầu tiên được cung cấp và các hệ số được cung cấp theo thứ tự tính năng. Từ mã scikit của chúng tôi để phù hợp với đường hồi quy cho dữ liệu nhà ở, chúng tôi đã xác định dòng của chúng tôi có hệ số 9.40550212 cho biến RM và chặn -35.26094818316348. Chúng ta có thể sử dụng ML.LINGREG.SET lệnh để đặt khóa Redis để tính toán mối quan hệ tuyến tính này:

127.0.0.1:6379> ML.LINREG.SET boston_house_price:rm-only -35.26094818316348 9.40550212 OK

Khi boston_house_price:rm-only khóa của chúng tôi được tạo, chúng tôi có thể liên tục dự đoán giá nhà trung bình trong một khu phố bằng cách sử dụng ML.LINREG.PREDICT lệnh. Để dự đoán giá nhà trung bình trong một khu phố trung bình 6,2 phòng mỗi housem, chúng tôi sẽ chạy lệnh:

127.0.0.1:6379> ML.LINREG.PREDICT boston_house_price:rm-only 6.2 "23.053164960836519”

Redis dự đoán giá nhà trung bình là $ 23,053 (hãy nhớ giá nhà ở của chúng tôi là hàng ngàn) cho khu phố này.

Thật hữu ích để hiểu cách làm việc với các ML.LINREG lệnh từ redis-cli, nhưng nhiều khả năng chúng ta sẽ làm điều này từ một ứng dụng. Chúng ta có thể mở rộng mã Python phù hợp với đường hồi quy để tự động tạo boston_house_price:rm-only khóa trong Redis. Khi chúng tôi đã tạo khóa trong Redis, chúng tôi sẽ triển khai thử nghiệm tạo dự đoán từ Redis bằng dữ liệu thử nghiệm của chúng tôi.

r = redis.StrictRedis('localhost', 6379)
r.execute_command("ML.LINREG.SET", "boston_house_price:rm-only", "-35.26094818316348", "9.40550212", )

redis_predict = []
for x in x_test:
    y = r.execute_command("ML.LINREG.PREDICT", "boston_house_price:rm-only", x[0])
    redis_predict.append(float(y))

Chúng tôi cũng có thể tạo dự đoán của scikit cho cùng một bộ dữ liệu bằng cách sử dụng thói quen dự đoán:

y_predict = lm.predict(x_test) 

Để so sánh, chúng tôi đã vẽ kết quả. Trong biểu đồ bên dưới, các vòng tròn màu đen biểu thị giá thực tế cho dữ liệu thử nghiệm trong bộ dữ liệu của chúng tôi. Các điểm đánh dấu màu xanh lam ( + ) đại diện cho các giá trị được dự đoán bởi Scikit và các dấu hiệu màu đỏ tươi ( x ) đại diện cho các giá trị được dự đoán bởi Redis.

Như bạn có thể thấy, Redis và scikit đưa ra dự đoán tương tự về giá nhà trung bình với số lượng phòng trung bình. Mặc dù hồi quy tuyến tính có thể không dự đoán chính xác giá chính xác của mọi điểm dữ liệu, nhưng nó cung cấp một phương tiện hữu ích để ước tính giá chưa biết dựa trên một số tính năng quan sát được của một vùng lân cận.

Trong bài đăng này, chúng tôi đi sâu hơn vào tính năng hồi quy tuyến tính của Redis-ML. Chúng tôi đã xem xét cách sử dụng gói Python scikit phổ biến để khớp đường hồi quy tuyến tính với một số dữ liệu nhà ở và sau đó tạo ra một công cụ dự đoán giá nhà ở bằng cách sử dụng Redis 4.0.0 và mô-đun Redis-ML.

Trong phần tiếp theo của loạt bài này, chúng ta sẽ xem xét cách Redis-ML có thể được sử dụng để triển khai một công cụ để phân loại, một loại vấn đề học máy khác cố gắng xác định lớp dữ liệu chưa biết từ các ví dụ trước.

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