机器学习任务模板

需要在 cube-studio pipeline 上用 sklearn / xgboost / lightgbm / statsmodels 跑表格类机器学习(分类/回归/聚类/时序)或用 Ray 分布式跑 sklearn 时

05-任务模板 / 机器学习
机器学习sklearnscikit-learnray-sklearnrayjoblib分布式训练adaboostarimaarbayesiannaive-bayes朴素贝叶斯decision-tree决策树gbdt

机器学习任务模板

本篇覆盖两类「经典机器学习」任务模板:

  • sklearn:单个镜像内含一组 launcher-*.py 脚本,覆盖 adaboost / ar / arima / bayesian / decision-tree / gbdt / kmeans / knn / lightgbm / lr / random-forest / rf-regression / xgb 及通用 launcher-sklearn,用于表格数据的分类、回归、聚类与时间序列。
  • ray-sklearn:基于 Ray + Joblib 的分布式 sklearn 训练/推理。

任务家族描述里所说的「sklearn 及其算法」即指 sklearn 目录下的多 launcher-*.py 算法子模板。


sklearn

源码目录:job-template/job/sklearn/。一个镜像内放了 13+ 个 launcher-*.py,每个算法是一个独立子模板,但共享同一套数据约定与参数风格。

共用约定

  • 镜像ccr.ccs.tencentyun.com/cube-studio/sklearn:20250801(见 job-template/job/sklearn/build.sh:5)。

    • 镜像内依赖(见 Dockerfile):scikit-learn==1.6.1xgboost==2.1.4statsmodels==0.14.5pandas==2.3.2numpy==2.0.2graphviz==0.21matplotlib==3.9.4joblib==1.5.2 等,基础镜像 python:3.9

    注意:job-template/job/sklearn/Dockerfile:14ENTRYPOINT 写的是 python3 launcher-skearn.py(拼写少了一个 l,且该文件不存在),实际可用脚本名为 launcher-sklearn.py。任务模板里通过「启动命令」覆盖入口(如 init-job-template.json:4828python3 launcher-sklearn.py),所以正常使用不受该 ENTRYPOINT 影响;但镜像默认入口是坏的(如需可顺手修正 Dockerfile)。

  • 启动命令:在任务模板里配置 python launcher-xxx.py,按算法选择对应脚本。

  • 三种运行模式(由传入哪个数据集参数决定,绝大多数脚本一致):

    • --train_dataset:执行训练,输出模型 .pkl 与训练/测试评估指标;
    • --val_dataset:执行评估,输出 val_result*.json
    • --inference_dataset:执行推理,输出 inference_result.csv
  • 通用参数(大多数脚本都有,少数算法做了裁剪,见下表「特有/裁剪」列):

    参数 含义
    --train_dataset 训练集 CSV 路径
    --val_dataset 评估集 CSV 路径
    --inference_dataset 推理集 CSV 路径
    --feature_columns 特征列名,逗号分隔
    --label_columns 标签列名,逗号分隔(分类/回归用)
    --save_model_dir 模型与评估结果保存目录或 .pkl 路径
    --load_model_path 从指定 .pkl 加载模型(部分脚本支持)
    --model_params JSON 字符串,传给具体模型的超参数,默认 {}

    以上参数名已逐一对照各 launcher-*.pyargparse 核实一致(如 launcher-lr.py:244-251launcher-adaboost.py:246-253)。

各算法子模板速查

子模板 脚本 底层模型 / 库 任务类型 特有 / 裁剪参数
sklearn(通用分类) launcher-sklearn.py 多种 sklearn 分类器,由 --model_name 选择 分类 --model_name--train_test_split_ratio(默认0.8);无 --load_model_path
adaboost launcher-adaboost.py AdaBoostClassifier 分类 模型文件 adaboost_model.pkl
bayesian launcher-bayesian.py MultinomialNB + CountVectorizer 文本分类 --feature_columns 仅填 1 个文本列;无 --load_model_path
kmeans launcher-kmeans.py KMeans 聚类 输出轮廓系数 + 散点图;--label_columns 可空;无 --load_model_path
lr launcher-lr.py LogisticRegression 分类 二分类输出 ROC/AUC
decision-tree launcher-decision-tree.py DecisionTreeClassifier 分类 额外导出 DOT + graphviz 渲染 iris_tree.png(见 launcher-decision-tree.py:192
knn launcher-knn.py KNeighborsClassifier 分类 适合小数据低维
random-forest launcher-random-forest.py RandomForestClassifier 分类 模型文件 randomForest_model.pkl
rf-regression launcher-rf-regression.py RandomForestRegressor 回归 指标为 MSE;无 --load_model_path
xgb launcher-xgb.py xgboost.XGBClassifier 分类 LabelEncoder + xgb_label_mapping.json 反解标签(见 launcher-xgb.py:201,207
gbdt launcher-gbdt.py GradientBoostingClassifier 分类 中小规模表格数据
lightgbm launcher-lightgbm.py lightgbm.LGBMClassifier 分类 高维稀疏/大数据
ar launcher-ar.py statsmodels AutoReg 时间序列 --feature_col/--time_col/--start/--end/--lag,仅训练,输出 predict.csv
arima launcher-arima.py statsmodels ARIMA 时间序列 同 ar,但用 --order(字符串元组如 "(2,1,2)")替代 --lag

说明:分类脚本统一逻辑——二分类用 roc_auc_score 并绘制 ROC 曲线;多分类输出 accuracy/precision/recall/f1。模型路径由统一逻辑解析,支持「目录」或「.pkl 文件路径」两种写法。

注意:评估结果文件名实际为 val_result<model_params 的 JSON>.json(把超参数 JSON 拼进文件名,见 launcher-adaboost.py:205launcher-xgb.py:230),并非固定的 val_result.json

时间序列(ar / arima)参数

ar / arima 与分类脚本参数不同,核对 launcher-ar.py:61-67 / launcher-arima.py:61-67

  • --train_dataset:时间序列 CSV;
  • --feature_col:单一数值列名(注意是 feature_col 单数,不是 feature_columns);
  • --time_col:时间列名,用于排序;
  • --start / --end:预测起止位置(整数索引);
  • --lag(ar):AR 滞后阶数,常用 1–30;
  • --order(arima):(p,d,q) 字符串,如 "(2,1,2)"
  • --save_model_dir:结果输出目录。

两者均按时间排序后 8:2 切分 train/test,输出 MSE 与 predict.csv

通用分类模板支持的模型(launcher-sklearn.py

通过 --model_name 选择,覆盖(核对自 README 与脚本注释): RandomForestClassifierGradientBoostingClassifierAdaBoostClassifierExtraTreesClassifierBaggingClassifierLogisticRegressionRidgeClassifierSGDClassifierPassiveAggressiveClassifierSVCLinearSVCGaussianNBBernoulliNBMultinomialNBKNeighborsClassifierDecisionTreeClassifierMLPClassifierLinearDiscriminantAnalysisQuadraticDiscriminantAnalysis

训练示例:

python launcher-sklearn.py \
  --train_dataset /mnt/admin/pipeline/example/ml/train.csv \
  --train_test_split_ratio 0.8 \
  --label_columns y \
  --feature_columns age,duration,campaign,pdays,previous,emp_var_rate,cons_price_idx,cons_conf_idx,euribor3m,nr_employed \
  --save_model_dir /mnt/admin/pipeline/example/ml/sklearn/ \
  --model_name RandomForestClassifier \
  --model_params '{"n_estimators":200,"max_depth":8,"min_samples_leaf":5}'

常用超参数建议(model_params)

  • RandomForestClassifier / RandomForestRegressorn_estimators 100–500、max_depth 3–20、min_samples_leaf 1–20、max_features "sqrt"/"log2"
  • LogisticRegressionC 0.01–10、penalty "l2"solver "lbfgs"/"liblinear"max_iter 100–2000。
  • SVC/LinearSVCC 0.1–10、kernel "linear"/"rbf"gamma "scale"/"auto"
  • KNeighborsClassifiern_neighbors 3–50、weights "uniform"/"distance"
  • DecisionTreeClassifiermax_depth 3–20、min_samples_leaf 1–20、criterion "gini"/"entropy"
  • AdaBoostClassifiern_estimators 50–500、learning_rate 0.01–1、algorithm "SAMME"/"SAMME.R"
  • KMeansn_clusters 2–20、init "k-means++"max_iter 100–500、n_init 10–50。
  • MultinomialNB(bayesian):alpha 0.1–10、fit_prior true/false。
  • XGBClassifier(xgb):典型二分类 {"n_estimators":200,"max_depth":6,"learning_rate":0.1,"subsample":0.8,"colsample_bytree":0.8,"reg_lambda":1.0,"objective":"binary:logistic","eval_metric":"auc"}
  • LGBMClassifier(lightgbm):典型 {"n_estimators":300,"learning_rate":0.05,"num_leaves":31,"max_depth":-1,"subsample":0.8,"colsample_bytree":0.8}
  • GradientBoostingClassifier(gbdt):n_estimators 100–500、learning_rate 0.01–0.2、max_depth 3–10、subsample 0.6–1.0。

ray-sklearn

源码目录:job-template/job/ray-sklearn/(入口 launcher.py,模型映射 common.py 由 launcher 内联)。基于 Ray 的分布式能力,通过 Ray + Joblib 后端跑 sklearn 的训练与推理,适用于在 Kubernetes 上按需拉起 Ray 集群执行 sklearn 任务。

镜像与运行机制

  • 镜像ccr.ccs.tencentyun.com/cube-studio/ray-sklearn:20250301(见 build.sh:5,基于 cube-studio/ray:nightly,含 scikit-learn==1.6.1pandas==1.5.3numpy==1.26.4joblib==1.4.2)。

  • 启动命令python3 launcher.py

  • K8s 账号:需 kubeflow-pipeline(launcher 要在命名空间内创建 Ray 集群)。

  • 执行流程(核对 launcher.py:62-147):

    1. 解析参数,校验「至少做训练或推理之一」、模型路径必填、训练时校验 label/feature 列;
    2. pd.read_csv(..., sep=',', header=0) 读取数据(逗号分隔、首行列名);
    3. ray_launcher(num_worker, init_file, 'create') 创建 Ray 集群(1 Head + N Worker),设置 RAY_ADDRESS
    4. register_ray() + with joblib.parallel_backend('ray') 内执行:训练则 model.fitjoblib.dump,推理则 joblib.loadmodel.predict,每行一个结果写入 --predict_result_path
    5. ray_launcher(..., 'delete') 销毁集群。

    其中 Ray 集群通过 from job.pkgs.k8s.py_ray import ray_launcher 创建,--init_file 默认 /app/init.sh

支持的模型(SUPPORT_MODELS

核对 launcher.py:25-37,模型名不区分大小写与空格:

GaussianNBMultinomialNBBernoulliNBCategoricalNBComplementNBKNeighborsClassifierLogisticRegressionRandomForestClassifierDecisionTreeClassifierGradientBoostingClassifierSVCSVR

启动参数(与 launcher.py:152-162 一致)

参数 必填 说明
--train_csv_file_path 训练时必填 训练集 CSV(逗号分隔,首行 header)
--feature_columns 特征列名,逗号分隔;不填则除 label 外全部作为特征
--label_columns 训练时必填 标签列名,逗号分隔
--model_name 见上「支持的模型」
--model_args_dict 模型超参数 JSON,如 {"max_depth":5,"min_samples_leaf":10}
--model_file_path 模型保存/加载路径(joblib 文件)
--predict_csv_file_path 推理时必填 预测用 CSV
--predict_result_path 推理时必填 预测结果保存路径(每行一个结果)
--num_worker Ray Worker 数量,1~10(launcher.py:62 校验)
--init_file 各节点启动前执行的脚本,默认 /app/init.sh

提示:--train_csv_file_path 的 argparse help 文案写的是「| 分割」,但代码实际用 sep=','(逗号分隔,见 launcher.py:79)。以逗号为准。

使用示例

仅训练:

python3 launcher.py \
  --train_csv_file_path /mnt/admin/pipeline/example/sklearn/ml-label.csv \
  --label_columns y \
  --feature_columns age,duration,campaign \
  --model_name RandomForestClassifier \
  --model_args_dict '{"max_depth":5,"min_samples_leaf":10}' \
  --model_file_path /mnt/admin/pipeline/example/sklearn/model.joblib \
  --num_worker 2 \
  --init_file /app/init.sh

仅推理(需已有模型):

python3 launcher.py \
  --predict_csv_file_path /mnt/admin/pipeline/example/sklearn/ml-nolabel.csv \
  --predict_result_path /mnt/admin/pipeline/example/sklearn/result.txt \
  --model_file_path /mnt/admin/pipeline/example/sklearn/model.joblib \
  --num_worker 2

训练 + 推理可在同一任务内先 fitpredict(同时传训练与推理参数)。


具体参数与默认值以各 launcher-*.py 源码为准,本篇仅供导航与检索。

最后更新 2026-06-30完整文档以官方仓库为准:GitHub Wiki