在决策树算法的技术上,结合集成学习的思想,就产生了随机森林,它可以利用集成的思想(投票选择的策略)来提升决策树的分类性能,并解决了过拟合等问题。
集成学习其主要思想是利用一定的手段学习多个分类器,而且这多个分类器要求是弱分类器(分类精度较差,比随机预测略好,但准确率不太高),然后将多个分类器进行组合公共预测。核心思想就是如何训练出多个弱分类器以及如何将这些瑞分类器进行组合。目前集成学习主要有两大“派别”,一个是Boosting为代表的强依赖关系个体学习期,该方法是必须串行生成的序列化方法;另一个是以Bagging和“随机森林”为代表的算法,其个体学习器不存在强依赖关系,并能够同时生成的并行化方法。
随机森林是在决策树弱分类器的基础上进阶的一种Bagging集成学习算法。它既有样本的打乱组合,又有弱分类器下决策树生长过程中特征的打乱组合。构造随机森林的步骤:
- 利用Boostrap重抽样从原始训练样本集中生成k个样本子集。
- 利用生成的k个自助样本集生长k个决策树。
- 根据上述生成的k个决策树对测试样本集进行预测,综合每棵树的测试结果按照一定的投票机制确定最终结果。
import matplotlib.pyplot as plt #导入matplotlib库
import numpy as np #导入numpy库
import pandas as pd #导入pandas库
from sklearn import model_selection #模型比较和选择包
from sklearn.metrics import confusion_matrix #计算混淆矩阵,主要来评估分类的准确性
from sklearn.metrics import accuracy_score #计算精度得分
from sklearn.datasets import load_iris #从sklearn数据集库导入boston数据
iris=load_iris() #从读取的房价数据存储在boston变量中
X = iris.data #选取data中的RM变量
y = iris.target #设定target为y
from sklearn.model_selection import train_test_split
#以25%的数据构建测试样本,剩余作为训练样本
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state =2)
from sklearn.tree import DecisionTreeClassifier #导入决策树库
tree_ID3 = DecisionTreeClassifier(criterion='entropy')
#默认采用的是gini,即是cart算法,在这里通过entropy设置ID3算法
tree_ID3 = tree_ID3.fit(X_train, y_train) #采用ID3算法进行训练
y_pred_ID3 =tree_ID3.predict(X_test) #对测试集进行预测
accuracy_score(y_test, y_pred_ID3) #计算准确率
confusion_matrix(y_true=y_test, y_pred=y_pred_ID3) #计算混淆矩阵
from sklearn.ensemble import RandomForestClassifier #导入随机森林包
#定义一个随机森林分类器
clf = RandomForestClassifier(n_estimators=10,max_depth=None,
min_samples_split=2, random_state=0)
clf.fit(X_train, y_train) #进行训练
accuracy_score(y_test, y_pred_rf)
confusion_matrix(y_true=y_test, y_pred=y_pred_rf)
与决策树类似,随机森林也可以给出特征重要性,计算方法是将森林中所有树的特征重要性求和并取平均。一般来说,随机森林给出的特征重要性要比单棵树给出的更为可靠 。
#https://www.jianshu.com/p/1e2562f3e33b
#利用随机森林对特征重要性进行评估
importances = clf.feature_importances_
feat_labels = iris.columns[0:-1]
indices = np.argsort(importances)[::-1]
for f in range(X_train.shape[1]):
print("%2d) %-*s %f" % (f + 1, 30, feat_labels[indices[f]], importances[indices[f]]))