赞
踩
http://www.sohu.com/a/297967370_729271
随机森林是指利用多棵决策树对样本进行训练并预测的一种算法。也就是说随机森林算法是一个包含多个决策树的算法,其输出的类别是由个别决策树输出的类别的众树来决定的。在Sklearn模块库中,与随机森林算法相关的函数都位于集成算法模块ensemble中,相关的算法函数包括随机森林算法(RandomForestClassifier)、袋装算法(BaggingClassifier)、完全随机树算法(ExtraTreesClassifier)、迭代算法(Adaboost)、GBT梯度Boosting树算法(GradientBoostingClassifier)、梯度回归算法(GradientBoostingRegressor)、投票算法(VotingClassifier)。
聚类和回归是机器学习的最基本主题。而随机森林主要是应用于回归和分类这两种场景,又侧重于分类。研究表明,组合分类器比单一分类器的分类效果好,在上述中我们知道,随机森林是指利用多棵决策树对样本数据进行训练、分类并预测的一种方法,它在对数据进行分类的同时,还可以给出各个变量(基因)的重要性评分,评估各个变量在分类中所起的作用。
随机森林的构建大致如下:首先利用bootstrap方法又放回的从原始训练集中随机抽取n个样本,并构建n个决策树;然后假设在训练样本数据中有m个特征,那么每次分裂时选择最好的特征进行分裂 每棵树都一直这样分裂下去,直到该节点的所有训练样例都属于同一类;接着让每颗决策树在不做任何修剪的前提下最大限度的生长;最后将生成的多棵分类树组成随机森林,用随机森林分类器对新的数据进行分类与回归。对于分类问题,按多棵树分类器投票决定最终分类结果;而对于回归问题,则由多棵树预测值的均值决定最终预测结果。
三,随机森林的构建过程
1,从原始训练集中使用Bootstraping方法随机有放回采样取出m个样本,共进行n_tree次采样。生成n_tree个训练集
2,对n_tree个训练集,我们分别训练n_tree个决策树模型
3,对于单个决策树模型,假设训练样本特征的个数为n,那么每次分裂时根据信息增益/信息增益比/基尼指数 选择最好的特征进行分裂
4,每棵树都已知这样分裂下去,知道该节点的所有训练样例都属于同一类。在决策树的分裂过程中不需要剪枝
5,将生成的多颗决策树组成随机森林。对于分类问题,按照多棵树分类器投票决定最终分类结果;对于回归问题,由多颗树预测值的均值决定最终预测结果
注意:OOB(out-of-bag ):每棵决策树的生成都需要自助采样,这时就有1/3的数据未被选中,这部分数据就称为袋外数据。
1、n_estimators:它表示建立的树的数量。 一般来说,树的数量越多,性能越好,预测也越稳定,但这也会减慢计算速度。一般来说在实践中选择数百棵树是比较好的选择,因此,一般默认是100。
2、n_jobs:超参数表示引擎允许使用处理器的数量。 若值为1,则只能使用一个处理器。 值为-1则表示没有限制。设置n_jobs可以加快模型计算速度。
3、oob_score :它是一种随机森林交叉验证方法,即是否采用袋外样本来评估模型的好坏。默认是False。推荐设置为True,因为袋外分数反应了一个模型拟合后的泛化能力。
sklearn随机森林
from sklearn import datasets, ensemble
from sklearn.ensemble import RandomForestRegressor
import numpy as np
iris=datasets.load_iris()
iris_data=iris[‘data’]
iris_label=iris[‘target’]
X=np.array(iris_data)
Y=np.array(iris_label)
clf = ensemble.RandomForestClassifier(max_depth=5, n_estimators=1, max_features=1)
clf.fit(X,Y)
print clf.predict([[4.1, 2.2, 2.3, 5.4]])
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestRegressor
from sklearn.datasets import load_iris
from numpy.core.umath_tests import inner1d
import numpy as np
iris = load_iris()
Forest_reg = RandomForestRegressor()
Forest_model = RandomForestRegressor(n_estimators=100)
Forest_model.fit(iris.data,iris.target)
scores = cross_val_score(Forest_reg, iris.data,iris.target,scoring=“neg_mean_squared_error”)
mse_score = np.sqrt(-scores)
print((mse_score.mean(), mse_score.std()))
importances = Forest_model.feature_importances_
print(importances) #特征重要性
一、优点:
1、对于大部分的数据,它的分类效果比较好。
2、能处理高维特征,不容易产生过拟合,模型训练速度比较快,特别是对于大数据而言。(由于两个随机性的引入,样本随机,特征随机)由于树的组合,使得随机森林可以处理非线性数据,本身属于非线性分类(拟合)模型
它能够处理很高维度(feature很多)的数据,并且不用做特征选择,对数据集的适应能力强:既能处理离散型数据,也能处理连续型数据,数据集无需规范化
训练速度快,可以运用在大规模数据集上
3、在决定类别时,它可以评估变数的重要性。,能够检测到feature间的互相影响,且可以得出feature的重要性,具有一定参考意义
4、对数据集的适应能力强:既能处理离散型数据,也能处理连续型数据,数据集无需规范化。
二、缺点:
1、对少量数据集和低维数据集的分类不一定可以得到很好的效果。
2、 随机森林中还有许多不好解释的地方,有点算是黑盒模型
3、 当我们需要推断超出范围的独立变量或非独立变量,随机森林做得并不好。
为什么要随机抽样训练集?
如果不进行随机抽样,每棵树的训练集都是一样的,那么最终的训练出的树分类结果也是一样的,这样的话完全没有bagging的必要。
为什么要有放回地抽样?
如果不是有放回的抽样,那么每棵树的训练样本都是不同的,都是没有交集的,这样每棵树都是“有偏的”,也就是说每棵树训练出来都是有很大的差异的,而随机森林最后分类结果取决于多棵树的投票表决,这种表决应该是“求同”,因此使用完全不同的训练集来训练每棵树这样对最终分类结果是没有帮助的,这无异于盲人摸象。
五,特征重要性评估
现实情况下,一个数据集中往往有成百上千个特征,如何在其中选择比结果影响最大的那几个特征,以此来缩减建立模型时特征数是我们比较关心的问题。这样的方法其实很多,比如主成分分析,lasso等等。不过这里我们学习的是用随机森林来进行特征筛选。
用随机森林进行特征重要性评估的思想就是看每个特征在随机森林中的每棵树上做了多大的贡献,然后取个平均值,最后比一比特征之间的贡献大小。
贡献大小通常使用基尼指数(Gini index)或者袋外数据(OOB)错误率作为评估指标来衡量。这里我们再学习一下基尼指数来评价的方法。
我们将变量重要性评分(variable importance measures)用VIM来表示,将Gini指数用GI来表示,假设m个特征X1,X2,X3,…Xc,现在要计算出每个特征Xj的Gini指数评分VIM j (Gini) ,亦即第j个特征在RF所有决策树中节点分裂不纯度的平均改变量。
Gini指数的计算公式为:
其中,K表示有K个类别。Pmk表示节点m中类列k所占的比例。
直观的说,就是随便从节点m中随机抽取两个样本,其类别标记不一致的概率。
特征Xj在节点m的重要性,即节点m分支前后的Gini指数变化量为:
其中,GI l 和GI r 分别表示分枝后两个新节点的Gini指数。
如果,特征Xj在决策树i中出现的节点在集合M中,那么Xj在第i颗树的重要性为:
假设RF中共有n颗树,那么
最后,把所有求得的重要性评分做一个归一化处理即可。
5.2 示例——利用随机森林进行特征选择,然后使用SVR进行训练 1,利用随机森林进行特征选择
代码:
importnumpy asnp
importpandas aspd
fromsklearn.ensemble importRandomForestClassifier
url1 = pd.read_csv( r’wine.txt’,header= None)
url1.columns = [ ‘Class label’, ‘Alcohol’, ‘Malic acid’, ‘Ash’,
‘Alcalinity of ash’, ‘Magnesium’, ‘Total phenols’,
‘Flavanoids’, ‘Nonflavanoid phenols’, ‘Proanthocyanins’,
‘Color intensity’, ‘Hue’, ‘OD280/OD315 of diluted wines’, ‘Proline’]
fromsklearn.model_selection importtrain_test_split
print(type(url1))
x,y = url1.iloc[:, 1:].values,url1.iloc[:, 0].values
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size= 0.3,random_state= 0)
feat_labels = url1.columns[ 1:]
forest = RandomForestClassifier(n_estimators= 10000, random_state= 0, n_jobs= -1)
forest.fit(x_train, y_train)
importances = forest.feature_importances_
print( “重要性:”,importances)
x_columns = url1.columns[ 1:]
indices = np.argsort(importances)[:: -1]
forf inrange(x_train.shape[ 1]):
print( “%2d) %-*s %f”% (f + 1, 30, feat_labels[in
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。