机器学习笔记(随机森林)

随机森林

随机森林是将多棵树集成的一种算法,它的基本单元是决策树。本质属于机器学习的一大分支——集成学习(Ensemble Learning)方法。随机森林由决策树组成,一个样本经过决策树处理会得到一个分类结果,然后把所有决策树的分类结果,依据投票法得出样本的最终分类。将若干个弱分类器(决策树)的分类结果进行投票选择,从而组成一个强分类器(随机森林),就是随机森林bagging的思想(bagging的代价是,不知道具体哪个变量起到重要作用,所以bagging改进了预测准确率但损失了解释性。)
随机森林的特点:鲁棒性强,调参简单,对于小数据集效果也不错,对于数据集的特征维度没有要求。

随机森林训练过程
  1. 训练集大小为N,随机且有放回地从训练集中抽取N个训练样本(这种采样方式称为bootstrap sample方法),作为该树的训练集(每棵树的训练集都是不同的,且是随机抽取的体现了随机性,并且bootstrap可以保证抽取的数据集是独立同分布的)
  2. 假设每个样本的特征维度为M,指定一个常数m<
  3. 每棵树都尽最大程度的生长,并且没有剪枝过程。
    由此可见随机森林的随机性体现在,每棵树的训练样本是随机抽取的,每棵树的特征也是随机选取的。随机性可以使得随机森林不容易过拟合,提高了鲁棒性。减小决策树的特征个数m,树之间的相关性和树的分类能力会相应的降低;增大m,两者会随之增大。所以选择最优的m(或者是范围)很重要,这也是随机森林唯一的一个参数。
衡量随机森林标准

袋外错误率(oob error):由于采用bootstrap方法进行抽样,每棵决策树训练中不会用到所有的样本,所以用训练中没有用到的样本来进行检测。
4. 对每个样本,计算它作为oob样本的树对它的分类情况(约1/3的树);
5. 然后以简单多数投票作为该样本的分类结果;
6. 最后用误分个数占样本总数的比率作为随机森林的oob误分率。

随机森林代码

生成随机森林代码
# 导入数据并划分
from sklearn import datasets
from sklearn.model_selection import train_test_split
iris = datasets.load_iris()
X = iris.data
Y = iris.target
x_train,x_test,y_train,y_test = train_test_split(X,Y,test_size=0.3,random_state=0)
from sklearn.ensemble import RandomForestClassifier
# 训练随机森林模型
RFC = RandomForestClassifier(n_estimators=100,bootstrap='true',random_state=0,max_depth=4)
RFC.fit(x_train,y_train)
# 预测
RFC_pred = RFC.predict(x_test)
#对模型进行评估
from sklearn import metrics
RFC_accuracy = metrics.accuracy_score(y_test,RFC_pred)
print('RFC_accuracy 模型综合评估矩阵如下:%.3f'% RFC_accuracy)

RFC_accuracy 模型综合评估矩阵如下:0.978

可视化代码:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
x = iris.data[:,1:3]
pred = RFC.fit(x,Y)
cmap_light = mpl.colors.ListedColormap(['#FFAAAA', '#AAFFAA', '#AAAAFF'])
cmap_dark = mpl.colors.ListedColormap(['r','g','b'])
h = 50
lx1,rx1 = x[:,0].min()-0.5, x[:,0].max()+0.5#横坐标
lx2,rx2 = x[:,1].min()-0.5, x[:,1].max()+0.5#纵坐标
x1,y1 = np.meshgrid(np.linspace(lx1,rx1,h),np.linspace(lx2,rx2,h))#生成网格
RFC_test = np.stack((x1.flat,y1.flat),axis = 1)#每个坐标点的坐标
test_pred = RFC.predict(RFC_test)#每个点的分类进行分类
plt.figure()
plt.pcolormesh(x1,y1,test_pred.reshape(x1.shape),shading='auto',cmap=cmap_light)#底层颜色
plt.scatter(x[:,0],x[:,1],c=Y,cmap = cmap_dark,edgecolors='k',s=20)
plt.xlim(x1.min(),x1.max())
plt.title('RandomForestClassifier')
plt.xlabel('SepalLength')
plt.ylabel('SepalWidth')
plt.show()

参数

RandomForestClassifier参数:

RandomForestClassifier(n_estimators=10, 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=1,
		   random_state=None, verbose=0, warm_start=False, class_weight=None)

大多数参数与决策树类似
n_estimators:决策树的数量
oob_score:是否用这个标准来衡量
warm_start : bool (default=False) 是否用用原来训练好的森林,False训练新的森林

你可能感兴趣的:(机器学习的学习笔记,sklearn,机器学习,python)