作者:Nss
翻译:jqr.com
来源:机器人官网(公众号:jqr-com)
使用MLBox库,用最少行数的代码完成最繁重的机器学习指令。不管是缺失值填补,还是采用了先进实体嵌入的功能工程,MLBox都能一一胜任。在仅仅8行代码里,就能执行超参数优化,并以惊人的速度测试完50个模型,跟着机器人网(jqr.com)看完这篇文章,你也能学会!
什么是MLBox?
按照开发者的说法,“MLBox是一个功能强大的自动机器学习Python库。” 它提供以下功能:
快速阅读和分布式数据预处理/清理/格式化
高度稳定的功能选择和泄漏检测
精确的高维度超参数优化
最先进的分类和回归预测模型(Deep Learning深度学习,Stacking堆垛,LightGBM等)
模型解释预测
MLBox与其他机器学习库的对比
与其他库相比,MLBox特别注重于以下三点:
偏移识别——使练习数据的分布和测试数据相类似的方法。
实体嵌入——灵感源于word2vec(一种Google开发的将单词转换成向量形式的工具)的分类功能编码技术。
超参数优化
我们会在下面具体说明这些内容,让你对他们有一个基本的认识。
安装MLBox
MLBox目前仅适用于Linux系统。 MLBox主要是使用Python 2开发的,最近刚刚扩展到Python 3中。我们将安装最新的3.0开发版本的MLBox。 请按照以下步骤将MLBox安装到Linux系统中:
通过以下指令创建一个新的带Python 3.x和anaconda 的conda环境(conda是一个开源的软件包管理系统和环境管理系统,用于安装多个版本的软件包及其依赖关系,并能在它们之间轻松切换):
conda create -n Python3 python=3 anaconda #Here Python3 is the name of the #environment that we just created.
激活Python3环境:source activate Python3
下载MLBox tar文件:curl -OL github.com/AxeldeRomblay/mlbox/tarball/3.0-dev
导入下载完毕的tar文件:sudo tar -xzvf 3.0-dev
转到下级目录cd AxeldeRomblay-MLBox-2befaee
安装MLBox包
cd python-package
cd dist
pip install *.whl
安装其他辅助库
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是否已经正确安装
python
import mlbox
如果MLBox库加载没有错误,则已经成功安装。接下来继续安装MLbox在覆盖下的附加库。
注意:这个库正处于非常活跃的发展阶段,所以可能会出现今天能运行的过程明天就不能的情况。比如,在两天前Python2.7版本下能流畅运行,但在Python3.6版本下就不行。
MLBox的布局和管道传递
整个的MLbox的管道模型如下:
MLbox的整个管道模型分为3个部分/子包:预处理、优化、预测。
下面我们来详细学习这三个子包。
1.预处理
运行下面的指令使用该子包内的所有功能:
from mlbox.preprocessing import *
该子包提供了与两个主要功能相关的部分:
阅读和清理文件
此软件包支持读取各种各样的文件格式,如csv,Excel,hdf5,JSON等,但在本文中,我们将主要看到最常见的“.csv”文件格式。 请按照以下步骤读取csv文件:
Step1: 删除未命名的列。
使用分隔符作为参数创建一个Reader类的对象。 “,”是csv文件的分隔符。
s=","
r=Reader(s) #initialising the object of Reader Class
Step2: 删除重复项
列出练习和测试文件的路径,并确定目标变量名称。
path=["path of the train csv file","path of the test csv file "]
target_name="name of the target variable in the train file"
Step3: 从“日期”列中提取月份,年份和星期
执行清理操作并创建清理后的练习和测试文件。
data=r.train_test_split(path,target_name)
删除偏移变量
Step1:创建一个Drift_thresholder类的对象
dft=Drift_thresholder()
Step2:使用创建对象的fit_transform方法来删除漂移变量。
data=dft.fit_transform(data)
2.优化
运行下面的指令使用该子包内的所有功能:
from mlbox.optimisation import *
优化是该库的最强之处。从选择正确的缺失值插补方法到XGBOOST模型的深度,超参数优化方法使用超快速(hyperopt)库极速优化库中的 所有内容。该库创建了一个要优化的参数的高维空间,并选择了降低数据分数的参数最佳组合。
以下是在MLBox库中完成的四个广泛优化的表格,其中有针对不同值优化的连字符术语。
Missing Values Encoder(ne)(缺失值编码器)- numeric_strategy(数值策略)(估算的列是连续列,如平均值,中位数等), categorical_strategy(分类策略)(估算的列是分类列,如NaN值等)
Categorical Values Encoder(ce) -strategy(分类值编码器策略)编译分类变量的方法,例如标签编码,实体模型,随机投影,实体嵌入)
Feature Selector(fs)– strategy (功能选择器策略)(功能选择的不同方法,如l1,方差,rf_feature_importance), threshold(阈值)(废弃的功能的百分比)
Estimator(est)–strategy(估计器策略)(用作估计器的不同算法,例如,LightGBM,xgboost等),params(参数)(使用特定于算法的参数eg- max_depth,n_estimators等)
以创建一个要优化的超参数空间为例,在此先说明要优化的所有参数:
要使用的算法:LightGBM
LightGBM max_depth:[3,5,7,9]
LightGBM n_estimators: [250,500,700,1000]
功能选择: [方差,l1,随机森林功能重要性]
缺失值插补:数值(平均值,中位数),分类(NAN值)
分类值编码器:标签编码,实体嵌入和随机投影
创建超参数空间前,需要记住的是超参数是键和值对应的代码字典,其中,值也是由语法给出的。
{“search”:strategy,“space”:list},其中策略可以是““choice” ”或“uniform”,列表是值的列表。
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:创建一个Optimizer类的对象,它的参数是“scoring”和“n_folds”。 评分是优化超参数空间的指标,n_folds是交叉验证的文件夹个数。
评分值
分类-"accuracy", "roc_auc", "f1", "log_loss", "precision", "recall"
Scoring values for Regression- "mean_absolute_error", "mean_squarred_error", "median_absolute_error", "r2"
opt=Optimiser(scoring="accuracy",n_folds=5)
Step2:使用上面创建的对象的优化函数,它的参数分别是超参数空间、由train_test_split创建的字典、迭代次数。 此函数从超参数空间回归最佳超参数。
best=opt.optimise(space,data,40)
3.预测
运行下面的指令安装该子包内的所有功能:
from mlbox.prediction import *
该子包使用优化子包计算的最佳超参数来预测测试数据集。要对测试数据集进行预测,请执行以下步骤。
Step1:创建一个Predictor类的对象
pred=Predictor()
Step2:使用上面创建的对象的fit_predict方法,该方法以一组train_test_split创建的超参数和字典作为参数。
pred.fit_predict(best,data)
上述方法将功能重要性,偏移变量系数和最终预测保存到名为“save”的独立文件夹中。
使用MLBox构建机器学习回归器(Machine Learning Regressor)
现在,我们将使用超参数优化在7行代码中构建机器学习分类器。以解决大型商场销售问题(Big Marts sales problem)为例。下载练习和测试文件并将它们保存在一个文件夹中。在不查看数据的情况下,使用MLBox库来提交首个预测。 你可以在下面的代码中找到该问题的预测。
#35;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(['/home/nss/Downloads/mlbox_blog/train.csv',
'/home/nss/Downloads/mlbox_blog/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)的基本理解
偏移不常见,但却很重要。关于它,应当用单独的一篇文章去阐述, 但在此我将尽量把Drift_Thresholder的功能解释清楚。
一般来说,我们预设练习和测试数据集是通过相同的生成算法或过程创建的。但这个预设过于强大,现实世界中并非如此,数据发生器或过程可能会发生改变。 例如,在销售预测模型中,客户行为随时间变化,生成的数据将与用于创建模型的数据不同。 这就叫做偏移。
还需要注意的是,在数据集中,独立功能和依赖功能都可能发生偏移。 当独立功能发生变化时,称为协变量;当独立和相关功能之间的关系发生变化时,称为概念偏移。 MLBox是处理协变量的。
用于检测偏移的一般算法如下:
实体嵌入(Entity Embedding)的基本理解
实体嵌入来源于word2vec嵌入,他们的功能运作模式是一致的。 例如,我们可以用下面这种方式展示词的矢量化表达。
类似地,分类变量可以被编码以产生新的信息功能。 这种效应在Kaggle’s Rossmann Sales Problem(销售预测问题竞赛)中十分明显,其中一个团队使用了实体嵌入和神经式网络,在没有运行任何重要的功能工程的情况下排名第三。实体嵌入能够捕获德国各州之间的关系,如下所示。
在MLBox中,实体嵌入可以作为黑盒来对分类变量进行编码。
MLBox的优与劣
建议权衡利弊后,再将其作为机器学习的主要库。
只需8行代码,不需要花时间准确处理数据和超参数优化,使你能把更多时间花在功能设计和快速检查上,岂不美哉?