m2cgen
m2cgen (Mô hình 2 Mã nguồn Generator) – là một thư viện nhẹ cung cấp cách dễ dàng để biên dịch các mô hình thống kê đã được huấn luyện thành mã nguồn native (Python, C, Java, Go, JavaScript, Visual Basic, C#, PowerShell, R, PHP, Dart, Haskell, Ruby, F#, Rust, Elixir).
Cài đặt
Phiên bản Python được hỗ trợ là >= 3.7.
pip install m2cgen
Phát triển
Đảm bảo rằng lệnh sau chạy thành công trước khi gửi một yêu cầu kéo (PR):
make pre-pr
Hoặc bạn có thể chạy phiên bản Docker của cùng một lệnh:
make docker-build docker-pre-pr
Ngôn ngữ được Hỗ trợ
- C
- C#
- Dart
- F#
- Go
- Haskell
- Java
- JavaScript
- PHP
- PowerShell
- Python
- R
- Ruby
- Rust
- Visual Basic (tương thích VBA)
- Elixir
Các Mô hình được Hỗ trợ
| Phân loại| Hồi quy
—|—|—
Tuyến tính|
- scikit-learn
- LogisticRegression
- LogisticRegressionCV
- PassiveAggressiveClassifier
- Perceptron
- RidgeClassifier
- RidgeClassifierCV
- SGDClassifier
- lightning
- AdaGradClassifier
- CDClassifier
- FistaClassifier
- SAGAClassifier
- SAGClassifier
- SDCAClassifier
- SGDClassifier
|
- scikit-learn
- ARDRegression
- BayesianRidge
- ElasticNet
- ElasticNetCV
- GammaRegressor
- HuberRegressor
- Lars
- LarsCV
- Lasso
- LassoCV
- LassoLars
- LassoLarsCV
- LassoLarsIC
- LinearRegression
- OrthogonalMatchingPursuit
- OrthogonalMatchingPursuitCV
- PassiveAggressiveRegressor
- PoissonRegressor
- RANSACRegressor(chỉ các bộ ước tính hồi quy được hỗ trợ có thể được sử dụng như một bộ ước tính cơ sở)
- Ridge
- RidgeCV
- SGDRegressor
- TheilSenRegressor
- TweedieRegressor
- StatsModels
- Hồi quy tổng quát nhất (GLS)
- Hồi quy tổng quát nhất với Lỗi AR (GLSAR)
- Mô hình tuyến tính tổng quát (GLM)
- Hồi quy bình phương tối thiểu thông thường (OLS)
- Hồi quy Quá trình [Gaussian] Sử dụng Ước tính Dựa trên Xác suất Tối đa (ProcessMLE)
- Hồi quy Lượng tử (QuantReg)
- Hồi quy bình phương tối thiểu có trọng số (WLS)
- lightning
- AdaGradRegressor
- CDRegressor
- FistaRegressor
- SAGARegressor
- SAGRegressor
- SDCARegressor
- SGDRegressor
SVM|
- scikit-learn
- LinearSVC
- NuSVC
- OneClassSVM
- SVC
- lightning
- KernelSVC
- LinearSVC
|
- scikit-learn
- LinearSVR
- NuSVR
- SVR
- lightning
- LinearSVR
Cây|
- DecisionTreeClassifier
- ExtraTreeClassifier
|
- DecisionTreeRegressor
- ExtraTreeRegressor
Random Forest|
- ExtraTreesClassifier
- LGBMClassifier(chỉ sử dụng rf booster)
- RandomForestClassifier
- XGBRFClassifier
|
- ExtraTreesRegressor
- LGBMRegressor(chỉ sử dụng rf booster)
- RandomForestRegressor
- XGBRFRegressor
Boosting|
- LGBMClassifier(chỉ sử dụng gbdt/dart/goss booster)
- XGBClassifier(chỉ sử dụng gbtree(gồm cả rừng tăng cường)/gblinear booster)
|
- LGBMRegressor(chỉ sử dụng gbdt/dart/goss booster)
- XGBRegressor(chỉ sử dụng gbtree(gồm cả rừng tăng cường)/gblinear booster)
Bạn có thể tìm các phiên bản của các gói phần mềm có đảm bảo tương thích thông qua các bài kiểm tra CI here. Các phiên bản khác cũng có thể được hỗ trợ nhưng chúng chưa được kiểm tra.
Đầu ra Phân loại
Tuyến tính / SVM Tuyến tính / SVM Kernel
Nhị phân
Giá trị Scalar; khoảng cách có dấu từ mẫu đến siêu mặt phẳng cho lớp thứ hai.
Đa lớp
Giá trị Vector; khoảng cách có dấu từ mẫu đến siêu mặt phẳng cho mỗi lớp.
Bình luận
Đầu ra khớp với đầu ra của LinearClassifierMixin.decision_function
.
SVM
Phát hiện ngoại lệ
Giá trị Scalar; khoảng cách có dấu từ mẫu đến siêu mặt phẳng phân chia: dương cho một điểm nội và âm cho một điểm ngoại.
Nhị phân
Giá trị Scalar; khoảng cách có dấu từ mẫu đến siêu mặt phẳng cho lớp thứ hai.
Đa lớp
Giá trị Vector; điểm số một vs một cho mỗi lớp, hình dáng (n_samples, n_classes * (n_classes-1) / 2).
Bình luận
Đầu ra khớp với đầu ra của BaseSVC.decision_function
khi decision_function_shape
được đặt thành ovo
.
Cây / Rừng Ngẫu nhiên / Tăng cường
Nhị phân
Giá trị Vector; xác suất lớp.
Đa lớp
Giá trị Vector; xác suất lớp.
Bình luận
Đầu ra khớp với đầu ra của phương thức predict_proba
của DecisionTreeClassifier
/ ExtraTreeClassifier
/ ExtraTreesClassifier
/ RandomForestClassifier
/ XGBRFClassifier
/ XGBClassifier
/ LGBMClassifier
.
Sử dụng
Dưới đây là một ví dụ đơn giản về cách một mô hình tuyến tính được huấn luyện trong môi trường Python có thể được biểu diễn bằng mã Java:
from sklearn.datasets import load_diabetes
from sklearn import linear_model
import m2cgen as m2c
X, y = load_diabetes(return_X_y=True)
estimator = linear_model.LinearRegression()
estimator.fit(X, y)
code = m2c.export_to_java(estimator)
Mã Java được tạo ra:
public class Model {
public static double score(double[] input) {
return ((((((((((152.1334841628965) + ((input[0]) * (-10.012197817470472))) + ((input[1]) * (-239.81908936565458))) + ((input[2]) * (519.8397867901342))) + ((input[3]) * (324.39042768937657))) + ((input[4]) * (-792.1841616283054))) + ((input[5]) * (476.74583782366153))) + ((input[6]) * (101.04457032134408))) + ((input[7]) * (177.06417623225025))) + ((input[8]) * (751.2793210873945))) + ((input[9]) * (67.62538639104406));
}
}
Bạn có thể tìm thấy thêm ví dụ về mã được tạo ra cho các mô hình/ngôn ngữ khác nhau here .
CLI
m2cgen
có thể được sử dụng như một công cụ CLI để tạo mã sử dụng đối tượng mô hình đã được chuẩn hóa (giao thức pickle):
$ m2cgen <pickle_file> --language <language> [--indent <indent>] [--function_name <function_name>]
[--class_name <class_name>] [--module_name <module_name>] [--package_name <package_name>]
[--namespace <namespace>] [--recursion-limit <recursion_limit>]
Đừng quên rằng để unpickle các đối tượng mô hình đã chuẩn hóa, các lớp của chúng phải được định nghĩa ở cấp độ cao nhất của một mô-đun có thể được nhập trong môi trường unpickling.
Cũng hỗ trợ việc dẫn chảy:
$ cat <pickle_file> | m2cgen --language <language>
Câu hỏi thường gặp
Q: Quá trình tạo mã thất bại với lỗi**RecursionError: vượt quá chiều sâu đệ quy tối đa**
.
A: Nếu lỗi này xảy ra trong quá trình tạo mã bằng cách sử dụng một mô hình ensemble, hãy thử giảm số bộ ước tính đã được huấn luyện trong mô hình đó. Hoặc bạn có thể tăng chiều sâu đệ quy tối đa bằng cách sử dụng sys.setrecursionlimit(<new_depth>)
.
Q: Quá trình tạo mã thất bại với lỗi**ImportError: Không có mô-đun có tên <module_name_here>**
khi biên dịch mô hình từ một đối tượng mô hình đã chuẩn hóa.
A: Lỗi này cho thấy giao thức pickle không thể giải serial mô hình. Để unpickle các đối tượng mô hình đã chuẩn hóa, cần phải định nghĩa các lớp của chúng ở cấp độ cao nhất của một mô-đun có thể được nhập trong môi trường unpickling. Vì vậy, việc cài đặt gói cung cấp định nghĩa lớp mô hình có thể giải quyết vấn đề.
Q: Mã được tạo ra bởi m2cgen cho kết quả khác nhau cho một số đầu vào so với mô hình Python gốc từ đó mã được thu thập.
A: Một số mô hình yêu cầu dữ liệu đầu vào phải là một kiểu cụ thể trong giai đoạn dự đoán trong thư viện Python gốc của chúng. Hiện tại, m2cgen chỉ hoạt động với kiểu dữ liệu float64
(double
). Bạn có thể thử chuyển đổi dữ liệu đầu vào của bạn sang một kiểu khác thủ công và kiểm tra kết quả lại. Ngoài ra, một số sai khác nhỏ có thể xảy ra do cách thực hiện cụ thể của phép toán số thực trong ngôn ngữ đích.
Chi tiết Tải về:
Tác giả: BayesWitnesses
Mã nguồn: https://github.com/BayesWitnesses/m2cgen
Giấy phép: MIT license