机器学习--随机森林 (Random Forest)
探索的终点将是开始时的起点。 –艾略特
文章内容目录:
- 一、随机森林算法简介
- 随机森林算法背景
- 随机森林算法思想
- 随机森林算法的特点
- 随机森林算法的应用
- 二、随机森林的相关知识
- 信息、熵以及信息增益的概念
- 决策树
- 集成学习
- 三、随机森林Python实现
- 四、参考内容
一、随机森林的那些事儿~
1、背景
Leo Breiman和Adele Cutler发展出推论出随机森林的算法。 而 "Random Forests" 是他们的商标。
这个术语是1995年由贝尔实验室的Tin Kam Ho所提出的随机决策森林(random decision forests)而来的。
这个方法则是结合 Breimans 的 "Bootstrap aggregating" 想法和 Ho 的"random subspace method"" 以建造决策树的集合。
上世纪八十年代Breiman等人发明分类树的算法(Breiman et al. 1984),通过反复二分数据进行分类或回归,计算量大大降低。2001年Breiman把分类树组合成随机森林(Breiman 2001a),即在变量(列)的使用和数据(行)的使用上进行随机化,生成很多分类树,再汇总分类树的结果。随机森林在运算量没有显著提高的前提下提高了预测精度。随机森林对多元公线性不敏感,结果对缺失数据和非平衡的数据比较稳健,可以很好地预测多达几千个解释变量的作用(Breiman 2001b),被誉为当前最好的算法之一(Iverson et al. 2008)。
2、思想
随机森林系列算法为集成学习同质个体学习器间不存在强依赖关系(即一系列个体学习器可以并行生成)的代表算法
同质个体学习器:所有的个体学习器是一个种类的,比如都是决策树个体学习器,都是神经网络个体学习器
随机森林,见名思意,很多树用随机方式组成一个森林。成百上千颗树也就构成了森林,这也是随机森林的主要思想–集成思想的体现。{集成学习思想:对于训练集数据,通过训练若干个个体学习器,通过一定的结合策略,形成一个强学习器。}
其中,随机采用,随机且又放回;森林中的很多树为决策树
每棵决策树都是一个分类器(分类问题),对于一个输入样本,N棵树分别进行判断,会有N个分类结果。随机森林集成了所有的分类投票结果,将投票次数最多的类别为预测结果,这就是一种最简单的 Bagging 思想。
3、随机森林算法特点
- a. 极好的准确率
- b. 很好的应用于大数据集
- c. 具有很好的抗噪声能力
- d.对数据集的适应能力强:既能处理离散型数据,也能处理连续型数据
- e. 能够处理很高维度(feature很多)的数据,并且不用做特征选择
- f. 在创建随机森林时,对内部生成误差是一种无偏估计
- g. 在训练过程中,能够检测到feature间的互相影响
- h. 对于缺省值问题也能够获得很好得结果
- i. ……
4、实际应用
美国*用随机森林算法 预测 *
相同思路可以预测歹徒、不法分子等(毕竟人命,正确率再高也有一定风险);
常用于,预测疾病的风险和病患者的易感性;
市场营销中,用于市场营销模拟的建模,统计客户来源,保留和流失;等。
二、随机森林的相关知识
随机森林看起来是很好理解,但是要完全搞明白它的工作原理,需要很多机器学习方面相关的基础知识。在本文中,我们简单谈一下,而不逐一进行赘述,如果有同学不太了解相关的知识,可以参阅其他博友的一些相关博文或者文献。
1、信息、熵以及信息增益的概念
这三个基本概念是决策树的根本,是决策树利用特征来分类时,确定特征选取顺序的依据。理解了它们,决策树你也就了解了大概。
引用香农的话来说,信息是用来消除随机不确定性的东西。当然这句话虽然经典,但是还是很难去搞明白这种东西到底是个什么样,可能在不同的地方来说,指的东西又不一样。对于机器学习中的决策树而言,如果带分类的事物集合可以划分为多个类别当中,则某个类(xi)的信息可以定义如下:
I(x)用来表示随机变量的信息,p(xi)指是当xi发生时的概率。
熵是用来度量不确定性的,当熵越大,X=xi的不确定性越大,反之越小。对于机器学习中的分类问题而言,熵越大即这个类别的不确定性更大,反之越小。
信息增益在决策树算法中是用来选择特征的指标,信息增益越大,则这个特征的选择性越好。
这方面的内容不再细述,感兴趣的同学可以看 信息&熵&信息增益 这篇博文。
2、决策树
决策树是一种树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别。常见的决策树算法有C4.5、ID3和CART。
3、集成学习
集成学习通过建立几个模型组合的来解决单一预测问题。它的工作原理是生成多个分类器/模型,各自独立地学习和作出预测。这些预测最后结合成单预测,因此优于任何一个单分类的做出预测。
随机森林是集成学习的一个子类,它依靠于决策树的投票选择来决定最后的分类结果。你可以在这找到用python实现集成学习的文档:Scikit。
附:集成学习框架
三、随机森林Python实现
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
import pandas as pd
import numpy as np
'''
鸢尾花数据集及元数据,
data:150个 元素,每个元素四个数值;
target:花卉类别,
0:Setosa 1:Versicolour 2:Virginica
'''
iris = load_iris() #加载鸢尾花全部数据
df = pd.DataFrame(iris.data, columns=iris.feature_names) #转换类型
df['data_train'] = np.random.uniform(0, 1, len(df)) <= .75 #产生150个[0,1)的数,并与0.75做判断
df['data_class'] = pd.Categorical.from_codes(iris.target, iris.target_names) #种类
head = df.head() #前五行
print(head) #输出看看效果
train, test = df[df['data_train']==True], df[df['data_train']==False] #train is true;test is flase
features = df.columns[:4]
clf = RandomForestClassifier(n_jobs=2)
y, _ = pd.factorize(train['data_class'])
clf = clf.fit(train[features], y)
preds = iris.target_names[clf.predict(test[features])]
pre = clf.predict(test[features])
cross = pd.crosstab(test['data_class'], preds, rownames=['actual'], colnames=['preds'])
print(cross)
数据head:
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) \
0 5.1 3.5 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 1.3 0.2
3 4.6 3.1 1.5 0.2
4 5.0 3.6 1.4 0.2
data_train data_class
0 True setosa
1 True setosa
2 True setosa
3 True setosa
4 True setosa
结果:
preds setosa versicolor virginica
actual
setosa 13 0 0
versicolor 0 16 1
virginica 0 0 11