前言
HyperGBM是一款全Pipeline自动机器学习工具,可以端到端的完整覆盖从数据清洗、预处理、特征加工和筛选以及模型选择和超参数优化的全过程,是一个真正的结构化数据AutoML工具包。
一、HyperGBM安装&介绍
HyperGBM介绍:HyperGBM中的机器学习算法使用了目前最流行的几种GBM算法(更准确的说是梯度提升树模型),目前包括XGBoost、LightGBM、CatBoost和HistGridientBoosting。同时,HyperGBM也引入了Hypernets的CompeteExperiment在数据清洗、特征工程、模型融合等环节的很多高级特性。
安装:
conda install -c conda-forge hypergbm # 或者是 pip install hypergbm
二、开始使用HyperGBM(函数介绍、实战)
2-1、函数介绍
1、 make_experiment(): 快速创建一个可运行的实验对象。
- 参数介绍:
- train_data: 训练数据
- target: 指定目标列是多少,默认目标列为y
- max_trials:缺省情况下,make_experiment所创建的实验最多搜索10种参数便会停止搜索。实际使用中,建议将最大搜索次数设置为30以上。
- cv: 可通过参数cv指定是否启用交叉验证。当cv设置为False时表示禁用交叉验证并使用经典的train_test_split方式进行模型训练;当cv设置为True时表示开启交叉验证,折数可通过参数num_folds设置(默认:3)。
- eval_data: 指定评估集
- 在禁用交叉验证时,如果您未指定eval_data,实验对象将从train_data中拆分部分数据作为评估集,拆分大小可通过eval_size设置
- reward_metric:指定评价指标,使用make_experiment创建实验时,分类任务默认的模型评价指标是accuracy,回归任务默认的模型评价指标是rmse,可通过参数reward_metric指定。
- 设置早停:使用make_experiment时,可通过参数early_stopping_rounds、early_stopping_time_limit、early_stopping_reward设置实验的早停策略。
- searcher:指定搜索算法,HyperGBM通过Hypernets中的搜索算法进行参数搜索,包括:EvolutionSearcher(缺省)、MCTSSearcher、RandomSearch,在make_experiment时可通过参数searcher指定,可以指定搜索算法的类名(class)、搜索算法的名称(str)。
- ensemble_size: 指定参与融合的模型的数量。为了获取较好的模型效果,make_experiment创建实验时默认开启了模型融合的特性,并使用效果最好的20个模型进行融合,可通过参数ensemble_size指定参与融合的模型的数量。当ensemble_size设置为0时则表示禁用模型融合。
- log_level:指定日志的级别,如果希望在训练过程中看到使用进度信息的话,可通过log_level指定日志级别,可以是str或int。关于日志级别的详细定义可参考python的logging包。 另外,如果将verbose参数设置为1的话,可以得到更详细的信息。
2、 run(): 开始训练并得到模型。
2-2、实战
2-2-1、创建实验并进行训练
from hypergbm import make_experiment from hypernets.tabular.datasets import dsutils train_data = dsutils.load_blood() experiment = make_experiment(train_data, target='Class') estimator = experiment.run()
2-2-2、输出模型
import pickle with open('model.pkl','wb') as f: pickle.dump(estimator, f)
2-2-3、评价模型
from sklearn.metrics import classification_report y_pred=estimator.predict(X_test) print(classification_report(y_test, y_pred, digits=5))
三、高级应用(数据处理)
3-1、数据适配
- data_adaption:(default True),是否开启数据适配
- data_adaption_memory_limit:(default 0.05),将输入数据缩减到系统可用内存的多大比例
- data_adaption_min_cols:(default 0.3),如果需要缩减数据的话,至少保留多少列
- data_adaption_target:(default None),此选项仅当输入数据是pandas DataFrame时生效,将此选项设置为’cuml’或’cuda’则会利用主机的CPU和MEM对数据进行缩减,然后转换为cudf.DataFrame,使得后续实验步骤在GPU中运行
3-2、数据清洗
1、data_cleaner_args:数据清洗参数,类型:字典。写在make_experiment函数里。
内部属性:
- nan_chars: value or list, (default None), 将哪些值字符替换为np.nan
- correct_object_dtype: bool, (default True), 是否尝试修正数据类型
- drop_constant_columns: bool, (default True), 是否删除常量列
- drop_duplicated_columns: bool, (default False), 是否删除重复列
- drop_idness_columns: bool, (default True), 是否删除id列
- drop_label_nan_rows: bool, (default True), 是否删除目标列为np.nan的行
- replace_inf_values: (default np.nan), 将np.inf替换为什么值
- drop_columns: list, (default None), 强行删除哪些列
- reserve_columns: list, (default None), 数据清洗时保留哪些列不变
- reduce_mem_usage: bool, (default False), 是否尝试降低对内存的需求
- int_convert_to: bool, (default ‘float’), 将int列转换为何种类型,None表示不转换
3-3、特征衍生
1、feature_generation:特征衍生参数,写在make_experiment函数里。设置 feature_generation=True 即可,与之匹配的选项包括:
- feature_generation_continuous_cols:list (default None)), 参与特征衍生的初始连续型特征,如果为None则依据训练数据的特征类型自行推断。
- feature_generation_categories_cols:list (default None)), 参与特征衍生的初始类别型特征,需要明确指定,CompeteExeriment 不会自行推断参与特征衍生的初始类别型特征。
- feature_generation_datetime_cols:list (default None), 参与特征衍生的初始日期型特征,如果为None则依据训练数据的特征类型自行推断。
- feature_generation_latlong_cols:list (default None), 参与特征衍生的经纬度特征,如果为None则依据训练数据自行推断。说明:经纬度特征列的数据格式必须是 tuple(lat,long)。
- feature_generation_text_cols:list (default None), 参与特征衍生的初始文本性特征,如果为None则依据训练数据自行推断。
- feature_generation_trans_primitives:list (default None), 用于特征衍生的算子,如果为None则依据特征类型自行推断所采用的算子。
3-4、共线性检测
共线性检测的必要性:有时训练数据中会出现一些相关度很高的特征,这些并没有提供太多的信息量,相反,数据集拥有更多的特征意味着更容易收到噪声的影响,更容易收到特征偏移的影响等等。
collinearity_detection:共线性检测参数,写在make_experiment函数里。设置collinearity_detection=True即可。
3-5、漂移检测
漂移检测的必要性:数据漂移是建模过程中的一个主要挑战。当数据的分布随着时间在不断的发现变化时,模型的表现会越来越差,CompeteExeriment 中引入了对抗验证的方法专门处理数据漂移问题。这个方法会自动的检测是否发生漂移,并且找出发生漂移的特征并删除他们,以保证模型在真实数据上保持良好的状态。
drift_detection:特征筛选参数,写在make_experiment函数里。设置 drift_detection=True即可, 与之匹配的选项包括:
- drift_detection_remove_shift_variable : bool, (default=True),是否首先检查每一列数据的稳定性。
- drift_detection_variable_shift_threshold : float, (default=0.7),稳定性指标高于该阈值的列将被删除
- drift_detection_threshold : float, (default=0.7),检测指标高于该阈值的列将被删除。
- drift_detection_remove_size : float, (default=0.1),每一轮检测所删除的列占总列数的比例。
- drift_detection_min_features : int, (default=10),至少保留多少列。
- drift_detection_num_folds : int, (default=5),在漂移检测阶段训练模型时的cv折数。
3-6、特征筛选
特征筛选的必要性:垃圾特征会大大影响模型的准确性,所以我们需要进行特征筛选。
collinearity_detection:特征筛选参数,写在make_experiment函数里。设置 feature_selection=True即可, 与之匹配的选项包括:
- feature_selection_strategy:str, 筛选策略(default threshold), 可用的策略包括 threshold、number 、 quantile。
- feature_selection_threshold:float, (default 0.1), 当策略为 threshold 时的筛选阈值,重要性高于该阈值的特征会被选择。
- feature_selection_quantile:float, (default 0.2), 当策略为 quantile 时的筛选阈值,重要性分位高于该阈值的特征会被选择。
- feature_selection_number:int or float, (default 0.8), 当策略为 number 时,筛选的特征数量。
3-7、降采样预搜索
降采样必要性:当数据量较大时使用全部训练数据进行模型训练会消耗较长的时间,为此可通过降采样减少参与模型训练的数据量,进行预搜索,以便在相同的时间内尝试更多的模型参数;然后从预搜索结果中挑选表现较好的参数再利用全量数据进行训练和评估,进一步筛选最佳的模型参数。
down_sample_search:降采样预搜索参数,写在make_experiment函数里。设置 down_sample_search=True即可, 与之匹配的选项包括:
- down_sample_search_size:int, float(0.0~1.0) or dict (default 0.1), 参与预搜索的样本数量。对于分类任务,可通过dict指定每个类别数据的采样数量。
- down_sample_search_time_limit:int, (default early_stopping_time_limit*0.33), 预搜索的时间限制。
- down_sample_search_max_trials:int, (default max_trials*3), 预搜索的最大尝试次数。
3-8、二阶段特征筛选
二阶段特征筛选: 模型参数优化搜索之后,利用得到的模型对训练数据进行处理,然后再次进行模型参数优化搜索,即 二阶段搜索。
feature_reselection:降采样预搜索参数,写在make_experiment函数里。设置 feature_reselection=True即可, 与之匹配的选项包括:
- feature_reselection_estimator_size:int, (default=10), 用于评估特征重要性的模型数量(在一阶段搜索中表现最好的n个模型)。
- feature_reselection_strategy:str, 筛选策略(default threshold), 可用的策略包括 threshold、number 、 quantile。
- feature_reselection_threshold:float, (default 1e-5), 当策略为 threshold 时的筛选阈值,重要性高于该阈值的特征会被选择。
- feature_reselection_quantile:float, (default 0.2), 当策略为 quantile 时的筛选阈值,重要性分位高于该阈值的特征会被选择。
- feature_reselection_number:int or float, (default 0.8), 当策略为 number 时,筛选的特征数量。
3-9、伪标签
伪标签: 伪标签是一种半监督学习技术,将测试集中未观测标签列的特征数据通过一阶段训练的模型预测标签后,将置信度高于一定阈值的样本添加到训练数据中重新训练模型,有时候可以进一步提升模型在新数据上的拟合效果。
注意:仅对分类任务有效。
pseudo_labeling:降采样预搜索参数,写在make_experiment函数里。设置 pseudo_labeling=True即可, 与之匹配的选项包括:
- pseudo_labeling_strategy:str, 筛选策略(default threshold), 可用的策略包括 threshold、number 、 quantile。
- pseudo_labeling_proba_threshold:float(default 0.8), 当策略为 threshold 时的筛选阈值,置信度高于该阈值的样本会被选择。
- pseudo_labeling_proba_quantile:float(default 0.8), 当策略为 quantile 时的筛选阈值,置信度分位高于该阈值的样本会被选择。
- pseudo_labeling_sample_number:float(0.0~1.0) or int (default 0.2), 当策略为 number 时,对样本按置信度高低排序后选择的样本数(top n)。
- pseudo_labeling_resplit:bool(default=False), 添加新的伪标签数据后是否重新分割训练集和评估集. 如果为False, 直接把所有伪标签数据添加到训练集中重新训练模型,否则把训练集、评估集及伪标签数据合并后重新分割。
3-10、处理不平衡数据
处理不平衡数据:数据不平衡往往会导致建模效果不理想。
3-10-1、利用ClassWeight建模
class_balancing:写在make_experiment函数里。设置 class_balancing=‘ClassWeight’即可。
3-10-2、欠采样或过采样
欠采样或过采样:在建模之前,通过欠采样或过采样技术调整样本数据,然后再利用调整后的数据进行建模,以得到表现较好的模型。目前支持的采样策略包括:RandomOverSampler 、SMOTE 、ADASYN 、RandomUnderSampler 、NearMiss 、TomekLinks 、EditedNearestNeighbours。
class_balancing:写在make_experiment函数里。设置 class_balancing=‘相应的采样策略’即可。
未完待续
参考文章:
总结
斗破更新的好慢啊,但是,谁不喜欢看爽文呢? 所以再等等吧。