随机森林 Iris 特征重要性

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]])

reg

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

url = ‘http://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data’

url1 = pd.read_csv( r’wine.txt’,header= None)

url1 = pd.DataFrame(url1)

df = pd.read_csv(url1,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’]

print(url1)

查看几个标签

Class_label = np.unique(url1[‘Class label’])

print(Class_label)

查看数据信息

info_url = url1.info()

print(info_url)

除去标签之外,共有13个特征,数据集的大小为178,

下面将数据集分为训练集和测试集

fromsklearn.model_selection importtrain_test_split

print(type(url1))

url1 = url1.values

x = url1[:,0]

y = url1[:,1:]

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:]

n_estimators:森林中树的数量

n_jobs 整数 可选(默认=1) 适合和预测并行运行的作业数,如果为-1,则将作业数设置为核心数

forest = RandomForestClassifier(n_estimators= 10000, random_state= 0, n_jobs= -1)

forest.fit(x_train, y_train)

下面对训练好的随机森林,完成重要性评估

feature_importances_ 可以调取关于特征重要程度

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

  • 4
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
随机森林是一种基于决策树的集成学习算法,它可以用于分类和回归问题。在随机森林中,特征重要性是指每个特征对模型预测结果的影响程度。特征重要性可以帮助我们了解哪些特征对模型的预测结果最为关键,从而进行特征选择或优化模型。 以下是一些计算随机森林特征重要性的方法: 1. 平均不纯度减少(Mean Decrease Impurity,MDI):在每个决策树中,每个特征都会被用来划分节点,划分后会计算不纯度的减少量。特征重要性就是所有决策树中每个特征的不纯度减少量的平均值。 2. 平均精确度减少(Mean Decrease Accuracy,MDA):在每个决策树中,每个特征都会被用来划分节点,划分后会计算模型精确度的减少量。特征重要性就是所有决策树中每个特征的精确度减少量的平均值。 3. Out-of-Bag(OOB)重要性:在随机森林中,每个决策树都是基于随机抽样的数据集构建的,因此每个样本都有可能被某些决策树排除在外。对于每个样本,可以计算它在被排除的决策树中的精确度,然后将所有样本的精确度平均值作为特征重要性。 在实际应用中,可以使用Python中的sklearn库来计算随机森林特征重要性。例如,可以使用以下代码计算随机森林特征重要性: ```python from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import load_iris iris = load_iris() X, y = iris.data, iris.target rf = RandomForestClassifier(n_estimators=100, random_state=0) rf.fit(X, y) importances = rf.feature_importances_ print(importances) ``` 以上代码中,我们使用了sklearn库中的RandomForestClassifier类来构建随机森林模型,并使用feature_importances_属性来获取特征重要性

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值