作者简介 来源:Nomi
工具库 nyaggle
在机器学习和模式识别中,特征工程的好坏将会影响整个模型的预测性能。其中特征是在观测现象中的一种独立、可测量的属性。选择信息量大、有差别性、独立的特征是模式识别、分类和回归问题的关键一步,可以帮助开发者最大限度地从原始数据中提取特征以供算法和模型使用。
数据科学思维导图 来源:网络
而 nyaggle 就是一个特定于 Kaggle 和离线比赛的实用工具库,它主要作用于四个部分,即:特征工程、模型验证、模型实验以及模型融合,尤其在特征工程和模型验证方面有较强的性能。
其中,在特征工程方面,nyaggle 包含了 K 个特征目标编码和 BERT 句子向量化。目标编码使用的是目标变量的均值编码类别变量,为训练集中的每个分组计算目标变量的统计量,之后会合并验证集、测试集以捕捉分组和目标之间的关系。BERT 句子向量化则是对 Bert 模型的输入做一个向量化,提取词句的三维信息。
BERT 词句向量化示例 来源:网络
nyaggle GitHub 地址: https://github.com/nyanp/nyaggle
nyaggle 实验指南
API 详情说明:nyaggle.experiment 类,实现模型实验的各个功能
- 最简 Kaggle 实验记录器,该模块为记录 Kaggle 实验提供了最简化的函数变量记录。开发者可以通过 log_numpy 和 log_dataframe 在目录下添加 numpy 数组和 pandas 数据框:
classnyaggle.experiment.Experiment(logging_directory, overwrite=False, custom_logger=None, with_mlflow=False, mlflow_run_id=None, logging_mode='w')
- 将排行榜得分记录到现有实验目录中:
nyaggle.experiment.add_leaderboard_score(logging_directory, score)
- 计算模型融合数据:
nyaggle.experiment.average_results(source_files, output_filename, weight=None, input_format='csv', sample_submission_filename=None)
- 使用 optuna 在超参数中搜索 lightgbm 参数:
nyaggle.experiment.find_best_lgbm_parameter(base_param, X, y, cv=None, groups=None, time_budget=None, type_of_target='auto')
- 通过交叉验证评估指标并将结果(日志,预测,测试预测,特征重要性图和提交文件)存储在指定目录下。过程中将使用估计器 LGBM 分类器、LGBM 回归器、CatBoost 分类器、CatBoost 回归器其中之一,具体估计器由 type_of_target(y)和 gbdt_type 根据实际情况自动调用:
nyaggle.experiment.run_experiment(model_params,X_train,y,X_test = None,logging_directory ='output / {time}',overwrite = False,eval_func = None,algorithm_type ='lgbm',fit_params = None,cv = None,groups = None,categorical_feature = None,sample_submission = None,submission_filename = None,type_of_target ='auto',feature_list = None,feature_directory = None,with_auto_hpo = False,with_auto_prep = False,with_mlflow = False)
实验详细代码
在典型的表格数据竞赛中,开发者可能会通过交叉验证重复进行评估,并记录参数和结果以跟踪实验。
其中,run_experiment()正是用于此类交叉验证实验的高级 API,它在指定目录下输出参数、指标、异常预测、测试预测、功能重要性和 Submitting.csv。
它可以与 mlflow 跟踪结合使用,如果使用 LightGBM 作为模型,则代码将非常简单如下所示:
代码语言:javascript复制import pandas as pdfrom nyaggle.experiment import run_experimentfrom nyaggle.experiment import make_classification_df
INPUT_DIR = '../input'target_column = 'target'
X_train = pd.read_csv(f'{INPUT_DIR}/train.csv')X_test = pd.read_csv(f'{INPUT_DIR}/test.csv')sample_df = pd.read_csv(f'{INPUT_DIR}/sample_submission.csv') # OPTIONAL
y = X_train[target_column]X_train = X_train.drop(target_column, axis=1)
lightgbm_params = {
'max_depth': 8}
result = run_experiment(lightgbm_params,
X_train,
y,
X_test,
sample_submission=sample_df)
值得注意的是,默认的验证策略是包含了 5 个特征的计算机视觉,开发者可以通过传递 cv 参数来更改此行为(可参阅 API 参考,https://nyaggle.readthedocs.io/en/latest/source/nyaggle.html#)。
之后,run_experiment API 执行交叉验证后,会将工件存储到日志目录。输出文件存储如下:
代码语言:javascript复制output
└── 20200130123456 # yyyymmssHHMMSS
├── params.txt # Parameters
├── metrics.txt # Metrics (single fold & overall CV score)
├── oof_prediction.npy # Out of fold prediction
├── test_prediction.npy # Test prediction
├── 20200130123456.csv # Submission csv file
├── importances.png # Feature importance plot
├── log.txt # Log file
└── models # The trained models for each fold
├── fold1
├── fold2
├── fold3
├── fold4
└── fold5
而如果要使用 XGBoost、CatBoost 或其他 sklearn 估计器,则需要在代码开头指定算法类型,其中的参数将传递给 sklearn API 的构造函数(例如 LGBMClassifier)。
代码语言:javascript复制# CatBoostcatboost_params = {
'eval_metric': 'Logloss',
'loss_function': 'Logloss',
'depth': 8,
'task_type': 'GPU'}result = run_experiment(catboost_params,
X_train,
y,
X_test,
algorithm_type='cat')
# XGBoostxgboost_params = {
'objective': 'reg:linear',
'max_depth': 8}result = run_experiment(xgboost_params,
X_train,
y,
X_test,
algorithm_type='xgb')
# sklearn estimatorfrom sklearn.linear_model import Ridgerigde_params = {
'alpha': 1.0}result = run_experiment(rigde_params,
X_train,
y,
X_test,
algorithm_type=Ridge)
如果想让 GUI 仪表板管理实验,开发者则可以通过只设置 with_mlfow = True 来将 run_experiment 与 mlflow 一起使用(需要预先安装 mlflow)。然后在与执行脚本相同的目录中,运行即可。
代码语言:javascript复制result = run_experiment(params,
X_train,
y,
X_test,
with_mlflow=True)
然后在与执行脚本相同的目录中,运行即可,相关结果(带有 CV 得分和参数的实验列表)可在 http://localhost:5000 页面上查看。
mlflow 结果页面示例
注意:如果要自定义日志记录的行为,可以在 mlflow run 上下文中调用 run_experiment;如果正在运行,则 run_experiment 将使用当前正在运行的运行,而不是创建新的运行。
代码语言:javascript复制mlflow.set_tracking_uri('gs://ok-i-want-to-use-gcs')
with mlflow.start_run(run_name='your-favorite-run-name'):
mlflow.log_param('something-you-want-to-log', 42)
result = run_experiment(params,
X_train,
y,
X_test,
with_mlflow=True)
其它 API 说明
nyaggle.feature 类——以特征格式管理运行系列功能
- nyaggle.feature.category_encoder 其中,Kfold 包装器用于类似 sklearn 的界面;此类包装器的 TransformerMixIn 具有 fit / transform / fit_transform 方法的对象,并以 K 个特征方式进行调用。而对于不同分类特征的目标编码运行方式如下: 对于分类目标 将特征替换为给定特定分类值的目标后验概率与所有训练数据上目标的先验概率的混合。 对于连续目标 用给定特定分类值的目标期望值和所有训练数据上目标的期望值的混合替换特征。
Class
nyaggle.feature.category_encoder.KFoldEncoderWrapper(base_transformer,cv = None,return_same_type = True,groups = None)
- nyaggle.feature.nlp 其中 Sentence Vectorizer 使用的是 BERT 预训练模型,并使用 BERT 从可变长度的英语/日语句子中提取固定长度特征向量。
Class
nyaggle.feature.nlp.BertSentenceVectorizer(lang ='en',n_components = None,text_columns = None,pooling_strategy ='reduce_mean',use_cuda = False,tokenizer = None,model = None,return_same_type = True,column_format ='{col } _ {idx}')
nyaggle.feature_store 类——sklearn 兼容特征生成器
- 包装器包装了一个函数,该函数将返回带有记忆调用的 pd.DataFrame 并使用 feature_store.save_feature 保存数据帧:
nyaggle.feature_store.cached_feature(feature_name,directory ='。/ features /',ignore_columns = None)
- 加载特征作为 pandas 数据框架:
nyaggle.feature_store.load_feature(feature_name,directory ='。/ features /',ignore_columns = None)
- 加载特征并返回连接的数据框架:
nyaggle.feature_store.load_features(base_df,feature_names,directory ='。/ features /',ignore_columns = None,create_directory = True,rename_duplicate = True)
- 将 pandas 数据框架另存为特征格式:
nyaggle.feature_store.save_feature(df,feature_name,directory ='。/ features /',with_csv_dump = False,create_directory = True,reference_target_variable = None,overwrite = True)
nyaggle.validation 类——对抗性验证,其中的验证拆分器与 sklearn 兼容
- 滑动窗口时间序列交叉验证器,也是时间序列交叉验证器。该验证器基于滑动窗口提供测试索引,以分割可变间隔时间序列数据。此类与 sklearn 的 BaseCrossValidator(KFold,GroupKFold 等的基类)兼容:
classnyaggle.validation.SlidingWindowSplit(source, train_from, train_to, test_from, test_to, n_windows, stride)
- 返回基础验证器的前 N 个特征,该验证器打包基本验证器以迭代返回前 n 个特征:
classnyaggle.validation.Take(n, base_validator)
- 时间序列交叉验证器,提供训练/测试索引以拆分可变间隔时间序列数据。此类提供了用于时间序列验证策略的低级 API。此类与 sklearn 的 BaseCrossValidator(KFold,GroupKFold 等的基类)兼容:
classnyaggle.validation.TimeSeriesSplit(source, times=None)
- 在 X_train 和 X_test 之间执行对抗验证:
nyaggle.validation.adversarial_validate(X_train, X_test, importance_type='gain', estimator=None, cat_cols=None, cv=None)
- 通过交叉验证评估指标;同时,它还记录了异常预测和测试预测:
nyaggle.validation.cross_validate(estimator, X_train, y, X_test=None, cv=None, groups=None, predict_proba=False, eval_func=None, logger=None, on_each_fold=None, fit_params=None, importance_type='gain', early_stopping=True, type_of_target='auto')
nyaggle.util 类
- 绘制特征重要性并写入图像:
nyaggle.util.plot_importance(importance, path=None, top_n=100, figsize=None, title=None)
nyaggle.hyper_parameters 类——从以往的解决方案中选取 Hypara 相关参数
- 通过参数名称获取超参数:
nyaggle.hyper_parameters.get_hyperparam_byname(name,gbdt_type ='lgbm',with_metadata = False)
- 列出所有的超参数:
nyaggle.hyper_parameters.list_hyperparams(gbdt_type ='lgbm',with_metadata = False)