机器学习任务模板
本篇覆盖两类「经典机器学习」任务模板:
- 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.1、xgboost==2.1.4、statsmodels==0.14.5、pandas==2.3.2、numpy==2.0.2、graphviz==0.21、matplotlib==3.9.4、joblib==1.5.2等,基础镜像python:3.9。
注意:
job-template/job/sklearn/Dockerfile:14的ENTRYPOINT写的是python3 launcher-skearn.py(拼写少了一个 l,且该文件不存在),实际可用脚本名为launcher-sklearn.py。任务模板里通过「启动命令」覆盖入口(如init-job-template.json:4828的python3 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_paramsJSON 字符串,传给具体模型的超参数,默认 {}以上参数名已逐一对照各
launcher-*.py的argparse核实一致(如launcher-lr.py:244-251、launcher-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:205、launcher-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 与脚本注释):
RandomForestClassifier、GradientBoostingClassifier、AdaBoostClassifier、ExtraTreesClassifier、BaggingClassifier、LogisticRegression、RidgeClassifier、SGDClassifier、PassiveAggressiveClassifier、SVC、LinearSVC、GaussianNB、BernoulliNB、MultinomialNB、KNeighborsClassifier、DecisionTreeClassifier、MLPClassifier、LinearDiscriminantAnalysis、QuadraticDiscriminantAnalysis。
训练示例:
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/RandomForestRegressor:n_estimators100–500、max_depth3–20、min_samples_leaf1–20、max_features"sqrt"/"log2"。LogisticRegression:C0.01–10、penalty"l2"、solver"lbfgs"/"liblinear"、max_iter100–2000。SVC/LinearSVC:C0.1–10、kernel"linear"/"rbf"、gamma"scale"/"auto"。KNeighborsClassifier:n_neighbors3–50、weights"uniform"/"distance"。DecisionTreeClassifier:max_depth3–20、min_samples_leaf1–20、criterion"gini"/"entropy"。AdaBoostClassifier:n_estimators50–500、learning_rate0.01–1、algorithm"SAMME"/"SAMME.R"。KMeans:n_clusters2–20、init"k-means++"、max_iter100–500、n_init10–50。MultinomialNB(bayesian):alpha0.1–10、fit_priortrue/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_estimators100–500、learning_rate0.01–0.2、max_depth3–10、subsample0.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.1、pandas==1.5.3、numpy==1.26.4、joblib==1.4.2)。启动命令:
python3 launcher.py。K8s 账号:需
kubeflow-pipeline(launcher 要在命名空间内创建 Ray 集群)。执行流程(核对
launcher.py:62-147):- 解析参数,校验「至少做训练或推理之一」、模型路径必填、训练时校验 label/feature 列;
pd.read_csv(..., sep=',', header=0)读取数据(逗号分隔、首行列名);ray_launcher(num_worker, init_file, 'create')创建 Ray 集群(1 Head + N Worker),设置RAY_ADDRESS;register_ray()+with joblib.parallel_backend('ray')内执行:训练则model.fit后joblib.dump,推理则joblib.load后model.predict,每行一个结果写入--predict_result_path;ray_launcher(..., 'delete')销毁集群。
其中 Ray 集群通过
from job.pkgs.k8s.py_ray import ray_launcher创建,--init_file默认/app/init.sh。
支持的模型(SUPPORT_MODELS)
核对 launcher.py:25-37,模型名不区分大小写与空格:
GaussianNB、MultinomialNB、BernoulliNB、CategoricalNB、ComplementNB、KNeighborsClassifier、LogisticRegression、RandomForestClassifier、DecisionTreeClassifier、GradientBoostingClassifier、SVC、SVR。
启动参数(与 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
训练 + 推理可在同一任务内先 fit 再 predict(同时传训练与推理参数)。
具体参数与默认值以各 launcher-*.py 源码为准,本篇仅供导航与检索。