有时提升一个模型的准确度很困难。你会尝试所有曾学习过的策略和算法,但模型正确率并没有改善。这时你会觉得无助和困顿,这也正是90%的数据科学家开始放弃的时候。不过,这才是考验真正本领的时候!这也是普通的数据科学家和大师级数据科学家的差距所在。
1.集成算法
三个臭皮匠,顶个诸葛亮。群体的智慧是很强大的。那么,在机器学习中能否同样采用此策略呢?答案是肯定的,就是集成算法——将多个不同算法从集成起来,使结果更优。
1.1袋装算法
袋装算法是一种提高分类准确率的算法。通过给定组合投票的方式获得最优解。比如你生病了,去个医院看了个医生,每个医生都给你开了药方,最后哪个药方的出现次数多,就说明这个药方可能是最优解。
1.1.1袋装决策树
袋装算法在数据具有很大方差时非常有效,最常见的例子就是决策树的袋装算法。
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
filename = 'pima_data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)
array = data.values
X = array[:,0:8]
Y = array[:,8]
num_folds = 10
seed = 7
kfold = KFold(n_splits=num_folds,shuffle=True,random_state=seed)
#袋装决策树
cart = DecisionTreeClassifier()
num_tree = 100
model = BaggingClassifier(base_estimator=cart,n_estimators=num_tree,random_state=seed)
result = cross_val_score(model, X, Y, cv=kfold)
print(result.mean())
0.7578263841421736
1.1.2随机森林
随机森林是由很多决策树构成的,不同决策树之间没有关联。
当我们进行分类任务时,新的输入样本进入,就让森林中的每一棵决策树分别进行判断和分类,每个决策树会得到一个自己的分类结果,决策树的分类结果中哪一个分类最多,那么随机森林就会把这个结果当做最终的结果。
from sklearn.ensemble import RandomForestClassifier
#随机森林
num_tree = 100
max_features = 3
model = RandomForestClassifier(n_estimators=num_tree,random_state=seed,max_features=max_features)
result = cross_val_score(model, X, Y, cv=kfold)
print(result.mean())
0.759107997265892
1.1.3极端随机树
极端随机数与随机森林十分相似,都是由许多决策树构成的,但它与随机森林由两个主要区别:
- 随机森林应用的是Bagging模型,而极端随机树是使用所有的训练样本得到每棵决策树,也就是每棵决策树应用的是全部训练样本。
- 随机森林是在一个随机子集内得到最优分叉特征属性,而极端随机树是完全随机地选择分叉特征属性,从而实现对决策树进行分叉。
from sklearn.ensemble import ExtraTreesClassifier
#极端随机树
num_tree = 100
max_features = 3
model = ExtraTreesClassifier(n_estimators=num_tree,random_state=seed,max_features=max_features)
result = cross_val_score(model, X, Y, cv=kfold)
print(result.mean())
0.7630211893369789
1.2提升算法
提升算法也称为boosting算法,它是将弱学习算法提升为强学习算法的一类算法,可用来提升弱分类器的准确度。
1.2.1AdaBoost
AdaBoost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import AdaBoostClassifier
filename = 'pima_data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)
array = data.values
X = array[:,0:8]
Y = array[:,8]
num_folds = 10
seed = 7
kfold = KFold(n_splits=num_folds,shuffle=True,random_state=seed)
#AdaBost
num_tree = 100
model = AdaBoostClassifier(n_estimators=num_tree,random_state=seed)
result = cross_val_score(model, X, Y, cv=kfold)
print(result.mean())
0.7578605604921395
1.2.2随机梯度提升
随机梯度提升法(GBM)的基本思想是:要找到某个函数的最大值,最好的办法就是沿着该函数的梯度方向探寻。梯度算子总是指向函数增长值最快的方向。
from sklearn.ensemble import GradientBoostingClassifier
#随机 梯度提升
num_tree = 100
model = GradientBoostingClassifier(n_estimators=num_tree,random_state=seed)
result = cross_val_score(model, X, Y, cv=kfold)
print(result.mean())
0.7591934381408066
1.3投票算法
投票算法(Voting)是一个非常简单的多个机器学习算法的集成算法。投票算法是通过创建两个或多个算法模型,利用投票算法将这些算法包装起来,计算各个子模型的平均预测情况。
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import VotingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.linear_model import LogisticRegression
filename = 'pima_data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)
array = data.values
X = array[:,0:8]
Y = array[:,8]
num_folds = 10
seed = 7
kfold = KFold(n_splits=num_folds,shuffle=True,random_state=seed)
#投票算法
models=[]
model_logistic = LogisticRegression(max_iter=3000)
model_cart = DecisionTreeClassifier()
model_svc = SVC()
models.append(('logistic',model_logistic))
models.append(('cart',model_cart))
models.append(('svc',model_svc))
ensemble_model = VotingClassifier(estimators=models)
result = cross_val_score(ensemble_model, X, Y, cv=kfold)
print(result.mean())
0.7721804511278196
2.算法调参
机器学习的模型都是参数化的,可以通过调参来提高模型的准确度。模型参数的调整应该遵循偏差和方差协调的原则。
调整算法参数是机器学习解决问题的最后一个步骤,有时也被成为超参数优化。学会调参是进行机器学习项目的前提。参数可分为两种:一种是影响模型在训练集上的准确度或防止过拟合能力的参数;另一种是不影响这两者的参数。模型在样本总体上的准确度由其在训练集上的准确度及其防止过拟合的能力共同决定,所以在调参时主要针对第一种参数进行调整,最终达到的效果是:模型在训练集上的准确度和防止过拟合能力的大和谐。
2.1网络搜索优化参数
网格搜索优化参数是一种算法参数优化的方法。它是通过遍历已定义参数的列表,来评估算法的参数,从而找到最优参数。
from pandas import read_csv
from sklearn.linear_model import Ridge
from sklearn.model_selection import GridSearchCV
#导入数据
filename = 'pima_data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)
#将数据分为输入数据和输出结果
array = data.values
X = array[:,0:8]
Y = array[:,8]
#算法实例化
model = Ridge()
#设置要遍历的参数
param_grid = {'alpha':[1,0.1,0.01,0.001,0]}
#通过网格搜索查询最优参数
grid = GridSearchCV(model, param_grid)
grid.fit(X,Y)
#搜索结果
print('max_score:%.3f'% grid.best_score_)
print('best_para:%.3f'% grid.best_estimator_.alpha)
max_score:0.276
best_para:1.000
2.2随机搜索优化参数
随机搜索优化参数是另一种对算法参数优化的方法。随机搜索优化参数通过固定次数的迭代,采用随机采样分布的方式搜索合适的参数。
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import uniform
#随即搜索优化参数
grid = RandomizedSearchCV(model, param_grid,100,random_state=7)
grid.fit(X,Y)
#搜索结果
print('max_score:%.3f'% grid.best_score_)
print('best_para:%.3f'% grid.best_estimator_.alpha)
max_score:0.276
best_para:1.000
总结
本文主要讲解了如何优化模型,包括集成算法和算法调参,这些都是在实际项目中非常有用的。
到此这篇关于Python机器学习入门(六)优化模型的文章就介绍到这了,更多相关Python机器学习内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!