/quarkml

风控算法,特征工程,模型工程,分布式,树模型

Primary LanguagePython

quarkml

介绍

适用于风控算法领域,集 特征处理,特征工程,模型训练, 树模型分布式训练等功能于一体的自动化工具 主要功能: 1. 特征工程 a. 特征处理,分类特征转换数值index,空值填充,异常值去除, 数据压缩,特征分析报告打印 b. 特征衍生,基于内置的算子进行自动衍生,并基于booster方法进行筛选海量衍生特征 c. 特征选择,对自特征进行筛选【fwiz,iv,psi,tmodel】 2. 模型工程 a. 模型交叉验证,用于验证模型性能 b. 模型超参 c. 模型训练,提供树模型多进程训练,分布式训练,常规训练 d. 模型解释性,自动化产生shap 模型解释图

特征工程 FeatureEngineering 功能介绍

1 数据预处理

1.1 功能
  1. 划分数据集中的类别特征和数值特征 其中会根据数据中数值特征的唯一值总量进行判断,若总量小于ordinal_number(可配置参数),会划入类别特征

  2. 缺失值填充 对类别特征的填充采用数据中的众数,对数值特征的填充采用数据中的均值 会保留每个特征的填充逻辑,方便后续新数据复用

  3. 异常值删除 检测异常的方法一:均方差 在统计学中,如果一个数据分布近似正态, 那么大约 68% 的数据值会在均值的一个标准差范围内, 大约 95% 会在两个标准差范围内, 大约 99.7% 会在三个标准差范围内。 这里采用3个标准差以外的进行去除

  4. 对离散特征进行数值化,tokenizer 对每列特征进行转换index, [男, 女] -> [0, 1] 并保留{男: 0, 女: 1} 会保留每个特征的tokenizer逻辑,方便后续新数据复用

  5. 展示数据中的每个 feature-label 分布 会展示数据的基础信息和基本描述 会有每个特征与目标的分布,保存图到本地 会给出整数据的详细分析报告,保存为html形式,可直接打开查看

  6. 对数据进行压缩 对数据中的数值化数据进行分析,判断数据的中最大最小范围,然后对数据采用合理的数据类型【int64-int32-int16-float64-float32-float16】等

1.2 API
  1. data_processing_fit()

1.1 描述

data_processing_fit(
  ds: str | pd.DataFrame,
  label: str,
  cat_feature: List = [],
  num_feature: List = [],
  ordinal_number=100,
  is_fillna=False,
  drop_outliers=False,
  is_token=True,
  verbosity=False,
  compress=False,
  report_dir="./encode",
)
ds: str | pd.DataFrame, 原始数据必选项), 若传入文件路径则返回处理后的新文件路径处理后的数据文件), 若传入DataFrame则返回新的DataFrame
label: str,  原始数据的label必选项cat_feature: list = [], 指定类别特征, (非选项), 若为空则会利用上述功能1获得
num_feature: list = [], 指定连续特征, (非选项), 若为空则会利用上述功能1获得
ordinal_number=100, 指定数值特征若唯一值总数小于ordinal_number则会划分成类别特征用于功能1】, (非选项), 若为空默认 100
is_fillna=False, 是否自动缺失值填充功能2】,连续值填充众数离散值填充均值
drop_outliers=False, 是否异常值删除功能3is_token=True, 是否数值化功能4verbosity=False, 是否展示分析报告功能5compress=False, 是否对数据进行压缩功能6report_dir="./encode", 上述功能产生的中间结果都会落到该文件夹内

1.2 使用样例(所有示例均可在experiment中运行测试)

from quarkml.feature_engineering import FeatureEngineering
FE = FeatureEngineering()
# 直接文件路径模式
ds, cat, con = FE.data_processing_fit("credit.csv", 'class')

# dataframe 模式
ds = pd.read_csv("credit.csv")
ds, cat, con = FE.data_processing_fit(ds, 'class')

2 数据预处理-新数据转换

与上述的数据预处理配套使用

2.1 功能
  1. 利用上述数据预处理的中间结果对新的数据进行转换,能够实现与上述数据预处理逻辑一致(有利于预估使用)
2.2 API
  1. data_processing_transform()

1.1 描述

data_processing_transform(
  ds: pd.DataFrame,
  label: str,
  verbosity=False,
  compress=False,
  report_dir="./encode",
)
ds: str | pd.DataFrame, 原始数据必选项), 若传入文件路径则返回处理后的新文件路径处理后的数据文件), 若传入DataFrame则返回新的DataFrame
label: str,  原始数据的label必选项verbosity=False, 是否展示分析报告功能5compress=False, 是否对数据进行压缩功能6report_dir="./encode", 利用数据预处理的中间结果进行一致性转换数据

1.2 使用样例(所有示例均可在experiment中运行测试)

from quarkml.feature_engineering import FeatureEngineering
FE = FeatureEngineering()

# 直接文件路径模式
ds, cat, con = FE.data_processing_transform("credit.csv", 'class')

# dataframe 模式
ds = pd.read_csv("credit.csv")
ds, cat, con = FE.data_processing_transform(ds, 'class')

3 特征衍生

3.1 功能
  1. 对给予数据进行特征衍生,产生大量的候选特征集
  2. 对衍生后的候选特征集进行筛选,获得最终对效果指标有意义的特征集
3.2 API
  1. feature_generation()

1.1 描述

feature_generation(
   ds: str | pd.DataFrame,
   label: str,
   cat_features: List = None,
   is_filter=True,
   params=None,
   select_method='predictive',
   min_candidate_features=200,
   blocks=5,
   ratio=0.5,
   distributed_and_multiprocess=-1,
   report_dir="encode",
)

ds: str | pd.DataFrame, 原始数据必选项), 若传入文件路径则返回处理后的新文件路径处理后的数据文件), 若传入DataFrame则返回新的DataFrame
label: str,  原始数据的label必选项cat_features: list = None, 指定类别特征, (非选项), 若为空则会利用原始数据的非number类型 设置 为cat
is_filter: 是否对衍生后的特征进行筛选由于衍生的特征数巨大所以默认为True
params: 特征筛选过程中树模型的参数非选项), 若为空有默认参数
select_method: 筛选的评估指标predictive -> 提升收益corr 为与目标的相关度
min_candidate_features: 最小候选特征若每个block后候选特征小于最小候选特征就停止block了
blocks主要是用于booster 中对数据进行增量式划分成多个数据块
ratio主要是用于booster 中candidate_features被淘汰ratio=0.5 一半了就可以直接全量数据进行淘汰了数据量越大该值应该设置越小一般在0.2 ~ 0.5
distributed_and_multiprocess=-1三种运行模式常规 -1多进程 2分布式 1report_dir="./encode", 中间结果存储

1.2 使用样例(所有示例均可在experiment中运行测试)

# 直接文件路径模式
ds = FE.feature_generation("credit.csv", 'class', is_filter=True)
# dataframe 模式
ds = FE.feature_generation(ds, 'class', cat, is_filter=True)

4 特征选择

4.1 功能
  1. 对提供的数据集进行计算特征的IV值,并基于IV的过滤条件去掉某些特征
  2. 对提供的数据集进行计算特征的PSI值,并基于PSI的过滤条件去掉某些特征
  3. 对提供的数据集进行计算特征的fwiz值(最大最小相关性),并基于fwiz的过滤条件去掉某些特征
  4. 对提供的数据集进行计算特征的重要性(tmodel),并基于特征的重要性去掉某些特征

具备4中特征选择方法【fwiz,iv,psi,tmodel】,其中除fwiz 方法外,其他方法均具备三种运行模式【常规,多进程,分布式】 小数据量下运行耗时H比较 H(多进程) < H(常规) < H(分布式) 大数据量下单机无法运行时 - 推荐用分布式

fwiz 基于SULOV(搜索不相关的变量列表),SULOV 注定只能针对连续值, SULOV算法基于本文中解释的最小冗余最大相关性(MRMR)算法,该算法是最佳特征选择方法之一

iv 风控领域常使用的IV值

psi 风控领域常使用的PSI值

tmodel 基于树模型训练后的特征重要性进行选择,其中有4种特征重要性【importance, permutation, shap, all】 - importance 为树的划分节点gain值总和 - permutation 评估特征的随机和非随机的预估值差值比较(模型无关性) - shap 类似permutation, 只是更加严格,【具体可学习Shap 值】 - all 是综合上述三种方法选出的特征交集

4.2 API
  1. feature_selector()

1.1 描述

feature_selector(
ds: str | pd.DataFrame,
label: str,
part_column: str = None,
cate_features: List[str] = None,
part_values: List = None,
bins=10,
importance_metric: str = "importance",
method: str = "fwiz",
distributed_and_multiprocess=-1,
report_dir="encode",
)

ds: str | pd.DataFrame, 原始数据必选项), 若传入文件路径则返回处理后的新文件路径处理后的数据文件), 若传入DataFrame则返回新的DataFrame
label: str,  原始数据的label必选项cat_features: list = None, 指定类别特征, (非选项), 若为空则会利用原始数据的非number类型 设置 为cat
part_column: str = None,  划分列主要是用于PSI筛选特征的方法内表明用这个一列进行划分数据集然后比较每个数据两两之间的差异当method为psi 时是必选项
part_values: str = None,  划分列与part_column 一起用表明用这个一列按part_values list 内的值进行划分然后比较每个数据两两之间的差异非选项), 若为空将去part_column列中的所有值
bins=10,: IV计算中的分桶数
importance_metric: str = 'importance',  tmodel_method方法得到的重要性分为3种方式的importancepermutationshap
method: str = "booster", 特征筛选的方法fwizivpsitmodel注fwiz-基于SULOV搜索不相关的变量列表distributed_and_multiprocess=-1三种运行模式常规 -1多进程 2分布式 1report_dir="encode", 特征筛选过程中的一些中间结果存在路径

1.2 使用样例(所有示例均可在experiment中运行测试)

ds = FE.feature_selector(ds, 'class', method='fwiz')
ds = FE.feature_selector(ds, 'class', cate_features=cat,  method='iv')
ds = FE.feature_selector(ds, 'class', part_column='age', cate_features=cat,  method='psi')
ds = FE.feature_selector(ds, 'class', cate_features=cat,  method='tmodel')

模型工程 ModelEngineering

(树模型-lightgbm) a. 模型超参 b. 模型交叉验证,用于验证模型性能 c. 模型训练,提供树模型多进程训练,分布式训练,常规训练 d. 模型解释性,自动化产生shap 模型解释图

1 模型超参 hparams

1.1 功能

基于提供的数据进行模型lightgbm,参数寻优,基于贝叶斯超参方式找到最优参数

1.2 API
  1. hparams()

1.1 描述

hparams(
   ds: pd.DataFrame,
   label: str,
   valid_ds: pd.DataFrame = None,
   cat_features=None,
   params=None,
   spaces=None,
   report_dir="encode")

ds: str | pd.DataFrame, 原始数据必选项), 若传入文件路径则返回处理DataFrame
label: str,  原始数据的label必选项valid_ds: str | pd.DataFrame, 原始验证数据必选项), 若传入文件路径则返回处理DataFrame
cat_features: list = None, 指定类别特征, (非选项), 若为空则会利用原始数据的非number类型 设置 为cat
params=None, lgb模型的参数非必选项若没有会采用系统默认的
spaces=None, 寻参的设置空间熟悉hyperopt应该知道怎么配置
report_dir="encode"

使用样例

best_params_hyperopt = ME.hparams(ds, 'class', cat_features=cat)

2 模型交叉验证 model_cv

2.1 功能

基于提供的数据进行lightgbm的交叉验证,能够进行分布式训练加快验证流程

2.2 API
model_cv(
   ds: pd.DataFrame,
   label: str,
   valid_ds: pd.DataFrame = None,
   categorical_features=None,
   params=None,
   folds=5,
   distributed_and_multiprocess=-1,
)

ds: str | pd.DataFrame, 原始数据必选项), 若传入文件路径则返回处理DataFrame
label: str,  原始数据的label必选项valid_ds: str | pd.DataFrame, 原始验证数据必选项), 若传入文件路径则返回处理DataFrame
cat_features: list = None, 指定类别特征, (非选项), 若为空则会利用原始数据的非number类型 设置 为cat
params=None, lgb模型的参数非必选项若没有会采用系统默认的
folds=5,交叉验证的数据划分份数用于tmodel
distributed_and_multiprocess=-1三种运行模式常规 -1多进程 2分布式 1

使用样例

ME.model_cv(ds, 'class')

3 模型训练 model

3.1 功能

基于提供的数据进行lightgbm的训练

3.2 API
model(
   ds: pd.DataFrame,
   label: str,
   valid_ds: pd.DataFrame = None,
   cat_features=None,
   params=None,
   report_dir="encode",
)

ds: str | pd.DataFrame, 原始数据必选项), 若传入文件路径则返回处理DataFrame
label: str,  原始数据的label必选项valid_ds: str | pd.DataFrame, 原始验证数据必选项), 若传入文件路径则返回处理DataFrame
cat_features: list = None, 指定类别特征, (非选项), 若为空则会利用原始数据的非number类型 设置 为cat
params=None, lgb模型的参数非必选项若没有会采用系统默认的
report_dir="encode" lgb模型训练保存的路径report_dir下的 loan_model.pkl

使用样例

ME.model(ds, 'class')

4 模型解释性 model_interpretable

4.1 功能
  1. 基于训练好的模型,对模型为何对这个样本打出这样的分,进行单实例分析
  2. 基于训练好的模型,对模型为何对一个群体样本打出这样的分,进行多实例分析整体分析
  3. 给出该模型对这些样本预估出来的结果分析,给出特征重要性
4.2 API
  1. interpretable()
interpretable(
   task,
   model,
   X: pd.DataFrame,
   single_index: int = -1,
   muli_num: int = -1,
   is_importance=False,
)

task: 回归或者分类 : 回归 -> regression   分类 -> class
model: 上述训练的模型,需要解释的模型
single_index: 单实例分析,-1 为不进行分析, single_index 为 X 数据的样本下标
muli_num: 多实例分析,-1 为不进行分析,muli_num 为 X 数据的前muli_num个样本
is_importance: 是否给出特征重要性

使用样例

ME.interpretable('regression', tm, X, single_index=1)

【新增】分布式树模型训练,需对数据和模型进行改造

特征工程中的FeatureEngineering新增方法 dist_data_processing 分布式特征处理,并将数据转换成分布式数据样式,懒加载模式

分布式特征处理 dist_data_processing

具备两种数据处理方式,第一种基于data_processing处理后的dataframe 数据进行直接转换 第二种基于ray.data 读取文本文件,直接分布式对象

files = None, 文件的路径,可以是多个文件list 也可是单个文件str, 注:必须是csv格式的数据
label_name: str = None,  数据的label列名
delimiter: str = ',',    数据切分符
cat_feature: list = [], 指定类别特征, (非选项), 若为空,则会利用原始数据的非number类型 设置 为cat
num_feature: list = [], 指定连续特征, (非选项), 若为空,则会利用原始数据的number类型 设置 为num
ordinal_number=100, 指定数值特征若唯一值总数小于ordinal_number,则会划分成类别特征, (非选项), 若为空,默认 100
report_dir="./encode", 保留类别特征,连续特征 到路径下data_processing.pkl
ds: pd.DataFrame = None, 若设置该值也就是数据是来自data_processing处理后的dataframe, 则上述所有设置不起效, 采用第一种方式产生数据

使用样例

# 第一种方法,直接转换后dataframe 再转换成ray.data
ds = pd.read_csv("../experiment/credit/credit.csv")
ds, cat, con = FE.data_processing(ds, 'class', is_fillna=True, verbosity=False)
ds = FE.dist_data_processing(ds=ds)

# 第一种方法,直接转换成ray.data
ds, categorical_features, numerical_features = FE.dist_data_processing("experiment/credit/credit.csv", 'class')

分布式训练 dist_model

模型工程中的ModelEngineering新增方法 dist_model 分布式训练

trn_ds, 训练数据 ray.data
label_name, 数据的label名
val_ds=None, 验证数据 ray.data
categorical_features = None, 类别特征列表
params=None, 模型参数,不设置会有模型的
seed=2023, 
num_workers=2, ray 工作空间,会对数据进行切分,数据分发
trainer_resources={"CPU": 4},  训练资源,会设置所有机器中使用多少个核用于纯训练计算
resources_per_worker={"CPU": 2}, 数据读取资源,会设置所有的工作空间使用多少核用于数据读取
use_gpu=False, 是否使用gpu, lgb 需要 param中设置使用gpu
report_dir = './encode/dist_model', 模型保存位置

使用样例

ds, categorical_features, numerical_features = FE.dist_data_processing("experiment/credit/credit.csv", 'class')

ME.dist_model(ds, 'class', categorical_features=categorical_features)

环境

1 安装 
  pip3 install ray[default]
  切记不可 pip3 install ray,因为这样安装不完整,会没有Dashboard
2.启动
  【启动 head 节点】ray start --head --port=1063 --include-dashboard=true --dashboard-host=0.0.0.0 --dashboard-port=8265
  【启动其他节点】 ray start --address='head节点的ip:1063'

这里只演示启动head 节点,并在head节点运行,因此 ray.init() 并没有设置

完整流程案例- 参考experiment中的credit的run.py脚本