声明:原文地址:使用TPOT自动选择scikit-learn机器学习模型和参数,此文是本人学习原文的结果,略有改动。侵删。
在上一篇博客中我们在anacoda中安装了tpot: anacoda下安装TPOT库。有需要的可以去看一下。
正文:
scikit-learn是抽象层次很高的机器学习库,它提供了许多机器学习模型,而每个模型还有很多参数。那么问题来了,我们该怎么选择某个问题最适合使用哪个模型呢?
当然,我们一个一个尝试,或使用TPOT自动化这个过程。TPOT是基于遗传算法自动选择、优化机器学习模型和参数的工具。遗传算法常来解决优化和搜索问题,本博客就使用例子介绍一下TPOT的使用。
数据集地址:https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/
使用的数据集:breast-cancer-wisconsin.data
打开以后是这个样子:
这个东西没有列名,很难受。我直接把它全选复制到txt中,然后直接改文件后缀为csv,把文件转换为csv格式。我们给他加上
属性名如下:
好了,开始写程序:
#-*- coding: UTF-8 -*-
'''
使用TPOT自动选择scikit-learn机器学习模型和参数
'''
import numpy as np
import pandas as pd
from sklearn import model_selection
from sklearn.ensemble import RandomForestClassifier
from tpot import TPOTClassifier
inputfile='G:\PythonCode\PycharmProjects\data\\breast-cancer-wisconsin.data.csv'
def main():
df=pd.read_csv(inputfile)
#print(df.head())
df.replace('?',np.nan,inplace=True)
df.dropna(inplace=True)
df.drop(['id'],1,inplace=True)
#print(df.head())
X=np.array(df.drop(['Class'],1))
Y=np.array(df['Class'])
x_train,x_test,y_train,y_test=model_selection.train_test_split(X,Y,test_size=0.2)
tpot=TPOTClassifier(generations=6,verbosity=2)
tpot.fit(x_train,y_train)
tpot.score(x_test,y_test)
tpot.export('pipeline.py')
if __name__ == "__main__":
main()
程序运行结果如下:
Best pipeline: RandomForestClassifier(input_matrix, bootstrap=True, criterion=entropy, max_features=0.05, min_samples_leaf=3, min_samples_split=16, n_estimators=100)
可以看到我们运行的最优结果是随机森林。
下面我们跑一下随机森林:
#-*- coding: UTF-8 -*-
'''
使用TPOT自动选择scikit-learn机器学习模型和参数
'''
import numpy as np
import pandas as pd
from sklearn import model_selection
from sklearn.ensemble import RandomForestClassifier
from tpot import TPOTClassifier
inputfile='G:\PythonCode\PycharmProjects\data\\breast-cancer-wisconsin.data.csv'
def main():
df=pd.read_csv(inputfile)
#print(df.head())
df.replace('?',np.nan,inplace=True)
df.dropna(inplace=True)
df.drop(['id'],1,inplace=True)
#print(df.head())
X=np.array(df.drop(['Class'],1))
Y=np.array(df['Class'])
x_train,x_test,y_train,y_test=model_selection.train_test_split(X,Y,test_size=0.2)
# tpot=TPOTClassifier(generations=6,verbosity=2)
# tpot.fit(x_train,y_train)
# tpot.score(x_test,y_test)
# tpot.export('pipeline.py')
rfc=RandomForestClassifier(bootstrap=True, criterion='entropy', max_features=0.05, min_samples_leaf=3, min_samples_split=16, n_estimators=100)
rfc.fit(x_train,y_train)
accuracy=rfc.score(x_test,y_test)
print("accuracy:%s"%accuracy)
if __name__ == "__main__":
main()
程序运行结果:
可以看出这个tpot还是挺有用的,可以直接输出模型和参数,比较省事儿。
参考: