集成算法和算法调参

1.集成算法
三种流行的集成算法的方法:
1.装袋(Bagging)算法:先将训练集分离成多个子集,然后通过各个子集训练多个模型
2.提升(Boosting)算法:训练多个模型并组成一个序列,序列中的每一个模型都会修正前一个模型的错误。
3.投票算法:训练多个模型,并采用样本统计来提高模型的准确度

1.1装袋算法
装袋算法是一种提高分类准确率的算法,通过给定组合投票的方式获得最优解。装袋算法的三种模型:
1.装袋决策树
2.随机森林
3.极端随机树

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 = '/home/hadoop/DataSet/pima indians.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,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())

1.1.2随机森林
随机森林中需要注意的是:采样和完全分裂。首先是两个随机采样的过程,随机森林对输入的数据要进行行,列的采样。对于行采样采用有放回的方式,也就是在采样得到的样本集合中可能有重复的样本。假设输入样本为N个,那么采样的样本也为N个。这样在训练的时候,每一棵树的输入样本都不是全部的样本,就相对不容易出现过拟合。然后进行列采样,从M个特征中选出m个,之后再对采样之后的数据使用完全分裂的方式建立决策树,这样决策树的某一个叶子节点要么是无法继续分裂的,要么所有样本都指向同一个分类。一般很多的决策树算法都有一个重要的步骤——剪枝,但是这里不这么做,因为之前的两个随机采样过程保证了随机性,所以不剪枝也不会出现过拟合。

这种算法得到的随机森林中的每一颗树都是很弱的,但是将它们组合起来效果很好。

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier
#导入数据
filename = '/home/hadoop/DataSet/pima indians.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,random_state=seed)
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())

1.1.3极端随机树
极端随机树与随机森林十分相似,都是由许多决策树构成。但它与随机森林有两个主要的区别:
(1)随机森林应用的是Bagging模型,而极端随机树是使用所有的训练样本得到每棵随机数,也就是每棵决策树应用的是相同的全部训练样本。
(2)随机森林是在一个随机子集内得到最优分叉特征属性,而极端随机树是完全随机地选择分叉特征属性,从而实现对决策树进行分叉的。

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import ExtraTreesClassifier
#导入数据
filename = '/home/hadoop/DataSet/pima indians.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,random_state=seed)
num_tree = 100
max_features = 7
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())

1.2提升算法
提升算法是一种用来提高弱分类算法准确度地方法,这种方法先构造一个预测函数系列,然后以一定的方式将它们组成为一个预测函数。提升算法也是一种提高任意给定学习算法准确度的方法,它是一种集成算法,主要通过对样本集的操作获得样本子集,然后用弱分类算法在样本子集上训练生成一系列的基分类器。它可以用来提高其他弱分类算法的识别率,也就是将其他的弱分类算法作为基分类算法放在提升框架中,通过提升框架对训练样本集的操作,得到不同的训练样本集,再用该样本子集去训练生成基分类器。每得到一个样本集就用该基分类算法在该样本集上产生一个基分类器,这样在给定训练轮数n后,就可产生n个基分类器,然后提升算法将这n个基分类器进行加权融合,产生最后的结果分类器。在这n个基分类器中,每个分类器的识别率不一定很高,但他们联合后的结果有很高的识别率,这样便提高了弱分类算法的识别率。常用的用于机器学习的提升算法有:
1.AdaBoost
2.随机梯度提升

1.2.1AdaBoost
AdaBoost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器。其算法本身是通过改变数据分布来实现的,它根据每次训练集中每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值。它将修改过权值的新数据集送给下层分类器进行训练,再将每次训练的得到的分类器融合起来,作为最后的决策分类器。使用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 = '/home/hadoop/DataSet/pima indians.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,random_state=seed)
num_tree = 30
model = AdaBoostClassifier(n_estimators=num_tree,random_state=seed)
result = cross_val_score(model,X,Y,cv=kfold)
print(result.mean())

1.2.2随机梯度提升
随机梯度提升法基于的思想是:要找到某个函数的最大值,最好的办法就是沿着该函数的梯度方向探寻。梯度算子总是指向函数值增长最快的方向。由于梯度提升算法在每次更新数据集时都需要遍历整个数据集,计算复杂度较高,于是有了随机梯度提升算法,该算法一次只用一个样本点来更新回归系数,极大地改善了算法地计算复杂度。

from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import GradientBoostingClassifier
#导入数据
filename = '/home/hadoop/DataSet/pima indians.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,random_state=seed)
num_tree = 100
model = GradientBoostingClassifier(n_estimators=num_tree,random_state=seed)
result = cross_val_score(model,X,Y,cv=kfold)
print(result.mean())

1.3投票算法
投票算法是一个非常简单地多个机器学习算法的集成算法。投票算法是通过创建两个或多个算法模型,利用投票算法将这些算法包装起来,计算各个子模型的平均预测状况。在实际的应用中,可以对每个子模型的预测结果增加权重,以提高算法的准确度。

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 = '/home/hadoop/DataSet/pima indians.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,random_state=seed)
cart = DecisionTreeClassifier()
models = []
model_logistic = LogisticRegression()
models.append(('logistic',model_logistic))
model_cart = DecisionTreeClassifier()
models.append(('cart',model_cart))
model_svc = SVC()
models.append(('svm',model_svc))
ensemble_model = VotingClassifier(estimators=models)
result = cross_val_score(ensemble_model,X,Y,cv=kfold)
print(result.mean())

2.算法调参
a.调整参数对机器学习算法的重要性。
b.如何使用网格搜索优化参数
c.如何使用随机搜索优化参数

2.1机器学习算法调参
调整算法参数是采用机器学习解决问题的最后一个步骤,有时也被称为超参数优化。学会调参是进行机器学习项目的前提。参数分为两种:一种是影响模型在训练集上的准确度或防止过拟合能力的参数;另外一种是不影响这两者的参数。模型在样本总体上的准确度由其在训练集上的准确度及其防治过拟合的能力共同决定,所以在调参时候主要针对第一种参数进行调整,最终达到的效果是:模型在训练集上的准确度和防止过拟合能力的大和谐。两种自动寻找最优化参数的算法:a.网格搜索优化算法 b.随机搜索优化算法

2.1.1网格搜索优化参数
网格搜索优化参数是一种算法参数优化的方法。它是通过遍历已定义参数的列表,来评估算法的参数,从而找到最优参数。网格搜索优化参数适用于三四个(或更少)的超参数(当超参数的数量增加时,网格搜索的计算复杂度会呈现指数型增长,这时要换用随机搜索),当用户列出一个较小的超参数值域,这些超参数值域的笛卡尔集(排列组合)为一组组超参数。网格搜索算法使用每组超参数训练模型,并挑选验证集误差最小的超参数组合。

from pandas import read_csv
from sklearn.linear_model import Ridge
from sklearn.model_selection import GridSearchCV
#导入数据
filename = '/home/hadoop/DataSet/pima indians.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(estimator=model,param_grid=param_grid)
grid.fit(X,Y)
#搜索结果
print(grid.best_score_)
print(grid.best_estimator_.alpha)

2.1.2随机搜索优化参数
随机搜索优化参数是另一种对算法参数优化的方法。随机搜索优化参数通过固定次数的迭代,采用随机采样分布的方式搜索合适的参数。与网格搜索优化参数相比,随机搜索优化参数提供了一种更高效的解决办法(特别是在参数数量多的情况下),随机搜索优化参数为每个参数定义了一个分布函数,并在该空间中采样。

from pandas import read_csv
from sklearn.linear_model import Ridge
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import uniform
#导入数据
filename = '/home/hadoop/DataSet/pima indians.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':uniform()}
#通过网格搜过查询最优参数
grid = RandomizedSearchCV(estimator=model,param_distributions=param_grid,n_iter=100,random_state=7)
grid.fit(X,Y)
#搜索结果
print(grid.best_score_)
print(grid.best_estimator_.alpha)
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值