随机森林-集成学习方法(分类)

1 集成学习方法

集成学习通过建立几个模型组合的来解决单一预测问题。它的工作原理是生成多个分类器/模型,各自独立地学习和作出预测。这些预测最后结合成单预测,因此优于任何一个单分类的做出预测。

2 随机森林

在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。

在决策树中,一个标准的决策树会根据每维特征对预测结果的影响程度进行排序,进而决定不同的特征从上至下构建分裂节点的顺序,如此以来,所有在随机森林中的决策树都会受这一策略影响而构建的完全一致,从而丧失的多样性。所以在随机森林分类器的构建过程中,每一棵决策树都会放弃这一固定的排序算法,转而随机选取特征。

3 学习算法

根据下列算法而建造每棵树:

(1)用N来表示训练用例(样本)的个数,M表示特征数目;

(2)输入特征数目m,用于确定决策树上一个节点的决策结果,其中m应远小于M;

(3)从N个训练用例(样本)中以随机有放回抽样的方式,取样N次,形成一个训练集(即bootstrap取样),并用未抽到的用例(样本)作预测,评估其误差。

(4)对于每一个节点,随机选择m个特征,决策树上每个节点的决定都是基于这些特征确定的。根据这m个特征,计算其最佳的分裂方式。

随机抽样训练集目的:如果不进行随机抽样,每棵树的训练集都一样,那么最终训练出的树分类结果也是完全一样的

有返回抽样的目的:如果不是有放回的抽样,那么每棵树的训练样本都是不同的,都是没有交集的,也就是说每棵树训练出来都是有很大的差异的,而随机森林最后分类取决于多棵树(弱分类器)的投票表决。

4 集成学习API

class sklearn.ensemble.RandomForestClassifier(n_estimators=10, criterion=’gini’, max_depth=None, bootstrap=True, random_state=None) 随机森林分类器

n_estimators:integer,optional(default = 10) 森林里的树木数量

criteria:string,可选(default =“gini”)分割特征的测量方法

max_depth:integer或None,可选(默认=无)树的最大深度

bootstrap:boolean,optional(default = True)是否在构建树时使用放回抽样

5 案例

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
# 1.加载数据
datas = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")# 2.处理数据,找出目标值和特征值
x = datas[['pclass','age','sex']]
y = datas['survived']# 2.1利用pandas.DataFrame.fillna方法处理缺失数据,inplace=True直接修改原对象
x['age'].fillna(x['age'].mean(),inplace=True)# 3 分割数据集为训练集合测试集
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.25)# 4.特征工程的抽取 特征->类别->one_hot编码
# 当特征里面是类别的信息,应该要one-hot编码,否则计算机不知道怎么去计算
dict = DictVectorizer(sparse=False)
# 将x_train(DataFrame类型)转换为字典,关键字orient='records' 时形成[{column -> value}, … , {column -> value}]的结构
# 整体构成一个列表,内层是将原始数据的每行提取出来形成字典
x_train = dict.fit_transform(x_train.to_dict(orient='records'))
print(dict.get_feature_names())
x_test = dict.transform(x_test.to_dict(orient='records'))# 5.随机森林预测(使用超参数调优,所以在此不添加任何参数)
rfcls = RandomForestClassifier()params = {"n_estimators":[120,200,300,500,800,1200],"max_depth":[5,10,15,20,25]}
# 6网格搜索与交叉验证
gc = GridSearchCV(rfcls,param_grid=params,cv=10)
gc.fit(x_train,y_train)
print("查看最好的结果:",gc.best_score_)
print("查看选择的参数模型:",gc.best_params_)
print("查看最好的参数模型:",gc.best_estimator_)
print("每个超参数每次交叉验证的结果:", gc.cv_results_)

6 随机森林的优缺点

优点:在当前所有算法中,具有极好的准确率;能够有效地运行在大数据集上;能够处理具有高维特征的输入样本,而且不需要降维;能够评估各个特征在分类问题上的重要性;对于缺省值问题也能够获得很好得结果。

随机森林没有缺点,有的就是选不到合适的参数和特征值。参数选择和特征值准备共同决定最终的预测效果。

随机森林-集成学习方法(分类)相关推荐

  1. 基于随机森林的乳腺癌分类判别

    基于随机森林的乳腺癌分类判别 摘要 关键词 一.随机森林原理 二.随机森林算法在乳腺癌中的判别应用 (一).数据预处理 (二)特征向量的提取和分析 1.样本特征对标签影响 2.相关性判断 三.模型建立 ...

  2. R语言构建随机森林模型randomForest分类模型并评估模型在测试集和训练集上的效果(accuray、F1、偏差Deviance):随机森林在Bagging算法的基础上加入了列采样(分枝特征随机)

    R语言构建随机森林模型randomForest分类模型并评估模型在测试集和训练集上的效果(accuray.F1.偏差Deviance):随机森林在Bagging算法的基础上加入了列采样(分枝特征随机) ...

  3. python随机森林筛选变量_如何使用虚拟变量来表示python scikit-learn随机森林中的分类数据...

    我正在为scikit-learn的随机森林分类器生成特征向量.特征向量代表9个蛋白质氨基酸残基的名称.有20个可能的残留名称.所以,我使用20个虚拟变量来表示一个残基名称,对于9个残基,我有180个虚 ...

  4. 随机森林实战(分类任务+特征重要性+回归任务)(含Python代码详解)

    1. 随机森林-分类任务 我们使用随机森林完成鸢尾花分类任务: 第一步,导入我们可能需要的包: from sklearn.datasets import load_iris from sklearn. ...

  5. 机器学习笔记 十九:由浅入深的随机森林模型之分类

    随机森林学习内容 1. 集成学习 2.sklearn中的集成算法 2.1 sklearn中的集成算法模块ensemble 2.2 RandomForestClassifier 2.2.1 参数 2.2 ...

  6. 机器学习项目实战:基于随机森林进行心脏病分类(含多种模型解释方法)

      本项目是Kaggle上面的一个经典竞赛题,心脏病分类问题,题目链接在这里. 主要基于随机森林的bagging集成学习框架,通过13个生理特征数据,实现对心脏病分类的预测.   由于自己想要在这个项 ...

  7. 数据分享|R语言逻辑回归、线性判别分析LDA、GAM、MARS、KNN、QDA、决策树、随机森林、SVM分类葡萄酒交叉验证ROC...

    全文链接:http://tecdat.cn/?p=27384 在本文中,数据包含有关葡萄牙"Vinho Verde"葡萄酒的信息(点击文末"阅读原文"获取完整代 ...

  8. python实现随机森林进行情绪分类

    1.前言:本实验采用的是GSR数据,机器学习方法为随机森林 2.GSR数据如下图所示: 3.随机森林代码: import numpy as np import pandas as pd from sk ...

  9. Google Earth Engine(GEE)——NDVI、NDWI和NDBI用来进行增加分类精度的验证结果(随机森林和cart分类)

    根据选择的样本点,并通过添加不同的指数("NDBI", "NDWI", "NDVI","B1", "B2&qu ...

最新文章

  1. C#和Javascript间互转的Xxtea加解密
  2. springboot集成redis配置多数据源
  3. SQL:在使用分组函数统计并进行分组时,发现有两条除了统计数据不一样,其他都一样的数据
  4. CG CTF WEB md5 collision
  5. Linux 终端配置
  6. MySQL 无法连接
  7. P1368-工艺【最小表示法】
  8. matlab 安装jdbc.jar
  9. python中span函数,如何用python中BeautifulSoup提取无类名的span内文本
  10. mvn 汇编_【答疑解惑】艺术生留学小白问题答疑汇编之精华
  11. gui python qt 绘图_最全整理!计算、可视化、机器学习等8大领域38个常用Python库...
  12. Java基础知识之方法的返回值与重载
  13. python坐标轴刻度设置为一个函数_Python坐标轴操作及设置代码实例
  14. 车辆检测技术的应用分析
  15. 黑马程序员——递归与枚举
  16. 移植安卓系统到树莓派开发板
  17. Pocket PC 2003 SE 仿真机 与主机联网
  18. 计算机的任务管理器在哪,怎么打开任务管理器 多种方法详细教学
  19. 项目使用jdk17人傻了
  20. 2020.04.16今日份学习小结

热门文章

  1. Oracle shared server模式连接ORA-12519
  2. ssh 命令行通过私钥登录其它设备
  3. Oracle 游标使用全解(摘抄)
  4. “函数调用的左操作数”的理解
  5. jQuery UI应用--滑块Slider
  6. 母版页(Master Pages)--轉載
  7. 简单工厂模式+工厂方法模式
  8. 【Linux笔记】LED驱动程序
  9. 复习Java异常处理_异常分类_自定义异常_线程初步了解
  10. java 2分钟_java开发中的那些事(5)--------一点经历,败给2分钟的2个小时