MLBox:一款在 Python 自动机器学习领域非常神奇的库

大家好,今天给大家分享一个强大的自动化机器学习 Python 库:MLBox ,喜欢记得收藏、关注、点赞。

它提供以下功能:

  • 快速读取和分布式数据预处理/清理/结构化

  • 高度稳健的特征选择和泄漏检测

  • 高维空间中的精准超参数优化

  • 用于分类和回归的最先进的预测模型(Deep Learning、Stacking、LightGBM……)

  • 模型解释预测

完整版代码、资料、文末获取

MLBox 特点

  1. 漂移识别: 一种使训练数据分布与测试数据相似的方法。

  2. 实体嵌入:一种受 word2vec 启发的分类特征编码技术。

  3. 超参数优化

安装 MLBox

图片

安装要求

  • 操作系统:Linux、MacOS和Windows

  • Python 版本:3.5-3.7。仅限 64 位版本(不支持 32 位)python

注意,MacOS系统需要需要安装OpenMP。可以通过brew install libomp命令安装它。

从 pip 安装

PyPI上提供了 MLBox 的官方版本,因此只需运行以下命令:

pip install mlbox

从 Github 安装

以 Linux 为例,使用以下命令使用 Python 3.x 和 anaconda 创建一个新的 conda 环境。

conda create -n Python3 python=3 anaconda 
# 这里Python3是我们刚刚创建的环境的名称。

使用以下命令激活 Python3 环境:

source activate Python3

安装mlbox:

# 可以克隆公共存储库:
git clone git://github.com/AxeldeRomblay/mlbox

# 或者使用以下方式下载 MLBox tar 文件
curl  -OL https://github.com/AxeldeRomblay/mlbox/tarball/master

# 转到以下目录
cd MLBox

# 使用以下命令安装 MLBox 包
python setup.py install

使用安装其他依赖库:

pip install lightgbm
pip install xgboost
pip install hyperopt
pip install tensorflow
pip install keras
pip install matplotlib
pip install ipyparallel
pip install pandas

使用以下命令检查MLBox是否安装正确如果mlbox库加载无误,则说明 mlbox 库安装成功。接下来,我们将继续安装 MLBox 在后台使用的一些附加库。

import mlbox

MLBoxd的管道

MLBox 的整个管道Pipeline已分为 3 个部分/子包。

  1. Pre-Processing

  2. Optimisation

  3. Prediction

预处理

这个子包中的所有功能都可以通过命令使用

from mlbox.preprocessing import *

该子包提供与两个主要功能相关的功能。

读取和清理数据

该软件包支持读取各种文件格式,如 csv、Excel、hdf5、JSON 等,但在本文中,我们将主要介绍最常见的 ".csv" 文件格式。按照以下步骤读取 csv 文件。

Step1: 创建一个Reader类的对象

以分隔符为参数。","是 csv 文件的分隔符。

s=","
r=Reader(s)   
#初始化Reader类的对象
Step2: 列出训练和测试文件路径,并确定目标变量名称。
Step3: 执行清洗操作
clean(path, drop_duplicate=False)

读取和清理数据(接受的格式:csv、xls、json 和 h5),该步骤中执行的清理步骤是:

  • del 未命名的列

  • 将列表转换为变量

  • 尝试将变量转换为浮点数

  • 清理日期并从 01/01/2017、年、月、日、day_of_week 和小时中提取时间戳

  • 删除重复项(如果 drop_duplicate=True)

Step4: 创建训练和测试数据集
train_test_split(Lpath , target_name)

给定几个路径的列表和一个目标名称,自动创建和清理训练和测试数据集,因此,执行此步骤时,上步clean()可以省去。

重要提示:如果数据集不包含目标值,则将其视为测试集。否则,它被认为是训练集的一部分。还确定任务并对目标进行编码(仅限分类问题)。最后将数据集转储到 hdf5,最终转储到目标编码器。

该步骤返回字典包含:

  • 'train': 训练数据集的pandas DataFrame

  • 'test': 测试数据集的pandas DataFrame

  • 'target': 训练集上的目标编码 pandas Serie
    (使用 dtype=‘float’ 进行回归或 dtype=‘int’ 进行分类)

path=["path of the train csv file",
      "path of the test csv file "]
target_name="name of the target variable in the train file"
data_dict=r.train_test_split(
                  path,target_name)

去除漂移变量

漂移变量将在后面的部分中解释。要删除漂移变量,请按照以下步骤操作。

Step1: 创建一个 Drift_thresholder 类的对象
dft=Drift_thresholder()
Step2: 使用创建的对象的fit_transform方法去除漂移变量
data_dict=dft.fit_transform(data_dict)

返回字典data_dict:

  • 'train': 用于训练数据集的转换后的 pandas DataFrame

  • 'test': 用于测试数据集的转换后的 pandas DataFrame

  • 'target': 训练集上目标的pandas Serie

评估与优化

这个子包中的所有功能都可以通过如下命令使用:

from mlbox.optimisation import *

这是该库最有特色的部分。该库中的这种超参数优化方法使用速度非常快的hyperopt库,你几乎可以优化该库中的任何内容,从选择正确的缺失值插补方法到 XGBOOST 模型的深度。该库创建要优化的参数的高维空间,并选择降低验证分数的参数的最佳组合。

下面是在MLBox库中完成的五种优化策略,连字符"__"右侧的术语可以针对不同的值进行优化。

  • Missing Values Encoder(ne)****__numeric_strategy (当要估算的列是连续列时,例如mean、median等)、
    __categorical_strategy(当要估算的列是分类列时,例如 NaN values等)

  • Categorical Values Encoder(ce)
    __strategy (分类变量的编码方法,例如 label_encoding、dummification、random_projection、entity_embedding)

  • Feature Selector(fs)
    __strategy(特征选择的不同方法,例如 l1、variance、rf_feature_importance)
    __threshold(要丢弃的特征的百分比)

  • Stacking estimator(stck)
    __base_estimators (使用交叉验证适合第一级的估计器列表。
    分类默认
    [ Classifier( strategy=“LightGBM” ) , Classifier( strategy=“RandomForest” ) , Classifier( strategy=“ExtraTrees” ) ]
    回归默认
    [Regressor(strategy=“LightGBM”), Regressor(strategy=“RandomForest”), Regressor(strategy=“ExtraTrees”)])。
    __level_estimator (在第二层和最后一层使用的估计器,如分类默认LogisticRegression( ),回归默认LinearRegression() )

  • Estimator(est)
    __strategy (可用作估计器的不同算法,例如 LightGBM、xgboost 等),
    **params(特定于正在使用的算法的参数,例如 max_depth、n_estimators 等)

举个例子,创建一个要优化的超参数空间。说明要优化的所有参数:

  • 要使用的算法 - LightGBM

  • LightGBM max_depth - [3,5,7,9]

  • LightGBM n_estimators - [250,500,700,1000]

  • 特征选择 - [variance, l1, random forest feature importance]

  • 缺失值插补 - numerical(mean,median), categorical(NAN values)

  • 分类值编码器 - label encoding, entity embedding and random projection

现在创建超参数空间。注意超参数是键值对的字典,其中 value 也是由语法{"search": strategy, "space": list} 给出的字典,其中 strategy 可以是 "choice""uniform"list 是值的列表。

space={
    
    
  'ne__numerical_strategy': 
        {
    
    "search":"choice","space":['mean','median']},
 'ne__categorical_strategy':
          {
    
    "search":"choice","space": [np.NaN]},
 'ce__strategy':
        {
    
    "search":"choice","space":['label_encoding',
            'entity_embedding',
            'random_projection']},
 'fs__strategy':
        {
    
    "search":"choice","space":['l1',
            'variance',
            'rf_feature_importance']},
 'fs__threshold':
        {
    
    "search":"uniform","space":[0.01, 0.3]},
 'est__max_depth':
        {
    
    "search":"choice","space":[3,5,7,9]},
 'est__n_estimators':
        {
    
    "search":"choice","space":[250,500,700,1000]}}

将看到使用以下步骤从上述空间中选择最佳组合的步骤。

Step1: 创建一个Optimiser类的对象

其参数为 'scoring''n_folds' 。评分是我们想要优化超参数空间的指标,n_folds 是交叉验证的折叠次数

  • Classification
    “accuracy”, “roc_auc”, “f1”, “log_loss”, “precision”, “recall”

  • Regression
    “mean_absolute_error”, “mean_squarred_error”, “median_absolute_error”, “r2”

  • 默认分类用 “neg_log_loss”,
    默认回归用 “neg_mean_squared_error”

opt=Optimiser(scoring="accuracy",n_folds=5)
Step2: 使用给定的评分函数和给定的整个管道的超参数评估数据
opt.evaluate(params, data_dict)

参数params:整个管道的超参数字典。

键必须遵守以下语法:“enc__param”。

  • “enc” = “ne” 用于 nan 编码器

  • “enc” = “ce” 用于分类编码器

  • “enc” = “fs” 用于特征选择器

  • “enc” = “stck”+str(i) 添加元特征的第 i 层

  • “enc” = “est” 用于最终估计量

  • “param”:每个步骤的正确关联参数。例如:“enc”=“est"的"max_depth”,…

例:

params = {
    
    
     "ne__numerical_strategy" : 0,
     "ce__strategy" : "label_encoding",
     "fs__threshold" : 0.1,
     "stck__base_estimators":[Regressor(strategy="RandomForest"),
                              Regressor(strategy="ExtraTrees")],
     "est__strategy" : "Linear"
 }
Step3: 使用上面创建的对象的优化函数

以超参数空间space、train_test_split 创建的data和迭代次数40作为参数。该函数从超参数空间返回最佳的超参数。

best=opt.optimise(space,data_dict,40)

space超参数空间字典,遵守语法。
键与evaluate的param类似。
值遵守语法:{"search":strategy,"space":list}

  • “strategy”=“choice"或"uniform”。默认=“choice”

  • list :如果 strategy=“choice” 则要测试的值列表。否则,list = [value_min, value_max]。

预测

可以使用以下命令安装此子包中的所有功能。

from mlbox.prediction import *

该子包使用optimisation优化子包计算的最佳超参数对测试数据集进行预测。要在测试数据集上进行预测,请执行以下步骤。

Step1: 创建一个Predictor类的对象
pred=Predictor()
Step2: 使用上面创建的对象的 fit_predict 方法

该方法将通过返回一组最佳的超参数和 train_test_split 所创建的字典作为参数。

pred.fit_predict(best, data_dict)

best 参数字典与evaluate的param字典规则一样。

上述方法将特征重要性漂移变量系数最终预测保存到名为"save"的单独文件夹中。

使用 MLBox 构建机器学习回归器

现在通过超参数优化仅用 7 行代码构建机器学习分类器。下载训练和测试文件并将它们保存在一个文件夹中。使用 MLBox 库,在无需查看数据的前提下预测数据。

# coding: utf-8
# importing the required libraries
from mlbox.preprocessing import *
from mlbox.optimisation import *
from mlbox.prediction import *

# reading and cleaning the train and test files
df=Reader(sep=",").train_test_split(
  ['./train.csv','./test.csv'],
  'Item_Outlet_Sales')

# removing the drift variables
df=Drift_thresholder().fit_transform(df)

# setting the hyperparameter space
space={
    
    
  'ne__numerical_strategy':
    {
    
    "search":"choice","space":['mean','median']},
 'ne__categorical_strategy':
    {
    
    "search":"choice","space":[np.NaN]},
 'ce__strategy':
    {
    
    "search":"choice","space":['label_encoding',
                                  'entity_embedding',
                                  'random_projection']},
 'fs__strategy':
    {
    
    "search":"choice","space":['l1','variance',
                                  'rf_feature_importance']},
 'fs__threshold':
    {
    
    "search":"uniform","space":[0.01, 0.3]},
 'est__max_depth':
    {
    
    "search":"choice","space":[3,5,7,9]},
 'est__n_estimators':
    {
    
    "search":"choice","space":[250,500,700,1000]}}

# calculating the best hyper-parameter
best=Optimiser(scoring="mean_squared_error",n_folds=5).optimise(space,df,40)

# predicting on the test dataset
Predictor().fit_predict(best,df)

下面是 LightGBM 计算的特征重要性图像。

图片

漂移的基本认识

漂移是本自动机器学习的特色功能,在本节中简要解释 Drift_Thresholder 的功能。

一般来说,假设训练和测试数据集是通过相同的生成算法或过程创建的,即假设训练集的数据和测试集的数据是独立同分布的。

图片

但这个假设非常强,我们在现实世界中看不到这种行为。在现实世界中,数据生成器或生成过程可能会发生变化。例如,在销售预测模型中,客户行为会随着时间而变化,因此生成的数据将不同于用于创建模型的数据。这称为漂移。

图片

另一点需要注意的是,在数据集中,独立特征和依赖特征都可能漂移。当独立特征发生变化时,称为协变量偏移;当独立特征和从属特征之间的关系发生变化时,称为概念偏移。MLBox 处理协变量偏移。

图片

检测漂移的一般算法如下:

单变量漂移估计
  • 标注数据,无论它属于训练集还是测试集

  • 训练一个分类器将两个类分开

  • 验证:ROC AUC评分提供了一个漂移测量

贪心算法递归漂移消除

对于每个特征,漂移顺序递减:

  • 删除这个特征

  • 交叉验证新模型

  • 如果分数是

  • 如果 >p,保留这个特征

  • 如果 <p,删除这个特征

MLBox中一般采用贪心算法递归消除漂移。算法伪代码如下所示:

for feature in features:
    drop this feature
    cross_validate the new model
    if loss > p:
        keep this feature
    else:
        drop this feature permanently
注意:
  • 贪心算法(Greedy algorithm):可以设置有限数量的特征去尝试,或者设置一个漂移阈值,在这个阈值下保留特征

  • 可以设置不同的p值

Entity Embeddings

在处理机器学习问题时,有一个问题必须思考:如何编码数据集中的类别变量?

类别编码的两个基本方法是独热编码(onehot encoding)和标签编码(label encoding)。

独热编码

直观来说就是有多少个状态就有多少比特,而且只有一个比特为1,其他全为0的一种码制。

标签编码

将类别变量表示为连续的数值型变量。

举个例子:

假如有三种颜色特征:红、黄、蓝。我们需要对其进行向量化或者数字化编码。

那么令:红=1,黄=2,蓝=3,就实现了标签编码,即给不同类别以标签。然而这意味着机器可能会学习到“红<黄<蓝”,但这并不是我们的本意,我们只希望机器能区分它们,并无大小的区别。

这时就要引入独热编码。因为有三种颜色状态,所以就有3个比特。即红色:[1, 0, 0],黄色:[0, 1, 0],蓝色:[0, 0, 1] 。如此一来每两个向量之间的距离都是 [公式] ,在向量空间距离都相等,所以这样不会出现偏序性,基本不会影响基于向量空间度量算法的效果。

但是独热编码变量会导致非常稀疏的向量,这在计算上是无效的,并且难以优化。

实体嵌入则很好的解决了独热编码和标签编码存在的问题。

实体嵌入

实体嵌入基本上将标签编码方法上升了一个层次,它不仅仅是将一个整数分配给一个类别,而是整个向量。这个向量可以是任意尺寸,通过一个神经网络来学习这个表达。

图片

嵌入提供了有关不同类别之间距离的信息。使用嵌入的优点在于,在神经网络的训练期间,也要训练分配给每个类别的向量。因此,在训练过程结束时,我们最终会得到一个代表每个类别的向量。这些训练过的嵌入被可视化,为每个类别提供可视化。

MLBox 的优点

  1. 自动任务识别,即分类或回归

  2. 读取数据时的基本预处理

  3. 去除漂移变量

  4. 极其快速和准确的超参数优化。

  5. 多种特征选择方法。

  6. 最少的代码行。

  7. 通过实体嵌入进行特征工程

推荐文章

猜你喜欢

转载自blog.csdn.net/qq_34160248/article/details/124807748