公号:码农充电站pro
主页:https://codeshellme.github.iohtml
本篇文章来介绍随机森林(RandomForest)算法。node
在前边的文章《AdaBoost 算法-分析波士顿房价数据集》中,咱们介绍过集成算法。集成算法中有一类算法叫作 bagging 算法。python
bagging 算法是将一个原始数据集随机抽样成 N 个新的数据集。而后将这 N 个新的数据集做用于同一个机器学习算法,从而获得 N 个模型,最终集成一个综合模型。git
在对新的数据进行预测时,须要通过这 N 个模型(每一个模型互不依赖干扰)的预测(投票),最终综合 N 个投票结果,来造成最后的预测结果。github
bagging 算法的流程可用下图来表示:算法
随机森林算法是 bagging 算法中比较出名的一种。shell
随机森林算法由多个决策树分类器组成,每个子分类器都是一棵 CART 分类回归树,因此随机森林既能够作分类,又能够作回归。bootstrap
当随机森林算法处理分类问题的时候,分类的最终结果是由全部的子分类器投票而成,投票最多的那个结果就是最终的分类结果。dom
当随机森林算法处理回归问题的时候,最终的结果是每棵 CART 树的回归结果的平均值。机器学习
sklearn 库即实现了随机森林分类树,又实现了随机森林回归树:
RandomForestClassifier 类的原型以下:
RandomForestClassifier(n_estimators=100, criterion='gini', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features='auto', max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, bootstrap=True, oob_score=False, n_jobs=None, random_state=None, verbose=0, warm_start=False, class_weight=None, ccp_alpha=0.0, max_samples=None)
能够看到分类树的参数特别多,咱们来介绍几个重要的参数:
RandomForestRegressor 类的原型以下:
RandomForestRegressor(n_estimators=100, criterion='mse', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features='auto', max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, bootstrap=True, oob_score=False, n_jobs=None, random_state=None, verbose=0, warm_start=False, ccp_alpha=0.0, max_samples=None)
回归树中的参数与分类树中的参数基本相同,但 criterion 参数的取值不一样。
在回归树中,criterion 参数有下面两种取值:
下面使用随机森林分类树来处理鸢尾花数据集,该数据集在《决策树算法-实战篇》中介绍过,这里再也不介绍,咱们直接使用它。
首先加载数据集:
from sklearn.datasets import load_iris iris = load_iris() # 准备数据集 features = iris.data # 获取特征集 labels = iris.target # 获取目标集
将数据分红训练集和测试集:
from sklearn.model_selection import train_test_split train_features, test_features, train_labels, test_labels = train_test_split(features, labels, test_size=0.33, random_state=0)
接下来构造随机森林分类树:
from sklearn.ensemble import RandomForestClassifier # 这里均使用默认参数 rfc = RandomForestClassifier() # 训练模型 rfc.fit(train_features, train_labels)
estimators_
属性中存储了训练出来的全部的子分类器,来看下子分类器的个数:
>>> len(rfc.estimators_) 100
预测数据:
test_predict = rfc.predict(test_features)
测试准确率:
>>> from sklearn.metrics import accuracy_score >>> accuracy_score(test_labels, test_predict) 0.96
在机器学习算法模型中,通常都有不少参数,每一个参数都有不一样的取值。如何才能让模型达到最好的效果呢?这就须要参数调优。
sklearn 库中有一个 GridSearchCV 类,能够帮助咱们进行参数调优。
咱们只要告诉它想要调优的参数有哪些,以及参数的取值范围,它就会把全部的状况都跑一遍,而后告诉咱们参数的最优取值。
先来看下 GridSearchCV 类的原型:
GridSearchCV(estimator, param_grid, scoring=None, n_jobs=None, refit=True, cv=None, verbose=0, pre_dispatch='2*n_jobs', error_score=nan, return_train_score=False)
其中有几个重要的参数:
下面咱们对随机森林分类树进行参数调优,仍是使用鸢尾花数据集。
首先载入数据:
from sklearn.datasets import load_iris iris = load_iris()
构造分类树:
from sklearn.ensemble import RandomForestClassifier rfc = RandomForestClassifier()
若是咱们要对分类树的 n_estimators
参数进行调优,调优的范围是 [1, 10]
,则准备变量:
param = {"n_estimators": range(1,11)}
建立 GridSearchCV 对象,并调优:
from sklearn.model_selection import GridSearchCV gs = GridSearchCV(estimator=rfc, param_grid=param) # 对iris数据集进行分类 gs.fit(iris.data, iris.target)
输出最优准确率和最优参数:
>>> gs.best_score_ 0.9666666666666668 >>> gs.best_params_ {'n_estimators': 7}
能够看到,最优的结果是 n_estimators
取 7,也就是随机森林的子决策树的个数是 7 时,随机森林的准确度最高,为 0.9667。
本篇文章主要介绍了随机森林算法的原理及应用,并展现了如何使用 GridSearchCV 进行参数调优。
(本节完。)
推荐阅读:
欢迎关注做者公众号,获取更多技术干货。