Python机器学习笔记——随机森林算法!最详细的笔记没有之一

Python机器学习笔记——随机森林算法!最详细的笔记没有之⼀
随机森林算法的理论知识
随机森林是⼀种有监督学习算法,是以决策树为基学习器的集成学习算法。随机森林⾮常简单,易于实现,计算开销也很⼩,但是它在分类和回归上表现出⾮常惊⼈的性能,因此,随机森林被誉为“代表集成学习技术⽔平的⽅法”。
⼀,随机森林的随机性体现在哪⼏个⽅⾯? 1,数据集的随机选取
从原始的数据集中采取有放回的抽样(bagging),构造⼦数据集,⼦数据集的数据量是和原始数据集相同的。不同⼦数据集的元素可以重复,同⼀个⼦数据集中的元素也可以重复。
2,待选特征的随机选取
与数据集的随机选取类似,随机森林中的⼦树的每⼀个分裂过程并未⽤到所有的待选特征,⽽是从所有的待选特征中随机选取⼀定的特征,之后再在随机选取的特征中选取最优的特征
⼆,为什么使⽤随机森林?
1,随机森林既可以⽤于分类问题,也可以⽤于回归问题
2,过拟合是个关键的问题,可能会让模型的结果变得糟糕,但是对于随机森林来说,如果随机森林的树⾜够多,那么分类器就不会过拟合模型
3,随机森林分类器可以处理缺失值
4,随机森林分类器可以⽤分类值建模
caj三,随机森林的构建过程
1,从原始训练集中使⽤Bootstraping⽅法随机有放回采样取出m个样本,共进⾏n_tree次采样。⽣成n_tree个训练集2,对n_tree个训练集,我们分别训练n_tree个决策树模型
3,对于单个决策树模型,假设训练样本特征的个数为n,那么每次分裂时根据信息增益/信息增益⽐/基尼指数选择最好的特征进⾏分裂
4,每棵树都已知这样分裂下去,知道该节点的所有训练样例都属于同⼀类。在决策树的分裂过程中不需要剪枝
5,将⽣成的多颗决策树组成随机森林。对于分类问题,按照多棵树分类器投票决定最终分类结果;对于回归问题,由多颗树预测值的均值决定最终预测结果
注意:OOB(out-of-bag ):每棵决策树的⽣成都需要⾃助采样,这时就有1/3的数据未被选中,这部分数据就称为袋外数据。
四,随机森林优缺点总结优点
•由于采⽤了集成算法,本⾝精度⽐⼤多数单个算法要好,所以准确性⾼
•在测试集上表现良好,由于两个随机性的引⼊,使得随机森林不容易陷⼊过拟合(样本随机,特征随机)
•在⼯业上,由于两个随机性的引⼊,使得随机森林具有⼀定的抗噪声能⼒,对⽐其他算法具有⼀定优势
•由于树的组合,使得随机森林可以处理⾮线性数据,本⾝属于⾮线性分类(拟合)模型
•它能够处理很⾼维度(feature很多)的数据,并且不⽤做特征选择,对数据集的适应能⼒强:既能处理离散型数据,也能处理连续型数据,数据集⽆需规范化
•训练速度快,可以运⽤在⼤规模数据集上
•可以处理缺省值(单独作为⼀类),不⽤额外处理
•可以处理缺省值(单独作为⼀类),不⽤额外处理
•由于有袋外数据(OOB),可以在模型⽣成过程中取得真实误差的⽆偏估计,且不损失训练数据量
菲律宾国旗•在训练过程中,能够检测到feature间的互相影响,且可以得出feature的重要性,具有⼀定参考意义
•由于每棵树可以独⽴、同时⽣成,容易做成并⾏化⽅法
•由于实现简单、精度⾼、抗过拟合能⼒强,当⾯对⾮线性数据时,适于作为基准模型
缺点
•当随机森林中的决策树个数很多时,训练时需要的空间和时间会⽐较⼤
•随机森林中还有许多不好解释的地⽅,有点算是⿊盒模型
•在某些噪⾳⽐较⼤的样本集上,RF的模型容易陷⼊过拟合
五,特征重要性评估
现实情况下,⼀个数据集中往往有成百上千个特征,如何在其中选择⽐结果影响最⼤的那⼏个特征,
以此来缩减建⽴模型时特征数是我们⽐较关⼼的问题。这样的⽅法其实很多,⽐如主成分分析,lasso等等。不过这⾥我们学习的是⽤随机森林来进⾏特征筛选。
⽤随机森林进⾏特征重要性评估的思想就是看每个特征在随机森林中的每棵树上做了多⼤的贡献,然后取个平均值,最后⽐⼀⽐特征之间的贡献⼤⼩。
贡献⼤⼩通常使⽤基尼指数(Gini index)或者袋外数据(OOB)错误率作为评估指标来衡量。这⾥我们再学习⼀下基尼指数来评价的⽅法。松下g5
我们将变量重要性评分(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.1 特征选择 5.1.1 特征选择的步骤
在特征重要性的基础上,特征选择的步骤如下:
•计算每个特征的重要性,并按降序排序
•确定要剔除的⽐例,依据特征重要性剔除相应⽐例的特征,得到⼀个新的特征集
•⽤新的特征集重复上述过程,直到剩下m个特征(m为提前设定的值)
•根据上述代码中得到的各个特征集合特征集对应的袋外误差率,选择袋外误差率最低的特征集
5.1.2 特征重要性的估计⽅法
特征重要性的估计通常有两种⽅法:⼀是使⽤uniform或者gaussian抽取随机值替换原特征;⼀是通过permutation的⽅
特征重要性的估计通常有两种⽅法:⼀是使⽤uniform或者gaussian抽取随机值替换原特征;⼀是通过permutation的⽅式将原来的所有N个样本的第i个特征值重新打乱分布,第⼆种⽅法更加科学,保证了特征替代值与原特征的分布是近似的。这种⽅法叫做permutation test ,即在计算第i个特征的重要性的时候,将N 个特征的第i个特征重新洗牌,然后⽐较D和表现的差异性,如果差异很⼤,则表明第i个特征是重要的。
5.2 ⽰例——利⽤随机森林进⾏特征选择,然后使⽤SVR进⾏训练 1,利⽤随机森林进⾏特征选择
代码:
importnumpy asnp
importpandas aspd
# url = 'archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data'
url1 = pd.read_csv( ',header= None)
# url1 = pd.DataFrame(url1)
# df = pd.read_csv(url1,header=None)
'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,
# 下⾯将数据集分为训练集和测试集
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 = lumns[ 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 = lumns[ 1:]
indices = np.argsort(importances)[:: -1]
forf inrange(x_train.shape[ 1]):
# 对于最后需要逆序排序,我认为是做了类似决策树回溯的取值,从叶⼦收敛
# 到根,根部重要程度⾼于叶⼦。
print( "%2d) %-*s %f"% (f + 1, 30, feat_labels[indices[f]], importances[indices[f]]))
# 筛选变量(选择重要性⽐较⾼的变量)
threshold = 0.15
x_selected = x_train[:,importances > threshold]
# 可视化
importmatplotlib.pyplot asplt
plt.figure(figsize=( 10, 6))
plt.title( "红酒的数据集中各个特征的重要程度",fontsize = 18)
plt.ylabel( "import level",fontsize = 15,rotation= 90)
fori inrange(x_columns.shape[ 0]):
plt.bar(i,importances[indices[i]],color= 'orange',align= 'center')
结果:
RangeIndex: 178entries, 0to177
Data columns (total 14columns):
Class label 178non- nullint64
baobaAlcohol 178non- nullfloat64
Malic acid 178non- nullfloat64
Ash 178non- nullfloat64
Alcalinity ofash 178non- nullfloat64郭超人
Magnesium 178non- nullint64
Total phenols 178non- nullfloat64
Flavanoids 178non- nullfloat64
Nonflavanoid phenols 178non- nullfloat64
Proanthocyanins 178non- nullfloat64
Color intensity 178non- nullfloat64
Hue 178non- nullfloat64
OD280/OD315 ofdiluted wines 178non- nullfloat64
Proline 178non- nullint64
dtypes: float64( 11), int64( 3)
memory usage: 19.5KB
重要性: [ 0.106589060.025399680.013916190.032033190.022078070.0607176 0.150947950.014645160.022351120.182482620.078242790.1319868

本文发布于:2024-09-23 01:21:02,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/367204.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:特征   数据   森林   重要性
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议