随机森林(RandomForest):顾名思义,是用随机的方式建立一个森林,森林里面:由很多的决策树组成,随机森林的每一棵决策树之间是没有关联的。在得到森林之后,当有一个新的输入样本进入的时候,就让森林中的每一棵决策树分别进行一下判断,看看这个样本应该属于哪一类(对于分类算法),然后看看哪一类被选择最多,就预测这个样本为那一类。
随机森林的随机性体现在:
a.随机选择样本,是有放回抽样
b.随机选择特征,不用对所有的特征都考虑,训练速度相对快
随机森林的优点:
a.能够处理很高维度(feature很多)的数据(因为不用做特征选择,顺便说一下,最近很火的深度神经网络,其很大的好处就是算法会自动逐层对特征进行提取) PS:特征子集是随机选择的
b.训练速度快,容易做成并行化方法
PS:训练时树与树之间是相互独立的,并且随机选择特征
c.在训练完后,它能够给出哪些feature比较重要
d.在当前的很多数据集上,相对其他算法有着很大的优势,如果有很大一部分的特征遗失,仍可以维持准确度。
优点很多,这里不再赘述。
下面我实现一下简单的随机森林:
数据描述:为了对比单一决策树与集成模型中随机森林分类器的性能差异,我们使用kaggle上的泰坦尼克号的乘客数据。数据的下载地址可以直接到kaggle竞赛官网下载。
为了简单起见,所有分类器不进行个性化配置,全部采用默认配置进行初始化。
软件用的是anaconda,这是一个集成了特别多Python包的软件,大多数包不需要手动安装。最主要功能是ipython交互式和pycharm集成开发环境。
导入pandas,并且重命名为pd,
读取磁盘上的泰坦尼克的档案,并存储在变量titanic中。Pandas在数据分析与预处理中用处很大,是以numpy为基础的库。
Csv格式文件数据如下
人工选取Pclass,Age,Sex作为判别乘客是否能够生还的特征,同时用
Survived作为样本的标记。(这里一定要注意,X是两个中括号)
对于缺失的年龄信息,我们使用全体乘客的平均年龄代替,这样可以在保证顺利
训练模型的同时,尽可能不影响预测任务。
fillna 用指定值或插值方法(如ffill和bfill)填充缺失数据,可以前向填充可以后向填充,inplace=True的意思是fillna默认会返回新对象!!,就地修改
这里的警告的意思是对此副本的修改可能会影响原来的数据,这是由于api的更新所致,这里忽略就行了。
然后对原始数据进行分割,1/4用作测试
这是说该模块在0.18版本中被弃用,支持所有重构的类和函数都被移动到的model_selection模块。 另请注意,新的CV迭代器的接口与本模块的接口不同。此模块将在0.20中删除。
解决办法:将“from sklearn.cross_validation importtrain_test_split” 改为“from sklearn.model_selection import train_test_split”
X是所要划分的样本特征集,y所要划分的样本结果,test_size是样本占比。Random_state是随机种子
为什么用random_state=33呢?因为0或者不填,每次得到的随机数组会不一致,当然这个数也不是必须33,相当于随机数的种子
对类别特征进行转化,成为特征向量。特征提取模块可以用于从由诸如文本和图像的格式组成的数据集中提取机器学习算法支持的格式的特征。类DictVectorizer可用于将表示为标准Python dict对象列表的要素数组转换为scikit-learn估计量使用的NumPy/ SciPy表示。虽然处理不是特别快,但是Python的dict使用很方便
使用随机森林分类器进行集成模型的训练以及预测分析
输出随机森林分类器在测试集上的分类准确性,以及更详细的精准率、召回率及F1指标,fit函数是用来训练模型参数的,没有它还训练个球啊
这里metrics是评价标准的意思。
Accuracy是预测结果除以原本正确标记的百分比。
Precision(精确率)=#(true positive)/[#(true positive)+#(falsepositive)]
true positive代表真阳性
Recall(召回率)=#(true positive)/[#(truepositive)+#(false negative)]
为了综合考量召回率和精确率,我们计算这两个指标的调和平均数。它除了具有平均功能外,还会对那些召回率和精确率更加接近的模型给出更高的分数,因为召回率和精确率差距较大的模型,往往没有足够的实用价值。
F1=2/(1/presion+1/recall)
领取专属 10元无门槛券
私享最新 技术干货