Python机器学习:通过scikit-learn实现集成算法
2018-01-17 16:09
766 查看
Python机器学习:通过scikit-learn实现集成算法
在现实生活中,常常采用集体智慧来解决问题。那么在机器学习中,能否将多种机器学习算法组合在一起,使计算出来的结果更好呢?这就是集成算法的思想。集成算法是提高算法准确度的有效方法之一,本文将会介绍以下几种算法:
装袋(Bagging)算法。
提升(Boosting)算法。
投票(Voting)算法。
scikit-learn是Python中开发和实践机器学习的著名类库之一,依赖于SciPy及其相关类库来运行。scikit-learn的基本功能主要分为六大部分:分类、回归、聚类、数据降维、模型选择和数据预处理。需要指出的是,由于scikit-learn本身不支持深度学习,也不支持GPU加速,因此scikit-learn对于多层感知器(MLP)神经网络的实现并不适合处理大规模问题。(scikit-learn对MLP的支持在0.18版之后增加)
scikit-learn是一个开源项目,遵守BSD协议,可以将项目应用于商业开发。目前主要由社区成员自发进行维护。可能是由于维护成本的限制,scikit-learn相比其他项目要显得更为保守,这主要体现在两个方面:
scikit-learn从来不做除机器学习领域之外的其他扩展。
scikit-learn从来不采用未经广泛验证的算法。
1 集成的方法
装袋(Bagging)算法:先将训练集分离成多个子集,然后通过各个子集训练多个模型。
提升(Boosting)算法:训练多个模型并组成一个序列,序列中的每一个模型都会修正前一个模型的错误。
投票(Voting)算法:训练多个模型,并采用样本统计来提高模型的准确度。
本文只简单地介绍一下相关的集成算法。在这里采用Pima Indians数据集,并用10折交叉验证来分离数据,再通过相应的评估矩阵来评估算法模型。
2 装袋算法
装袋决策树(Bagged Decision Trees)。
随机森林(Random Forest)。
极端随机树(Extra Trees)。
2.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, 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())
与第12章的分类与回归树的结果(0.701708817498)比较,发现结果有了很大的提升。执行结果如下:
0.770745044429
2.2 随机森林
在建立每一棵决策树的过程中,有两点需要注意:采样与完全分裂。首先是两个随机采样的过程,随机森林对输入的数据要进行行、列的采样。对于行采样采用有放回的方式,也就是在采样得到的样本集合中可能有重复的样本。假设输入样本为N个,那么采样的样本也为N个。这样在训练的时候,每一棵树的输入样本都不是全部的样本,就相对不容易出现过拟合。然后进行列采样,从M个feature中选出m个(m << M)。之后再对采样之后的数据使用完全分裂的方式建立决策树,这样决策树的某一个叶子节点要么是无法继续分裂的,要么所有样本都指向同一个分类。一般很多的决策树算法都有一个重要的步骤——剪枝,但是这里不这么做,因为之前的两个随机采样过程保证了随机性,所以不剪枝也不会出现过拟合。
这种算法得到的随机森林中的每一棵决策树都是很弱的,但是将它们组合起来就会很厉害了。我觉得可以这样比喻随机森林算法:每一棵决策树就是一个精通某一个领域的专家,这样在随机森林中就有了很多个精通不同领域的专家,对于一个新的问题(新的输入数据),可以从不同的角度去看待它,最终由各个专家投票得到结果。
这种算法在scikit-learn中的实现类是RandomForestClassifier。下面的例子是实现了100棵树的随机森林。代码如下:
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 = '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, 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())
执行结果如下:
0.77337662337
2.3 极端随机树
(1)随机森林应用的是Bagging模型,而极端随机树是使用所有的训练样本得到每棵决策树,也就是每棵决策树应用的是相同的全部训练样本。
(2)随机森林是在一个随机子集内得到最优分叉特征属性,而极端随机树是完全随机地选择分叉特征属性,从而实现对决策树进行分叉的。
它在scikit-learn中的实现类是ExtraTreesClassifier。下面的例子是实现了100棵树和7个随机特征的极端随机树。代码如下:
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 = '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, 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())
执行结果如下:
0.762987012987
3 提升算法
AdaBoost。
随机梯度提升(Stochastic Gradient Boosting)。
3.1 AdaBoost
from pandas import read_csv from sklearn.model_selection import KFold from sklearn.model_selection import cross_val_score from sklearn.ensemble import AdaBoostClassifie # 导入数据 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, 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())
执行结果如下:
0.76045796309
3.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 = '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, 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())
执行结果如下:
0.766900205058
4 投票算法
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, 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())
执行结果如下:
0.732997265892
阅读原文http://click.aliyun.com/m/40308/
相关文章推荐
- Python机器学习:通过scikit-learn实现集成算法
- 用Python Scikit-learn 实现机器学习十大算法--朴素贝叶斯算法(文末有代码)
- Python: 通过scikit-learn了解机器学习
- scikit-learn机器学习(五)--条件概率,全概率和贝叶斯定理及python实现
- scikit-learn机器学习(六)--朴素贝叶斯分类原理及python实现
- python中Scikit-Learn机器学习模块
- 机器学习——感知器算法及python实现
- Python机器学习 scikit-learn机器学习库
- python机器学习包 Windows下 pip安装 scikit-learn numpy scipy
- 机器学习经典算法详解及Python实现--基于SMO的SVM分类器
- python scikit-learn机器学习相关库
- Python语言实现机器学习的K-近邻算法
- 机器学习经典算法详解及Python实现–K近邻(KNN)算法
- 【Python】scikit-learn机器学习(一)——一元回归模型
- 【机器学习】K-近邻算法的Python实现
- python机器学习实战1:实现k-近邻算法
- 机器学习专题(一)——KNN算法的python实现
- 机器学习之朴素贝叶斯(NB)分类算法与Python实现
- scikit-learn:通过TruncatedSVD实现LSA(隐含语义分析)
- 基于 Python 和 Scikit-Learn 的机器学习介绍