⾃动化机器学习(⼆)⾃动构建机器学习流⽔线
⽂章⽬录
技术介绍
⾃动化机器学习就是能够⾃动建⽴机器学习模型的⽅法,其主要包含三个⽅⾯:⽅⾯⼀,超参数优化;⽅⾯⼆,⾃动特征⼯程与机器学习算法⾃动选择;⽅⾯三,神经⽹络结构搜索。本⽂侧重于⽅⾯⼆,我们将使⽤TPOT完成⾃动特征⼯程与机器学习算法⾃动选择。
高中英语动词词组在机器学习中,模型本⾝的参数是可以通过训练数据来获取的,这些参数属于算法的普通参数,通过数据训练获得算法合适的参数,构建强⼤的模型本⾝就是机器学习的核⼼⽬标。但是机器学习算法本⾝还存在在超参数,超参数就是那些需要科学家⼿动设置的参数,如SVM的核函数,Lasso的alpha,决策树的最⼤深度与分⽀条件,随机森林的⼦采样率和决策树类型等等等等。如何对这些超参数进⾏⾃动优化,⽽⾮⼿动调节正是⾃动化机器学习的第⼀步。对于超参数的优化我们可以将其视作特殊的⾮凸函数来进⾏优化,不顾我们也可以更进⼀步从更⾼的层次了来审视机器学习。
正常的机器学习流程应该包括数据读取-数据处理-特征构建-特征选择-模型选择-超参数优化-(集成学习)等等部分,⽽且⼤部分情况下其中的多个部分都需要循环往替,不断更新,最终得到⼀个不错的机器学习流⽔线(或者说管道),⽽本⽂侧重的的就是这⼀点,本⽂的主要使⽤⼯具则是tpot。
TPOT是⼀种基于遗传算法优化机器学习管道(pipeline)的Python⾃动机器学习⼯具。简单来说,就是TPOT可以智能地探索数千个可能的pipeline,为数据集找到最好的pipeline,从⽽实现机器学习中最乏味的部分。⽽总的来说,TPOT可以⾃动地完成特征⼯作(特征选择,特征预处理,特征构建等),同时也可以进⾏模型的选择和参数的调优。
核⼼技术栈
appl
tpot
xgboost
lughtgbm
scikit-learn
nbp实现
数据
该数据为UCI的红酒质量数据集,标签为分数(整数),因此既可可⽤于回归,也可⽤于分类。
AutoML算法并不像在数据集中拟合⼀个模型那样简单。他们正在考虑在具有多个预处理步骤(缺失值插补,缩放,PCA,特征选择等)的管道中使⽤多种机器学习算法(随机森林,线性模型,SVM等),所有模型的超参数和预处理步骤,以及在管道中集成或堆叠算法的多种⽅法。
因此,TPOT需要花费⼀些时间才能在较⼤的数据集上运⾏,但重要的是要弄清原因。使⽤默认的TPOT设置(100个世代,⼈⼝总数为100),TPOT将在完成之前评估10,000个管道配置。为了将这个数字放在上下⽂中,请考虑针对机器学习算法的10,000个超参数组合进⾏⽹格搜索,以及该⽹格搜索将花费多长时间。这是10,000个模型配置,需要进⾏10倍交叉验证才能进⾏评估,这意味着可以在⼀个⽹格搜索中对训练数据进⾏拟合并评估⼤约100,000个模型。即使对于像决策树这样的简单模型,这也是⼀个耗时的过程。
mba联考
典型的TPOT运⾏将需要数⼩时⾄数天才能完成(除⾮这是⼀个很⼩的数据集),但是您始终可以在运⾏过程中中途中断运⾏,并查看迄今为⽌的最佳结果。TPOT还提供了⼀个warm_start参数,可让您从中断处重新开始TPOT运⾏。不过由于此处更重在演⽰,因此将不会运⾏过长的时间。
实现
类库加载与数据读取
from tpot import TPOTClassifier
impunity
del_lection import train_test_split
import pandas as pd
剑桥国际少儿英语import numpy as np
# NOTE: Make sure that the outcome column is labeled 'target' in the data file
tpot_data = pd.read_csv('/home/fonttian/Data/datat/wine/wine.csv', dtype=np.float64)
labels = tpot_data['quality']
tpot_data = tpot_data.drop('quality', axis=1)
X_train, X_test, y_train, y_test = \
train_test_split(tpot_data.values, labels.values, train_size=0.75, test_size=0.25,random_state=42)
/home/fonttian/anaconda3/envs/keras/lib/python3.8/site-packages/tpot/builtins/__init__.py:36: UrWarning: Warning: optional dependency `torch` is not av ailable. - skipping import of NN models.
warnings.warn("Warning: optional dependency `torch` is not available. - skipping import of NN models.")
在我们执⾏玩代码之后会出现⼀个提⽰,⼤体意思为由于没有安装PyTorch因此将不会调⽤神经⽹络模块进⾏⾃动化机器学习。
⽽在代码的最后我们使⽤了skleran中的数据分割算法,将数据集分给为3:1两份,前者⽤于训练,后者⽤于测试。piano怎么读
参数
TPOT接⼝设计时⽬标为与scikit-learn尽可能相似。TPOT可以像任何常规Python模块⼀样导⼊。要使⽤TPOT,只需要下列简单的代码即可。
⽽由于tpot是基于遗传算法编写的⾃动化机器学习项⽬,因此我们在创建tpot模型时,需要传⼊的参数全部都是遗传算法所需的参数。下列参数的具体解释如下:
generations: int, optional (default=100),运⾏管道优化过程的迭代次数。⼀定是正数。
population_size: int, optional (default=100),在每⼀代遗传中保留的个体数。⼀定是正数。
cv: 交叉验证的折数。⼀定是正数。
random_state: 随机数种⼦,⽤于控制随机数
verbosity: 打印的详细程度,0,完全不打印,1,少量,2,更多信息以及进度条,3,所有信息以及进度条
除此之外还有⼏个⽐较重要的参数,如warm_start,是否调⽤之前fit的结果,继续进⾏训练。以及其他⼏个常⽤参数:
offspring_size:默认⼀百,每次遗传中产⽣的后代数量。⼀定是正数。
mutation_rate:变异率,默认0.9,⼀般不需要改动。
crossover_rate:交叉率,默认0.1,⼀般不需要改动。
scoring:评价函数,内部使⽤
subsample: 训练过程中的采样⽐,默认为1,即百分之百。
n_jobs:使⽤线程数,,默认为1。-1表⽰使⽤尽可能多的内容,-2表⽰将使⽤出⼀个以外的所有CPU
max_time_mins:多少分钟优化管道,默认None。设置为None,则不进⾏时间限制。
max_eval_time_mins:多少分钟评估管道,默认5,也就是五分钟。
early_stop:早停,⽐较常见的参数,当多少个回合损失基本不变时,停⽌训练。
config_dict: Python dictionary, string, or None, optional (default=None),⽤于定制TPOT在优化过程中搜索的操作符和参数的配置字典。不过由于基本上都是直接⽤⾃带的,这个参数意义不⼤。如果需要使⽤可以参考该链接:
epistasislab.github.io/tpot/using/#built-in-tpot-configurations
⽅法:
⾄于⽅法则更为简单,其只有四个⽅法可以调⽤:
fit(features, target, sample_weight=None, groups=None),在给定的训练数据上运⾏TPOT优化过程。
predict(features),使⽤优化的管道来预测测试集的⽬标值。
score(testing_features, testing_target),使⽤⽤户指定的评分函数在给定的测试数据上返回优化的管道的得分。
export(output_file_name),将优化后的最佳机器学习管道导出为Python代码。
pipeline_optimizer = TPOTClassifier(generations=5, population_size=20, cv=5, random_state=42, verbosity=2)
pipeline_optimizer.fit(X_train, y_train)
print(pipeline_optimizer.score(X_test, y_test))
HBox(children=(FloatProgress(value=0.0, description='Optimization Progress', max=120.0, style=ProgressStyle(de…
Generation 1 - Current best internal CV score: 0.6430648535564853
Generation 2 - Current best internal CV score: 0.6430648535564853
Generation 3 - Current best internal CV score: 0.6430648535564853
Generation 4 - Current best internal CV score: 0.6822838214783822
Generation 5 - Current best internal CV score: 0.6822838214783822
Best pipeline: ExtraTreesClassifier(RandomForestClassifier(ExtraTreesClassifier(PCA(input_matrix, iterated_power=5, svd_solver=randomized), bootstrap =Fal, criterion=entropy, max_features=0.7500000000000001, min_samples_leaf=4, min_samples_split=16, n_estimators=100), bootstrap=True, criterio n=gini, max_features=0.15000000000000002, min_samples_leaf=7, min_samples_split=15, n_estimators=100), bootstrap=Fal, criterion=entropy, max_f eatures=0.9500000000000001, min_samples_leaf=9, min_samples_split=15, n_estimators=100)bangkok
0.665
从上⾯的执⾏结果我们可以看到,tpot确实在训练过程中展⽰出来对应的结果,以及有⼀个进度条。但是也正如其⽂档所说,当时间较短时,tpot得到的结果往往会很差,连续训练⼏个⼩时甚⾄⼏天都是⾮常正常的情况。同时要注意的是,虽然训练之后会默认打印最佳参数,按时很显然这并不是能够接受的最好⽅式。因此我们还是使⽤export⽅法将优化后的最佳结果直接输出为Python代码⽐较好。下⾯就是输出的结果:
# export code
port('tpot_exported_pipeline.py')
import numpy as np
import pandas as pd
from sklearn.decomposition import PCA
ble import ExtraTreesClassifier, RandomForestClassifier
del_lection import train_test_split
overnight deliveryfrom sklearn.pipeline import make_pipeline, make_union
from tpot.builtins import StackingEstimator
port_utils import t_param_recursive
# NOTE: Make sure that the outcome column is labeled 'target' in the data file
tpot_data = pd.read_csv('PATH/TO/DATA/FILE', p='COLUMN_SEPARATOR', dtype=np.float64)
features = tpot_data.drop('target', axis=1)
training_features, testing_features, training_target, testing_target = \
train_test_split(features, tpot_data['target'], random_state=42)
# Average CV score on the training t was: 0.6822838214783822
exported_pipeline = make_pipeline(
PCA(iterated_power=5, svd_solver="randomized"),
StackingEstimator(estimator=ExtraTreesClassifier(bootstrap=Fal, criterion="entropy", max_features=0.7500000000000001, min_samples_leaf=4, min _samples_split=16, n_estimators=100)),
StackingEstimator(estimator=RandomForestClassifier(bootstrap=True, criterion="gini", max_features=0.15000000000000002, min_samples_leaf=7, min _samples_split=15, n_estimators=100)),从零开始学法语
ExtraTreesClassifier(bootstrap=Fal, criterion="entropy", max_features=0.9500000000000001, min_samples_leaf=9, min_samples_split=15, n_estimat ors=100)
)
# Fix random state for all the steps in exported pipeline
t_param_recursive(exported_pipeline.steps,'random_state',42)
exported_pipeline.fit(training_features, training_target)
results = exported_pipeline.predict(testing_features)
除此之外还有⼀个⽐较常⽤的算法为回归器:TPOTRegressor,参数和效果与分类器的差不多,具体内容就不再赘述。
总结
tpot作为⼀种完全的⾃动化机器学习⼯具,其能够从特征构建,特征处理,模型选择,超参数优化等多个⽅⾯进⾏数据的优化,并最终给予我们⼀个最佳的机器学习管道,但是同样其存在⼀定的问题,
那就是效果⽐较差,必须训练⼏个⼩时甚⾄⼏天的时间,其才能对可鞥的组合进⾏较好的探究,最终获得⼀个较好的结果。对于专业⼈⼠⽽⾔,这时间确实有些过长了。但是极低的操作性⼜意味着其使⽤的容易,同时如果时间充裕,tpot⼜确实能够做出⽐⼀般⼯程师更好地结果。所以其必然还是存在很⼤的使⽤空间的。