- 实验目的
- 实验原理
- 实验环境
- 实验内容
- 实验步骤
- 决策树
- 生成实验数据
- 决策树分类
- 随机森林
- 随机森林分类
- 随机森林回归
- 11.随机森林也可以用于回归(即连续而不是分类变量)。 导入sklearn模块中的RandomForestRegressor函数。
- 12.导入sklearn.datasets模块中的load_boston函数
- 13.查看数据的差异情况
- 14.随机采样25%作为测试 75%作为训练
- 15.训练数据和测试数据进行标准化处理
- 16.用随机森林回归模型进行回归预测
- 17.读取/data目录下的wine.csv文件
- 18.实例化x值和y值
- 19.导入sklearn模块,利用train_test_split函数划分训练集和测试集
- 20.导入sklearn模块中的RandomForestClassifier函数
- 21.导入sklearn.metrics模块中的accuracy_score函数,对模型进行评估
实验目的
学习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.将生成的多棵决策树组成随机森林。对于分类问题,按多棵树分类器投票决定最终分类结果;对于回归问题,由多棵树预测值的均值决定最终预测结果
实验环境
- Linux Ubuntu 16.04
- Python 3.6
- Anaconda 4
- IPython Notebook
实验内容
了解决策树的生成,随机森林的优缺点以及随机森林的分类与回归实验步骤
1.打开终端模拟器,切换到/data目录下,使用wget命令下载实验数据
2.开启jupyter notebook
- cd /data
- jupyter notebook —ip=’127.0.0.1’
决策树
4.导入相关模块
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns;sns.set()
from matplotlib.font_manager import FontProperties
#设置字体为微软雅黑,大小为15
font = FontProperties(fname = r'/data/msyh.ttf',size=15)
生成实验数据
5.导入sklearn模块中的make_blobs函数
决策树分类
6.导入sklearn模块中的DecisionTreeClassifier函数,并使用.fit()方法进行模型拟合
from sklearn.tree import DecisionTreeClassifier
tree=DecisionTreeClassifier().fit(X,y)
7.创建visualize_classifier辅助函数,帮助我们展示分类器的输出:
def visualize_classifier(model,X,y,ax=None,cmap="rainbow"):
ax=ax or plt.gca() #获得子图
#绘制训练点
ax.scatter(X[:,0],X[:,1],c=y,s=30,cmap=cmap,clim=(y.min(),y.max()),zorder=3)
ax.axis("tight")
ax.axis("off")
xlim=ax.get_xlim()
ylim=ax.get_ylim()
#模型拟合
model.fit(X,y)
xx,yy=np.meshgrid(np.linspace(*xlim,num=200),
np.linspace(*ylim,num=200))
Z=model.predict(np.c_[xx.ravel(),yy.ravel()]).reshape(xx.shape)
#使用结果创建彩虹图
n_classes=len(np.unique(y))
contours=ax.contourf(xx,yy,Z,alpha=0.3,
levels=np.arange(n_classes+1)-0.5,
cmap=cmap,clim=(y.min(),y.max()),
zorder=1
)
ax.set(xlim=xlim,ylim=ylim)
8.输出决策树
随机森林
9.多个过拟合模型可以组合,来减少这种过拟合的影响 - 是一种称为装袋的组合方法。 这个方法使用了一组并行模型,每个都对数据过拟合,并对结果进行平均以找到更好的分类。 随机决策树的一个组合被称为随机森林。
在上面例子中,我们将每个估计器拟合训练点的 80% 随机子集进行来随机化数据。 在实践中,通过在选择分割的方式中添加一些随机性,来更有效地随机化决策树:这样,所有数据每次都有助于拟合,但是拟合的结果仍然具有所需的随机性。 例如,当确定要分割的特征时,随机化树可以从前几个特征中选择。
随机森林分类
10.导入sklearn.ensemble模块中的RandomForestClassifier函数,对模型随机扰动的取平均
通过对超过 100 个随机扰动的模型取平均,最终得到一个整体模型
随机森林回归
11.随机森林也可以用于回归(即连续而不是分类变量)。 导入sklearn模块中的RandomForestRegressor函数。
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import r2_score,mean_squared_error,mean_absolute_error
import numpy as np
12.导入sklearn.datasets模块中的load_boston函数
从上述结果可以看出,共506条波士顿地区房价信息,每条13项数值特征描述目标房价
13.查看数据的差异情况
14.随机采样25%作为测试 75%作为训练
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.25,random_state=33)
15.训练数据和测试数据进行标准化处理
ss_x = StandardScaler()
x_train = ss_x.fit_transform(x_train)
x_test = ss_x.transform(x_test)
ss_y = StandardScaler()
y_train = ss_y.fit_transform(y_train.reshape(-1,1))
y_test = ss_y.transform(y_test.reshape(-1,1))
16.用随机森林回归模型进行回归预测
17.读取/data目录下的wine.csv文件
18.实例化x值和y值
y = df_wine['Class label'].values
X = df_wine.values[:,1:]
这里[:,1:]形如X[:, m:n],即取所有数据的第m到n-1列数据,含左不含右。
现对[:,1:]进行举例解释,如下所示:
19.导入sklearn模块,利用train_test_split函数划分训练集和测试集
20.导入sklearn模块中的RandomForestClassifier函数
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_estimators=1000,criterion='gini',max_features='sqrt',
max_depth=None,min_samples_split=2,bootstrap=True,n_jobs=1,random_state=1)
#度量随机森林的准确性
rf=rf.fit(X_train,y_train)
y_train_pred = rf.predict(X_train)
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.