艺赛旗 RPA9.0全新首发免费下载 点击下载
http://www.i-search.com.cn/index.html?from=line1
相信这个部分是你在一开始读本文时心里最终想实现的那个目标。即:实现。那么首先我们来快速浏览一下 TPOT 库(Tree-based Pipeline Optimisation Technique,树形传递优化技术),该库基于 scikit-learn 库建立。
TPOT 是一个 Python 编写的软件包,利用遗传算法行特征选择和算法模型选择,仅需几行代码,就能生成完整的机器学习代码。
自动化机器学习(AML)是一种流水线(也称管线),它能够让你自动执行机器学习(ML)问题中的重复步骤,从而节省时间,让你专注于使你的专业知识发挥更高价值。 最重要的是,它不仅是一些模糊的想法,而且还有一些基于标准 python ML 包建立的应用包,如 scikit-learn。
在这种情况下,任何熟悉机器学习的人都可能会回想起网格搜索(grid search)这个概念。 他们这样想是完全正确的。 实际上,AML 是在 scikit-learn 中应用的网格搜索的扩展,而不是迭代这些值预先定义的集合和其组合,它通过搜索方法,特征,变换和参数值来获得最佳解决方案。 因此,AML“网格搜索”不需要在可能的配置空间上进行详尽的搜索 - AML 有一个很赞的应用叫做 TPOT 包,其提供了像遗传算法这样的应用,可用来在某个配置中混合各个参数并达到最佳设置。
图中的灰色区域用 TPOT 库实现了自动处理。实现该部分的自动处理需要用到遗传算法。
我们这里不深入讲解,而是直接应用它。为了能够使用 TPOT 库,你需要先安装一些 TPOT 建立于其上的 python 库。下面我们快速安装它们:
pip install deap
pip install update_checker
pip install tqdm
pip install tpot
然后下载上一篇给出的训练和测试集,下面给出详细代码及相关注释,大家可以对着敲一下代码:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import preprocessing
train = pd.read_table(‘Train_UWu5bXk.txt’, sep=’,’)
test = pd.read_table(‘Test_u94Q5KV.txt’, sep=’,’)
可以输出一下 train 看看:
下面是一些数据清洗工作:
train[‘Item_Weight’].fillna((train[‘Item_Weight’].mean()), inplace=True)
test[‘Item_Weight’].fillna((test[‘Item_Weight’].mean()), inplace=True)
train[‘Item_Fat_Content’] = train[‘Item_Fat_Content’].replace([‘low fat’,‘LF’], [‘Low Fat’,‘Low Fat’])
train[‘Item_Fat_Content’] = train[‘Item_Fat_Content’].replace([‘reg’], [‘Regular’])
test[‘Item_Fat_Content’] = test[‘Item_Fat_Content’].replace([‘low fat’,‘LF’], [‘Low Fat’,‘Low Fat’])
test[‘Item_Fat_Content’] = test[‘Item_Fat_Content’].replace([‘reg’], [‘Regular’])
train[‘Outlet_Establishment_Year’] = 2013 - train[‘Outlet_Establishment_Year’]
test[‘Outlet_Establishment_Year’] = 2013 - test[‘Outlet_Establishment_Year’]
train[‘Outlet_Size’].fillna(‘Small’,inplace=True)
test[‘Outlet_Size’].fillna(‘Small’,inplace=True)
train[‘Item_Visibility’] = np.sqrt(train[‘Item_Visibility’])
test[‘Item_Visibility’] = np.sqrt(test[‘Item_Visibility’])
col = [‘Outlet_Size’, ‘Outlet_Location_Type’, ‘Outlet_Type’, ‘Item_Fat_Content’]
test[‘Item_Outlet_Sales’] = 0
combi = train.append(test)
for i in col:
combi[i] = preprocessing.LabelEncoder().fit_transform(combi[i].astype(‘str’))
combi[i] = combi[i].astype(‘object’)
train = combi[:train.shape[0]]
test = combi[train.shape[0]:]
test.drop(‘Item_Outlet_Sales’, axis=1, inplace=True)
tpot_train = train.drop([‘Outlet_Identifier’, ‘Item_Type’, ‘Item_Identifier’], axis=1)
tpot_test = test.drop([‘Outlet_Identifier’, ‘Item_Type’, ‘Item_Identifier’], axis=1)
target = tpot_train[‘Item_Outlet_Sales’]
tpot_train.drop(‘Item_Outlet_Sales’, axis=1, inplace=True)
接下来开始训练模型:
from tpot import TPOTRegressor
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(tpot_train, target, train_size=0.75, test_size=0.25)
tpot = TPOTRegressor(generations=5, population_size=50, verbosity=2)
tpot.fit(X_train, y_train)
运行效果如下:
【数据结构与算法】遗传算法(四)应用篇之 TPOT 库实现
可以看到 TPOT 寻找到的最优的机器学习模型是极端随机森林回归
print(tpot.score(X_test, y_test))
tpot.export(‘tpot_boston_pipeline.py’)
tpot_pred = tpot.predict(tpot_test)
sub1 = pd.DataFrame(data=tpot_pred)
sub1 = sub1.rename(columns={‘0’:‘Item_Outlet_Sales’})
sub1[‘Item_Identifier’] = test[‘Item_Identifier’]
sub1[‘Outlet_Identifier’] = test[‘Outlet_Identifier’]
sub1.columns = [‘Item_Outlet_Sales’, ‘Item_Identifier’, ‘Outlet_Identifier’]
sub1 = sub1[[‘Item_Identifier’, ‘Outlet_Identifier’, ‘Item_Outlet_Sales’]]
sub1.to_csv(‘tpot.csv’, index=False)
如果你提交了这个 csv,那么你会发现其实效果没有那么好。实际上,TPOT 库有一个简单的规则。如果你不运行 TPOT 太久,那么它就不会为你的问题找出最可能传递方式。
所以,你得增加进化的代数,拿杯咖啡出去走一遭,其它的交给 TPOT 就行。此外,你也可以用这个库来处理分类问题。进一步内容可以参考这个文档:http://rhiever.github.io/tpot/
除了比赛,在生活中我们也有很多应用场景可以用到遗传算法。