我尝试使用TPOT进行自动机器学习(回归)


更新历史记录

  • 2018年12月17日,我写了一篇文章,尝试使用TPOT进行更多的自动机器学习,因此我对此进行了补充。
  • 2018年12月14日,修复了一个大谎言,即" TPOT无法自动执行功能选择"。

本文的目的

机器学习过程可以自动化吗?我读了这篇文章。
似乎在尝试自动选择机器学习模型并调整参数。
在本文中,引入了名为TPOT的程序包。
遗传编程似乎可以优化机器学习。

我立即尝试使用TPOT进行回归学习,但是偶然发现了一点,所以我会保持记录。

我们将遵循TPOT的HP。

环境

  • Windows 10
  • Python 3.7.2(64位)
  • TPOT 0.9.5

准备

软件包安装

看着HP。

似乎有一些必需的软件包。
使用pip快速安装。
只有Windows环境才需要最后一个pywin32

1
pip install numpy scipy scikit-learn pandas deap update_checker tqdm stopit pywin32

此外,如果放入名为xgboost的程序包,则可以使其与名为XGBoost的程序兼容。
它提供了一种称为分布式梯度增强的算法。
这是一种所谓的整体学习。
似乎不支持Windows,所以这次我将不支持它。
除此之外,据说您可以放daskscikit-mdrskrebate等,但是我不会这样做。
并完全满意

1
pip install tpot

数据准备

我想尝试回归学习。
如果您看一下HP的示例,您正在尝试使用波士顿房屋价格数据。
我会尝试的。

1
2
from sklearn.datasets import load_boston
housing = load_boston()

现在已加载房屋价格数据集。
有关数据的内容,请参阅本文。
housing.data包含诸如当地犯罪率和通向大道路的通行性之类的信息。
housing.target的住房价格可作为教师的信号。

train_test_split分离训练数据和测试数据。

1
2
3
4
from sklearn.model_selction import train_test_split
X_train, X_test, y_train, y_test = train_test_split(housing.data, housing.target,
                                                    train_size=0.75, test_size=0.25,
                                                    random_state=2018)

设置

random_state以重现结果。

练习TPOT回归

模块导入

首先,导入模块

1
from tpot import TPOTRegressor

…,但是我遇到了错误。

1
2
ImportWarning: Falling back to the python version of hypervolume module. Expect this to be very slow.
  "module. Expect this to be very slow.", ImportWarning)

当我用Google搜索时,有一些讨论,大自然吗?编译?这似乎是一个问题。

在这里,我被要求插入旧版本的deap,所以我会尝试的。
(当前版本是1.2.2)。

1
2
pip uninstall deap
pip install deap==1.0.2.post2

当我再次尝试时,错误消失了!

使用参数

实例化

tpot的用法与sklearn相同。

首先,创建tpot的实例。

1
2
from tpot import TPOTRegressor
tpot = TPOTRegressor(generations=5, population_size=50, verbosity=2)

函数的详细用法可以在API文档中找到。
但是,似乎您需要有关基因编程的基础知识才能理解它。
遗传编程似乎是遗传算法的扩展。
当我看到此页面时,我觉得自己以某种方式理解了遗传算法。

generations是管道优化的迭代次数。
这是遗传算法中的"一代"。
我认为population size是以上页面上的人口。
verbosity是进度报告的选项。

  • 0:不打印任何内容
  • 1:打印最少的信息
  • 2:显示进度条
  • 3:打印任何内容

拟合执行

之后,只需将数据提供给该实例并适合它。
由于这很重要,因此可以使用time来衡量执行时间。

1
2
3
4
import time
t0 = time.time()
tpot.fit(X_train, y_train)
print(time.time() - t0)

执行。
スクリーンショット (21).png
进度以tqdm显示。
在我的环境中,花费了126秒。

适用于测试数据

让我们看一下得分。
注意)没有可复制性(单击此处以使其具有可复制性)。
スクリーンショット (36).png
是MSE。
即使是均方误差也为负数?我认为是由于scikit-learn的规范(见)。

.fitted_pipeline_将返回最终吐出的管道信息。
スクリーンショット (37).png

.evaluated_individuals_将返回有关您考虑的模型的信息。
スクリーンショット (38).png

让我们将其应用于测试数据并查看准确性。
通过查看皮尔森的相关系数,可以很容易地理解精度。
使用.predict从已拟合的管道进行预测。
スクリーンショット (35).png
这真是太糟糕了。

我们还看一下确定系数R2。
スクリーンショット (39).png
顺便说一下,在使用相同数据的文章中,通过多元回归分析显示R2 = .635。

尝试使用其他参数

在上一个示例中,在官方文档中的示例之后,使用了generations=5population_size=50
但是,似乎默认值是generations=100population_size=100
这意味着您只需尝试一下。

我将尝试使用默认设置移动它。
另外,通过设置n_jobs,似乎将执行并行计算,因此我也将尝试这样做。

尝试并行计算

generationspopulations与以前相同,因此我们将其移至n_jobs=-1
如果设置为-1,则将完全激活CPU内核并执行并行计算。

1
2
3
4
tpot = TPOTRegressor(generations=5, population_size=50, verbosity=2, n_jobs=-1)
t0 = time.time()
tpot.fit(X_train, y_train)
print(time.time() - t0)

花费了45秒而不是126秒。
随着计算量的增加,似乎可以预期会有更多的效果。

尝试增加世代和人口

因此,默认情况下,我尝试了generationspopulations
结果...
スクリーンショット (41).png
精度有所提高。
它本来很贵,所以进步不大。

看来增加世代数是改善的主要因素。
那么需要几代人呢?
スクリーンショット (40).png
通过设置verbosity,输出每一代的分数。
让我们来画这个。

我以为

...但是我找不到找到每一代简历的方法。
我无能为力,所以我尝试通过将以上输出复制并粘贴到Excel中来绘制上述输出。
(我在本文中提出了一些比较体面的方法)。
スクリーンショット (42).png
水平轴是世代,垂直轴是精度。
鉴于此,从第53代开始,精度一直没有提高。

顺便说一句,参数early_stopTPOTRegressor
如果指定此选项,则代代之间没有持续的改进,似乎搜索将停止。
从图中可以看出,大约十代人可能没有任何改善。
因此,如果指定它,则大约为20(仅在此数据中)。

(于2018年12月18日添加)
当我使用已有的数据将其旋转约500代时,我看到精度逐步提高。
给定遗传程序设计的特征(不知道),这很自然。
因此,即使有了这些数据,一段时间后它也可能会再次改善。

管道输出

1
tpot.export('tpot_boston_pipeline.py')

如果执行

,则可以输出优化的管道。
让我们看一下输出.py文件的内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split

# NOTE: Make sure that the class is labeled 'target' in the data file
tpot_data = pd.read_csv('PATH/TO/DATA/FILE', sep='COLUMN_SEPARATOR', dtype=np.float64)
features = tpot_data.drop('target', axis=1).values
training_features, testing_features, training_target, testing_target = \
            train_test_split(features, tpot_data['target'].values, random_state=None)

# Average CV score on the training set was:-9.496544723555056
exported_pipeline = RandomForestRegressor(bootstrap=False, max_features=0.45, min_samples_leaf=1, min_samples_split=6, n_estimators=100)

exported_pipeline.fit(training_features, training_target)
results = exported_pipeline.predict(testing_features)

如果这样做,我认为它将优化的管道应用于给定的数据,并返回交叉验证的准确性。
您需要将路径或分隔符以及数据(.csv)放在'PATH/TO/DATA/FILE''COLUMN_SEPARATOR'中。
准备.csv文件有点麻烦,所以我在这里不再尝试。

摘要

它非常易于使用。
如果您习惯于scikit学习,希望您可以以相同的方式使用它。
这次我使用TPOTRegressor进行回归,但是我认为TPOTClassifier分类可以以相同的方式进行。

但是,似乎TPOT不能自动执行功能选择。
该点可能需要与网格搜索等结合。
↑这是一个大谎言。诚挚的歉意。
如果您阅读TPOT网站,它将包括预处理,例如功能选择和尺寸缩小。

这次使用的.ipynb文件