前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面向 Kaggle 和离线比赛实用工具库 nyaggle,解决特征工程与验证两大难题(附代码)

面向 Kaggle 和离线比赛实用工具库 nyaggle,解决特征工程与验证两大难题(附代码)

作者头像
AI研习社
发布2020-02-21 11:25:43
7850
发布2020-02-21 11:25:43
举报
文章被收录于专栏:AI研习社AI研习社
在大多数机器学习竞赛中,特诊工程的质量通常决定着整个作品的得分与排名,也是参赛者们非常看重的一部分。在 GitHub 上,作者 Nomi(专注于计算机视觉与嵌入式技术,也是 tiny-dnn 的原作者)向我们介绍了一个面向 kaggle 数据科学和离线竞赛的实用工具库 nyaggle,可供开发者专用于特征工程与验证。

作者简介 来源: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 数据框:
代码语言:javascript
复制
classnyaggle.experiment.Experiment(logging_directory, overwrite=False, custom_logger=None, with_mlflow=False, mlflow_run_id=None, logging_mode='w')
  • 将排行榜得分记录到现有实验目录中:
代码语言:javascript
复制
nyaggle.experiment.add_leaderboard_score(logging_directory, score)
  • 计算模型融合数据:
代码语言:javascript
复制
nyaggle.experiment.average_results(source_files, output_filename, weight=None, input_format='csv', sample_submission_filename=None)
  • 使用 optuna 在超参数中搜索 lightgbm 参数:
代码语言:javascript
复制
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 根据实际情况自动调用:
代码语言:javascript
复制
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 个特征方式进行调用。而对于不同分类特征的目标编码运行方式如下: 对于分类目标 将特征替换为给定特定分类值的目标后验概率与所有训练数据上目标的先验概率的混合。 对于连续目标 用给定特定分类值的目标期望值和所有训练数据上目标的期望值的混合替换特征。
代码语言:javascript
复制
Class
nyaggle.feature.category_encoder.KFoldEncoderWrapper(base_transformer,cv = None,return_same_type = True,groups = None)
  • nyaggle.feature.nlp 其中 Sentence Vectorizer 使用的是 BERT 预训练模型,并使用 BERT 从可变长度的英语/日语句子中提取固定长度特征向量。
代码语言:javascript
复制
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 保存数据帧:
代码语言:javascript
复制
nyaggle.feature_store.cached_feature(feature_name,directory ='。/ features /',ignore_columns = None)
  • 加载特征作为 pandas 数据框架:
代码语言:javascript
复制
nyaggle.feature_store.load_feature(feature_name,directory ='。/ features /',ignore_columns = None)
  • 加载特征并返回连接的数据框架:
代码语言:javascript
复制
nyaggle.feature_store.load_features(base_df,feature_names,directory ='。/ features /',ignore_columns = None,create_directory = True,rename_duplicate = True)
  • 将 pandas 数据框架另存为特征格式:
代码语言:javascript
复制
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 等的基类)兼容:
代码语言:javascript
复制
classnyaggle.validation.SlidingWindowSplit(source, train_from, train_to, test_from, test_to, n_windows, stride)
  • 返回基础验证器的前 N 个特征,该验证器打包基本验证器以迭代返回前 n 个特征:
代码语言:javascript
复制
classnyaggle.validation.Take(n, base_validator)
  • 时间序列交叉验证器,提供训练/测试索引以拆分可变间隔时间序列数据。此类提供了用于时间序列验证策略的低级 API。此类与 sklearn 的 BaseCrossValidator(KFold,GroupKFold 等的基类)兼容:
代码语言:javascript
复制
classnyaggle.validation.TimeSeriesSplit(source, times=None)
  • 在 X_train 和 X_test 之间执行对抗验证:
代码语言:javascript
复制
nyaggle.validation.adversarial_validate(X_train, X_test, importance_type='gain', estimator=None, cat_cols=None, cv=None)
  • 通过交叉验证评估指标;同时,它还记录了异常预测和测试预测:
代码语言:javascript
复制
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 类

  • 绘制特征重要性并写入图像:
代码语言:javascript
复制
nyaggle.util.plot_importance(importance, path=None, top_n=100, figsize=None, title=None)

nyaggle.hyper_parameters 类——从以往的解决方案中选取 Hypara 相关参数

  • 通过参数名称获取超参数:
代码语言:javascript
复制
nyaggle.hyper_parameters.get_hyperparam_byname(name,gbdt_type ='lgbm',with_metadata = False)
  • 列出所有的超参数:
代码语言:javascript
复制
nyaggle.hyper_parameters.list_hyperparams(gbdt_type ='lgbm',with_metadata = False)
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI研习社 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 工具库 nyaggle
  • nyaggle 实验指南
  • 其它 API 说明
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档