更新历史记录
- 2018年12月17日,我写了一篇文章,尝试使用TPOT进行更多的自动机器学习,因此我对此进行了补充。
- 2018年12月14日,修复了一个大谎言,即" TPOT无法自动执行功能选择"。
本文的目的
机器学习过程可以自动化吗?我读了这篇文章。
似乎在尝试自动选择机器学习模型并调整参数。
在本文中,引入了名为
遗传编程似乎可以优化机器学习。
我立即尝试使用TPOT进行回归学习,但是偶然发现了一点,所以我会保持记录。
我们将遵循TPOT的HP。
环境
- Windows 10
- Python 3.7.2(64位)
- TPOT 0.9.5
准备
软件包安装
看着HP。
似乎有一些必需的软件包。
使用
只有Windows环境才需要最后一个
1 | pip install numpy scipy scikit-learn pandas deap update_checker tqdm stopit pywin32 |
此外,如果放入名为
它提供了一种称为分布式梯度增强的算法。
这是一种所谓的整体学习。
似乎不支持Windows,所以这次我将不支持它。
除此之外,据说您可以放
并完全满意
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) |
设置
练习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文档中找到。
但是,似乎您需要有关基因编程的基础知识才能理解它。
遗传编程似乎是遗传算法的扩展。
当我看到此页面时,我觉得自己以某种方式理解了遗传算法。
这是遗传算法中的"一代"。
我认为
- 0:不打印任何内容
- 1:打印最少的信息
- 2:显示进度条
- 3:打印任何内容
拟合执行
在
之后,只需将数据提供给该实例并适合它。
由于这很重要,因此可以使用
1 2 3 4 | import time t0 = time.time() tpot.fit(X_train, y_train) print(time.time() - t0) |
执行。

进度以tqdm显示。
在我的环境中,花费了126秒。
适用于测试数据
让我们看一下得分。
注意)没有可复制性(单击此处以使其具有可复制性)。

是MSE。
即使是均方误差也为负数?我认为是由于scikit-learn的规范(见)。
让我们将其应用于测试数据并查看准确性。
通过查看皮尔森的相关系数,可以很容易地理解精度。
使用

这真是太糟糕了。
我们还看一下确定系数R2。

顺便说一下,在使用相同数据的文章中,通过多元回归分析显示R2 = .635。
尝试使用其他参数
在上一个示例中,在官方文档中的示例之后,使用了
但是,似乎默认值是
这意味着您只需尝试一下。
我将尝试使用默认设置移动它。
另外,通过设置
尝试并行计算
如果设置为-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秒。
随着计算量的增加,似乎可以预期会有更多的效果。
尝试增加世代和人口
因此,默认情况下,我尝试了
结果...

精度有所提高。
它本来很贵,所以进步不大。
看来增加世代数是改善的主要因素。
那么需要几代人呢?

通过设置
让我们来画这个。
我以为
...但是我找不到找到每一代简历的方法。
我无能为力,所以我尝试通过将以上输出复制并粘贴到Excel中来绘制上述输出。
(我在本文中提出了一些比较体面的方法)。

水平轴是世代,垂直轴是精度。
鉴于此,从第53代开始,精度一直没有提高。
顺便说一句,参数
如果指定此选项,则代代之间没有持续的改进,似乎搜索将停止。
从图中可以看出,大约十代人可能没有任何改善。
因此,如果指定它,则大约为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)放在
准备.csv文件有点麻烦,所以我在这里不再尝试。
摘要
它非常易于使用。
如果您习惯于scikit学习,希望您可以以相同的方式使用它。
这次我使用
但是,似乎TPOT不能自动执行功能选择。
该点可能需要与网格搜索等结合。 del>
↑这是一个大谎言。诚挚的歉意。
如果您阅读TPOT网站,它将包括预处理,例如功能选择和尺寸缩小。
这次使用的.ipynb文件