MachineLearning · 2020年9月20日 0

重拾随机森林-1

〇、写在前面

很久很久没有更新了,3个月,仅仅是充了28.5CNY后就挂在这,这三个月很忙,忙着期末复习,忙着给过去的自己擦屁股,忙着告别过去和迎接未来,忙着寻找自己的热爱。

现在的自己很开心,每天都很幸福,我觉得这是最好的状态,积极向上的迎接每一天,我也会随着自己的学习慢慢跟进更新进度,未来可期。

一、随机森林简述

随机森林就是通过集成学习的思想将多棵决策树集成的一种算法,它的基本单元是决策树,而它的本质属于集成学习(Ensemble Learning)方法。

随机森林的名称中有两个关键词,一个是“随机”,一个就是“森林”。其实这也是随机森林的主要思想–集成思想的体现。

每棵决策树都是一个分类器(假设分类问题),那么对于一个输入样本,N棵树会有N个分类结果。而随机森林集成了所有的分类投票结果,将投票次数最多的类别指定为最终的输出,这就是一种最简单的 Bagging 思想。

不知道有没有人玩过Steam上的机器学习学习型游戏,里面对于这种思想有较为深刻而简明易懂的启发。

实际上,随机森林就相当于机器学习领域的Leatherman,用方言叫做2鼻子hhh,你几乎可以把任何东西扔进去,它基本上都是可供使用的。

随机森林在估计推断映射方面特别好用,都不需要像SVM那样做很多参数的调试,对于我这种做神经网络深度学习的人来说简直懒人福音。

1、基础知识

但凡学过通信原理,对于信息,信息熵这些概念都会非常熟悉

如上,最典型的信息计算方式

熵是用来度量不确定性的,当熵越大,X=xi的不确定性越大,反之越小。对于机器学习中的分类问题而言,熵越大即这个类别的不确定性更大,反之越小。

信息增益在决策树算法中是用来选择特征的指标,信息增益越大,则这个特征的选择性越好。

决策树是一种树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别。常见的决策树算法有C4.5、ID3和CART。

集成学习通过建立几个模型组合的来解决单一预测问题。它的工作原理是生成多个分类器/模型,各自独立地学习和作出预测。这些预测最后结合成单预测,因此优于任何一个单分类的做出预测。

随机森林依靠于决策树的投票选择来决定最后的分类结果。但是从某种角度来说,细分来看和我们想的不太一样:

森林中的每棵树都是独立的,99.9%不相关的树做出的预测结果涵盖所有的情况,这些预测结果将会彼此抵消。少数优秀的树的预测结果将会超脱于芸芸“噪音”,做出一个好的预测。将若干个弱分类器的分类结果进行投票选择,从而组成一个强分类器。

说一下集成学习的bagging,名称来源于 ( Bootstrap AGGregatING ),意思是自助抽样集成,这种方法将训练集分成m个新的训练集,然后在每个新训练集上构建一个模型,各自不相干,最后预测时我们将这个m个模型的结果进行整合,得到最终结果。整合方式就是:分类问题用majority voting,回归用均值。


2、接下来我们看一下具体操作随机森林的方法哈

1)如果训练集大小为N,对于每棵树而言,随机且有放回地从训练集中的抽取N个训练样本(这种采样方式称为bootstrap sample方法),作为该树的训练集;

稍微解释一下

这里我们可以知道:每棵树的训练集都是不同的,而且里面可以包含重复的训练样本,如果不进行随机抽样后每棵树的训练集都一样,那么最终训练出的树分类结果也是完全一样的,这样的话完全没有bagging的必要;

如果不是有放回的抽样,那么每棵树的训练样本都是不同的,都是没有交集的,这样每棵树都是绝对”片面的”也就是说每棵树训练出来都是有很大的差异的;而随机森林最后分类取决于多棵树(弱分类器)的投票表决,这种表决应该是”求同”,因此使用完全不同的训练集来训练每棵树这样对最终分类结果是没有帮助的,也达不到bagging的意义

2)如果每个样本的特征维度为M,指定一个常数m<<M,随机地从M个特征中选取m个特征子集,每次树进行分裂时,从这m个特征中选择最优的;

3)每棵树都尽最大程度的生长,并且没有剪枝过程。

一开始我们提到的随机森林中的“随机”就是指的这里的两个随机性。两个随机性的引入对随机森林的分类性能至关重要。由于它们的引入,使得随机森林不容易陷入过拟合,并且具有很好得抗噪能力(对缺省值不敏感)

  随机森林分类效果(错误率)与两个因素有关:森林中任意两棵树的相关性:相关性越大,错误率越大;森林中每棵树的分类能力:每棵树的分类能力越强,整个森林的错误率越低。 减小特征选择个数m,树的相关性和分类能力也会相应的降低;增大m,两者也会随之增大。所以关键问题是如何选择最优的m(或者是范围),这也是随机森林唯一的一个参数。

我直呼内行…

import sklearn
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification
import numpy as np
import pandas as pd

# 导入数据:训练集、测试集
num = 100
numi = 1667

data_1 = g5_data530_power  ## 这里没数据自己导入一下

##记得还要导入data530_power的那个

#test_data(1:numi,1:2*0.3*num) = [data_1(1:numi,1:0.3*num),data530_power(1:numi,1:0.3*num)]
test_data = [data_1(1:numi,1:0.3*num),data530_power(1:numi,1:0.3*num)]
#train_data(1:numi,1:2*0.7*num)=[data_1(1:numi,0.3*num+1:num),data530_power(1:numi,0.3*num+1:num)]
train_data = [data_1(1:numi,0.3*num+1:num),data530_power(1:numi,0.3*num+1:num)]

test_num = 0.3 * num
train_num = 0.7 * num

# train_label=ones(1,train_num*2)
# train_label(1,train_num+1:train_num*2)=ones(1,train_num)*2

test_label = ones(1,test_num*2)
# test_label(1,test_num+1:test_num*2)=ones(1,test_num)*2



# 利用随机森林预测
nTree = 50
n_estimator = nTree # python中的参数名称

iris = load_iris()
df = pd.DataFrame(iris.data,columns=iris,featute_names)


'''
B = TreeBagger(nTree,train_data,train_label)


predict_label = predict(B,test_data)

predict_label1 = cell2mat(predict_label)
predict_label2 = str2num(predict_label1)


'''
# 利用循环计算ACC
p = 0

for i in range(1,31)
    if predict_label2(i,1) == 1
        p = p + 1
    else 
        continue

for i in range(31,61)
    if predict_label2(i,1) == 2
        p=p+1
    else 
        continue 

ACC_1 = p/0.6
ACC = strcat(num2str(ACC_1),'%')





# 作图