网站建设推广优化话术,太原网络搭建,html网站制作模板,广州网站建设加q.479185700有时提升一个模型的准确度很困难。如果你曾纠结于类似的问题#xff0c;那 我相信你会同意我的看法。你会尝试所有曾学习过的策略和算法#xff0c;但模型正确率并没有改善。这时你会觉得无助和困顿#xff0c;这也是 90%的数据科学家开始放弃的时候。不过#xff0c;这才是… 有时提升一个模型的准确度很困难。如果你曾纠结于类似的问题那 我相信你会同意我的看法。你会尝试所有曾学习过的策略和算法但模型正确率并没有改善。这时你会觉得无助和困顿这也是 90%的数据科学家开始放弃的时候。不过这才是考验真本领的时候这也是普通的数据科学家和大师级数据科学家的差距所在。 前面介绍了一系列算法每种算法都有不同的适用范围。在现实生活中常常采用集体智慧来解决问题。那么在机器学习中能否将多种机器学习算法组合在一起使计算出来的结果更好呢这就是集成算法的思想。
集成算法是提高算法准确度的有效方法之一本节就介绍如何通过scikit-learn来实现集成算法。
本节将会介绍以下几种算法
装袋Bagging算法。提升Boosting算法。投票Voting算法。
集成的方法
下面是三种流行的集成算法的方法。
装袋Bagging算法先将训练集分离成多个子集然后通过各个子集训练多个模型。提升Boosting算法训练多个模型并组成一个序列序列中的每一个模型都会修正前一个模型的错误。投票Voting算法训练多个模型并采用样本统计来提高模型的准确度。
在这里采用Pima Indians数据集并用10折交叉验证来分离数据再通过相应的评估矩阵来评估算法模型。
装袋算法是一种提高分类准确率的算法通过给定组合投票的方式获得最优解。比如你生病了去n个医院看了n个医生每个医生都给你开了药方最后哪个药方的出现次数多就说明这个药方越有可能是最优解这很好理解这也是装袋算法的思想。
下面将介绍三种装袋模型
装袋决策树Bagged Decision Trees。随机森林Random Forest。极端随机树Extra Trees。
装袋决策树
装袋算法在数据具有很大的方差时非常有效最常见的例子就是决策树的装袋算法。下面将在scikit-learn中通过BaggingClassifier实现分类与回归树算法。
本例中创建了100棵决策树代码如下 import pandas as pd
from sklearn.ensemble import BaggingClassifierfrom sklearn.model_selection import cross_val_score, KFold
from sklearn.tree import DecisionTreeClassifier#数据预处理
path D:\down\\archive\\diabetes.csv
data pd.read_csv(path)#将数据转成数组
array data.values
#分割数据去掉最后一个标签
X array[:, 0:8]Y array[:, 8]num_folds 10
seed 7
kflod KFold(n_splitsnum_folds, random_stateseed, shuffleTrue)
#决策树
cart DecisionTreeClassifier()num_trees 100model BaggingClassifier(base_estimatorcart, n_estimatorsnum_trees, random_stateseed)result cross_val_score(model, X, Y, cvkflod)print(算法评估结果%.3f (%.3f) % (result.mean(), result.std()))运行结果
算法评估结果0.758 (0.039)与前几节的分类与回归树的结果0.701708817498比较发现结果有了很大的提升。 随机森林 顾名思义随机森林是用随机的方式建立一个森林森林由很多的决策树组成而且每一棵决策树之间是没有关联的。得到森林之后当有一个新的输入样本进入的时候就让森林中的每一棵决策树分别进行判断看看这个样本应该属于哪一类再看看哪一类被选择最多就预测这个样本为哪一类。 在建立每一棵决策树的过程中有两点需要注意采样与完全分裂。首先是两个随机采样的过程随机森林对输入的数据要进行行、列的采样。对于行采样采用有放回的方式也就是在采样得到的样本集合中可能有重复的样本。
假设输入样本为N个那么采样的样本也为 N 个。这样在训练的时候每一棵树的输入样本都不是全部的样本就相对不容易出现过拟合。然后进行列采样从M个feature中选出m个mM。之后再对采样之后的数据使用完全分裂的方式建立决策树这样决策树的某一个叶子节点要么是无法继续分裂的要么所有样本都指向同一个分类。一般很多的决策树算法都有一个重要的步骤——剪枝但是这里不这么做因为之前的两个随机采样过程保证了随机性所以不剪枝也不会出现过拟合。
这种算法得到的随机森林中的每一棵决策树都是很弱的但是将它们组合起来就会很厉害了。我觉得可以这样比喻随机森林算法每一棵决策树就是一个精通某一个领域的专家这样在随机森林中就有了很多个精通不同领域的专家对于一个新的问题新的输入数据可以从不同的角度去看待它最终由各个专家投票得到结果。
这种算法在scikit-learn中的实现类是RandomForestClassifier。下面的例子是实现了100棵树的随机森林。
代码如下 import pandas as pd
from sklearn.ensemble import BaggingClassifier, RandomForestClassifierfrom sklearn.model_selection import cross_val_score, KFold#数据预处理
path D:\down\\archive\\diabetes.csv
data pd.read_csv(path)#将数据转成数组
array data.values
#分割数据去掉最后一个标签
X array[:, 0:8]Y array[:, 8]num_folds 10
seed 7
#
kflod KFold(n_splitsnum_folds, random_stateseed, shuffleTrue)num_tree 100max_features 3model RandomForestClassifier(n_estimatorsnum_tree, max_featuresmax_features)result cross_val_score(model, X, Y, cvkflod)print(算法评估结果%.3f (%.3f) % (result.mean(), result.std()))算法评估结果0.777 (0.059)极端随机树
极端随机树是由PierreGeurts等人于2006年提出的它与随机森林十分相似都是由许多决策树构成。
但它与随机森林有两个主要的区别
1随机森林应用的是 Bagging 模型而极端随机树是使用所有的训练样本得到每棵决策树也就是每棵决策树应用的是相同的全部训练样本。
2随机森林是在一个随机子集内得到最优分叉特征属性而极端随机树是完全随机地选择分叉特征属性从而实现对决策树进行分叉的。它在scikit-learn中的实现类是ExtraTreesClassifier。下面的例子是实现了100棵树和7个随机特征的极端随机树。
代码如下 import pandas as pd
from sklearn.ensemble import BaggingClassifier, RandomForestClassifier, ExtraTreesClassifierfrom sklearn.model_selection import cross_val_score, KFold#数据预处理
path D:\down\\archive\\diabetes.csv
data pd.read_csv(path)#将数据转成数组
array data.values
#分割数据去掉最后一个标签
X array[:, 0:8]Y array[:, 8]num_folds 10
seed 7
#
kflod KFold(n_splitsnum_folds, random_stateseed, shuffleTrue)num_tree 100max_features 7model ExtraTreesClassifier(n_estimatorsnum_tree, max_featuresmax_features)result cross_val_score(model, X, Y, cvkflod)print(算法评估结果%.3f (%.3f) % (result.mean(), result.std()))运行结果
算法评估结果0.764 (0.056)提升算法 提升算法是一种用来提高弱分类算法准确度的方法这种方法先构造一个预测函数系列然后以一定的方式将它们组合成一个预测函数。提升算法也是一种提高任意给定学习算法准确度的方法它是一种集成算法主要通过对样本集的操作获得样本子集然后用弱分类算法在样本子集上训练生成一系列的基分类器。 它可以用来提高其他弱分类算法的识别率也就是将其他的弱分类算法作为基分类算法放于提升框架中通过提升框架对训练样本集的操作得到不同的训练样本子集再用该样本子集去训练生成基分类器。每得到一个样本集就用该基分类算法在该样本集上产生一个基分类器这样在给定训练轮数n后就可产生n个基分类器然后提升算法将这n个基分类器进行加权融合产生最后的结果分类器。在这n个基分类器中每个分类器的识别率不一定很高但它们联合后的结果有很高的识别率这样便提高了弱分类算法的识别率。下面是两个非常常见的用于机器学习的提升算法
AdaBoost.随机梯度提升Stochastic Gradient Boosting。
AdaBoost
AdaBoost是一种迭代算法其核心思想是针对同一个训练集训练不同的分类器弱分类器然后把这些弱分类器集合起来构成一个更强的最终分类器强分类器。其算法本身是通过改变数据分布来实现的它根据每次训练集中每个样本的分类是否正确以及上次的总体分类的准确率来确定每个样本的权值。它将修改过权值的新数据集送给下层分类器进行训练再将每次训练得到的分类器融合起来作为最后的决策分类器。使用AdaBoost分类器可以排除一些不必要的训练数据特征并放在关键的训练数据上面。
在scikit-learn中的实现类是AdaBoostClassifier。
代码如下 import pandas as pd
from sklearn.ensemble import BaggingClassifier, RandomForestClassifier, ExtraTreesClassifier, AdaBoostClassifierfrom sklearn.model_selection import cross_val_score, KFold#数据预处理
path D:\down\\archive\\diabetes.csv
data pd.read_csv(path)#将数据转成数组
array data.values
#分割数据去掉最后一个标签
X array[:, 0:8]Y array[:, 8]num_folds 10
seed 7
#
kflod KFold(n_splitsnum_folds, random_stateseed, shuffleTrue)num_tree 30model AdaBoostClassifier(n_estimatorsnum_tree, random_stateseed)result cross_val_score(model, X, Y, cvkflod)print(算法评估结果%.3f (%.3f) % (result.mean(), result.std()))
运行结果
算法评估结果0.755 (0.037)随机梯度提升
随机梯度提升法GBM基于的思想是要找到某个函数的最大值最好的办法就是沿着该函数的梯度方向探寻。梯度算子总是指向函数值增长最快的方向。由于梯度提升算法在每次更新数据集时都需要遍历整个数据集计算复杂度较高于是有了一个改进算法——随机梯度提升算法该算法一次只用一个样本点来更新回归系数极大地改善了算法的计算复杂度。
在 scikit-learn中的实现类是 GradientBoostingClassifier。
代码如下 import pandas as pd
from sklearn.ensemble import BaggingClassifier, RandomForestClassifier, ExtraTreesClassifier, AdaBoostClassifier, \GradientBoostingClassifierfrom sklearn.model_selection import cross_val_score, KFold#数据预处理
path D:\down\\archive\\diabetes.csv
data pd.read_csv(path)#将数据转成数组
array data.values
#分割数据去掉最后一个标签
X array[:, 0:8]Y array[:, 8]num_folds 10
seed 7
#
kflod KFold(n_splitsnum_folds, random_stateseed, shuffleTrue)num_tree 100model GradientBoostingClassifier(n_estimatorsnum_tree, random_stateseed)result cross_val_score(model, X, Y, cvkflod)print(算法评估结果%.3f (%.3f) % (result.mean(), result.std()))
运行结果:
算法评估结果0.758 (0.056)投票算法
投票算法Voting是一个非常简单的多个机器学习算法的集成算 法。投票算法是通过创建两个或多个算法模型利用投票算法将这些算法包装起来计算各个子模型的平均预测状况。在实际的应用中可以对每个子模型的预测结果增加权重以提高算法的准确度。但是在scikit-learn中不提供加权算法。下面通过一个例子来展示在scikit-learn中如何实现一个投票算法。
在scikit-learn中的实现类是VotingClassifier。
代码如下 import pandas as pd
from sklearn.ensemble import BaggingClassifier, RandomForestClassifier, ExtraTreesClassifier, AdaBoostClassifier, \GradientBoostingClassifier, VotingClassifier
from sklearn.linear_model import LogisticRegressionfrom sklearn.model_selection import cross_val_score, KFold
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier#数据预处理
path D:\down\\archive\\diabetes.csv
data pd.read_csv(path)#将数据转成数组
array data.values
#分割数据去掉最后一个标签
X array[:, 0:8]Y array[:, 8]num_folds 10
seed 7
#
kflod KFold(n_splitsnum_folds, random_stateseed, shuffleTrue)cart DecisionTreeClassifier()models []model_logistic LogisticRegression()
models.append((logistic, model_logistic))model_cart DecisionTreeClassifier()
models.append((cart, model_cart))model_svm SVC()
models.append((svm, model_svm))ensemble_model VotingClassifier(estimatorsmodels)result cross_val_score(ensemble_model, X, Y, cvkflod)print(算法评估结果%.3f (%.3f) % (result.mean(), result.std()))
运行结果
算法评估结果0.767 (0.047)本节介绍了三种提高算法准确度的集成算法下一节将会介绍另外一种提升算法准确度的方法——算法调参。