实验目的

学习sklearn模块中的随机森林Random Forest算法

实验原理

决策树:

常用的决策树算法有ID3,C4.5,CART三种。3种算法的模型构建思想都十分类似,只是采用了不同的指标。决策树模型的构建过程大致如下:
ID3,C4.5决策树的生成
输入:训练集D,特征集A,阈值eps 输出:决策树T
若D中所有样本属于同一类Ck,则T为单节点树,将类Ck作为该结点的类标记,返回T
若A为空集,即没有特征作为划分依据,则T为单节点树,并将D中实例数最大的类Ck作为该结点的类标记,返回T
否则,计算A中各特征对D的信息增益(ID3)/信息增益比(C4.5),选择信息增益最大的特征Ag
若Ag的信息增益(比)小于阈值eps,则置T为单节点树,并将D中实例数最大的类Ck作为该结点的类标记,返回T
否则,依照特征Ag将D划分为若干非空子集Di,将Di中实例数最大的类作为标记,构建子节点,由结点及其子节点构成树T,返回T
对第i个子节点,以Di为训练集,以A-{Ag}为特征集,递归地调用1~5,得到子树Ti,返回Ti

CART决策树的生成

这里只简单介绍下CART与ID3和C4.5的区别。
1.CART树是二叉树,而ID3和C4.5可以是多叉树
2.CART在生成子树时,是选择一个特征一个取值作为切分点,生成两个子树
3.选择特征和切分点的依据是基尼指数,选择基尼指数最小的特征及切分点生成子树

随机森林(Random Forests):

随机森林是一种重要的基于Bagging的集成学习方法,可以用来做分类、回归等问题。

随机森林有许多优点:

1.具有极高的准确率
2.随机性的引入,使得随机森林不容易过拟合
3.随机性的引入,使得随机森林有很好的抗噪声能力
4.能处理很高维度的数据,并且不用做特征选择
5.既能处理离散型数据,也能处理连续型数据,数据集无需规范化
6.训练速度快,可以得到变量重要性排序
7.容易实现并行化

随机森林的缺点:

1.当随机森林中的决策树个数很多时,训练时需要的空间和时间会较大
2.随机森林模型还有许多不好解释的地方,有点算个黑盒模型
与上面介绍的Bagging过程相似,随机森林的构建过程大致如下:
1.从原始训练集中使用Bootstraping方法随机有放回采样选出m个样本,共进行n_tree次采样,生成n_tree个训练集
2.对于n_tree个训练集,我们分别训练n_tree个决策树模型
3.对于单个决策树模型,假设训练样本特征的个数为n,那么每次分裂时根据信息增益/信息增益比/基尼指数选择最好的特征进行分裂
4.每棵树都一直这样分裂下去,直到该节点的所有训练样例都属于同一类。在决策树的分裂过程中不需要剪枝
5.将生成的多棵决策树组成随机森林。对于分类问题,按多棵树分类器投票决定最终分类结果;对于回归问题,由多棵树预测值的均值决定最终预测结果

实验环境

2.开启jupyter notebook

  1. cd /data
  2. jupyter notebook —ip=’127.0.0.1’

3.创建一个 .ipynb文件
1.8 机器学习——Random Forest算法 - 图1

决策树

4.导入相关模块

  1. %matplotlib inline
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. import seaborn as sns;sns.set()
  5. from matplotlib.font_manager import FontProperties
  6. #设置字体为微软雅黑,大小为15
  7. font = FontProperties(fname = r'/data/msyh.ttf',size=15)

生成实验数据

5.导入sklearn模块中的make_blobs函数

1.8 机器学习——Random Forest算法 - 图2
make_blobs函数参数解释如下:
1.8 机器学习——Random Forest算法 - 图3

决策树分类

6.导入sklearn模块中的DecisionTreeClassifier函数,并使用.fit()方法进行模型拟合

  1. from sklearn.tree import DecisionTreeClassifier
  2. tree=DecisionTreeClassifier().fit(X,y)

7.创建visualize_classifier辅助函数,帮助我们展示分类器的输出:

  1. def visualize_classifier(model,X,y,ax=None,cmap="rainbow"):
  2. ax=ax or plt.gca() #获得子图
  3. #绘制训练点
  4. ax.scatter(X[:,0],X[:,1],c=y,s=30,cmap=cmap,clim=(y.min(),y.max()),zorder=3)
  5. ax.axis("tight")
  6. ax.axis("off")
  7. xlim=ax.get_xlim()
  8. ylim=ax.get_ylim()
  9. #模型拟合
  10. model.fit(X,y)
  11. xx,yy=np.meshgrid(np.linspace(*xlim,num=200),
  12. np.linspace(*ylim,num=200))
  13. Z=model.predict(np.c_[xx.ravel(),yy.ravel()]).reshape(xx.shape)
  14. #使用结果创建彩虹图
  15. n_classes=len(np.unique(y))
  16. contours=ax.contourf(xx,yy,Z,alpha=0.3,
  17. levels=np.arange(n_classes+1)-0.5,
  18. cmap=cmap,clim=(y.min(),y.max()),
  19. zorder=1
  20. )
  21. ax.set(xlim=xlim,ylim=ylim)

8.输出决策树

1.8 机器学习——Random Forest算法 - 图4

随机森林

9.多个过拟合模型可以组合,来减少这种过拟合的影响 - 是一种称为装袋的组合方法。 这个方法使用了一组并行模型,每个都对数据过拟合,并对结果进行平均以找到更好的分类。 随机决策树的一个组合被称为随机森林。

1.8 机器学习——Random Forest算法 - 图5
在上面例子中,我们将每个估计器拟合训练点的 80% 随机子集进行来随机化数据。 在实践中,通过在选择分割的方式中添加一些随机性,来更有效地随机化决策树:这样,所有数据每次都有助于拟合,但是拟合的结果仍然具有所需的随机性。 例如,当确定要分割的特征时,随机化树可以从前几个特征中选择。

随机森林分类

10.导入sklearn.ensemble模块中的RandomForestClassifier函数,对模型随机扰动的取平均

1.8 机器学习——Random Forest算法 - 图6
通过对超过 100 个随机扰动的模型取平均,最终得到一个整体模型

随机森林回归

11.随机森林也可以用于回归(即连续而不是分类变量)。 导入sklearn模块中的RandomForestRegressor函数。

  1. from sklearn.model_selection import train_test_split
  2. from sklearn.preprocessing import StandardScaler
  3. from sklearn.ensemble import RandomForestRegressor
  4. from sklearn.metrics import r2_score,mean_squared_error,mean_absolute_error
  5. import numpy as np

12.导入sklearn.datasets模块中的load_boston函数

1.8 机器学习——Random Forest算法 - 图7
从上述结果可以看出,共506条波士顿地区房价信息,每条13项数值特征描述目标房价

13.查看数据的差异情况

1.8 机器学习——Random Forest算法 - 图8

14.随机采样25%作为测试 75%作为训练

  1. x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.25,random_state=33)

15.训练数据和测试数据进行标准化处理

  1. ss_x = StandardScaler()
  2. x_train = ss_x.fit_transform(x_train)
  3. x_test = ss_x.transform(x_test)
  4. ss_y = StandardScaler()
  5. y_train = ss_y.fit_transform(y_train.reshape(-1,1))
  6. y_test = ss_y.transform(y_test.reshape(-1,1))

16.用随机森林回归模型进行回归预测

1.8 机器学习——Random Forest算法 - 图9
1.8 机器学习——Random Forest算法 - 图10

17.读取/data目录下的wine.csv文件

1.8 机器学习——Random Forest算法 - 图11

18.实例化x值和y值

  1. y = df_wine['Class label'].values
  2. X = df_wine.values[:,1:]

这里[:,1:]形如X[:, m:n],即取所有数据的第m到n-1列数据,含左不含右。
现对[:,1:]进行举例解释,如下所示:
1.8 机器学习——Random Forest算法 - 图12

19.导入sklearn模块,利用train_test_split函数划分训练集和测试集

1.8 机器学习——Random Forest算法 - 图13

20.导入sklearn模块中的RandomForestClassifier函数

  1. from sklearn.ensemble import RandomForestClassifier
  2. rf = RandomForestClassifier(n_estimators=1000,criterion='gini',max_features='sqrt',
  3. max_depth=None,min_samples_split=2,bootstrap=True,n_jobs=1,random_state=1)
  4. #度量随机森林的准确性
  5. rf=rf.fit(X_train,y_train)
  6. y_train_pred = rf.predict(X_train)
  7. y_test_pred = rf.predict(X_test)

参数解释如下:
n_estimators:integer, optional (default=10) 指森林中树的个数
criterion:string, optional (default=”gini”) 用于衡量分类的质量。支持的规则有gini和entropy。其中gini用gini不纯度来衡量,基尼不纯度(Gini impurity),度量一个集合中每种类型的比例。entropy用信息增益来度量。
max_features:int, float, string or None, optional (default=”auto”)
寻找最佳分类是需要考虑的属性的数目。
max_depth:integer or None, optional (default=None)指树的最大深度。当max_leaf_nodes非空时忽略此属性。
min_samples_split:integer, optional (default=2)分裂一个内部节点所需的最少样本数。
bootstrap:boolean, optional (default=True)在构建树的过程中是否需要辅助样本,布尔型
n_jobs:integer, optional (default=1)拟合(fit)和预测(predict)时并行运行的job数目,当设置为-1时,job数被设置为核心(core)数。
random_state:int, RandomState instance or None, optional (default=None)
If int, random_state is the seed used by the random number generator; If RandomState instance, random_state is the random number generator; If None, the random number generator is the RandomState instance used by np.random.

21.导入sklearn.metrics模块中的accuracy_score函数,对模型进行评估

1.8 机器学习——Random Forest算法 - 图14
至此,实验结束!