第二章 分类模型-决策树知识点详细总结
第三章 分类模型-随机森林知识点详细总结
第四章 分类模型-支持向量机SVM知识点详细总结
第五章 关联分析-apriori算法知识点详细总结
机器学习算法系列
一、随机森林简介
二、了解什么是集成学习
三、随机森林工作原理(构建过程)
四、特征重要性
五、随机森林分类模型参数说明
六、随机森林优缺点
七、应用领域
八、随机森林代码
一、
随机森林简介
它是多重决策树的组合,而不只是一棵决策树。随机森林算法下决策树的数量越多,泛化的结果更好。随机森林可作分类也可作回归。它属于机器学习中的集成学习一类。
“随机”二字理解:
1)样本随机采样;
2)属性随机选择;
随机森林是建立在决策树的基础上,关于决策树的基础知识有兴趣的可先看上一篇:
第二章 分类模型-决策树知识点详细总结_助教评分问题,构造决策树分类模型_柯努力的博客-CSDN博客
集成学习是将多个模型进行组合来解决单一的预测问题。原理是生成多个分类器模型,独立地学习并作出预测。这些预测最后结合起来得到预测结果,因此和单独分类器的结果相比,结果一样或更好。
随机森林是集成学习的一个分支,因为它依靠于决策树的集成。
三、
随机森林工作原理(构建过程)
1. 从原始训练集中使用Bootstraping方法随机有放回采样取出m个样本,共进行n次采样。生成n个训练集。
2. 对n个训练集,我们分别训练n个决策树模型。
3. 对于单个决策树模型,假设训练样本特征的个数为n,那么每次分裂时根据信息增益/信息增益比/基尼指数,选择最好的特征进行分裂。
4. 每棵树都已知这样分裂下去,知道该节点的所有训练样例都属于同一类。在决策树的分裂过程中不需要剪枝。
5. 将生成的多颗决策树组成随机森林。对于分类问题,按照多棵树分类器投票决定最终分类结果;对于回归问题,由多颗树预测值的均值决定最终预测结果。
假设随机森林中有100棵决策树,那么,我们需要将新样本数据输入到100棵树中,然后,看每棵树返回的分类结果是什么,如果是分类问题,则根据投票原则,少数服从多数来确定新样本最终的类别。如果是回归问题,则取100棵树预测值的均值作为最终的预测值。
如:假设新样本可能有两种类别取值:0和1,使用规模为100的随机森林模型发现,有90棵树预测的类别是1,10棵树预测的结果是0,那么,少数服从多数,新样本的类别会判断为1。
参考:
https://zhuanlan.zhihu.com/p/180067849
四、
特征重要性
随机森林中的特征重要性表示在该特征上拆分的所有节点的基尼不纯度减少的总和。我们可以使用它来尝试找出随机森林认为最重要的预测变量,特征重要性可以让我们更好地洞察问题。
五、
随机森林分类
模型参数说明
Python sklearn参数说明,
随机森林中的超参数既可以用来提高模型的预测能力,也可以加快建模的速度。
n_estimators
|
树的数目
|
Int, 默认10
|
criterion
|
特征选择标准
|
默认"gini",即CART算法; gini or entopy
|
splitter
|
特征划分标准
|
默认“best”;
a)"best":在所有特征中找到最好划分点,适合样本量不大的时候;
b)"random":随机的在部分划分点中找局部最优的划分点,适合样本数据量非常大;
|
max_features
|
划分数据集时考虑的最多的特征值数量
|
【int, float,string or None】,默认"auto"
-
int,则在每次拆分时考虑max_features功能。
-
float,则max_features为百分比,并在每次拆分时考虑int(max_features * n_features)要素。
-
“auto”,则max_features = sqrt(n_features)。
-
“sqrt”,则max_features = sqrt(n_features)(与“auto”相同)。
-
“log2”,则max_features = log2(n_features)。
-
None,则max_features = n_features。
|
max_depth
|
决策树最大深度
|
Int or None, 默认None;
数据少或特征少的时候可以不管这个值,如果模型样本量、特征多的情况下,可以尝试限制;
常用的可以取值10-100之间,目的是解决过拟合;
|
min_samples_split
|
内部节点(即判断条件)再划分所需最小样本数
|
【int, float】。默认为2。
-
int,则取传入值本身作为最小样本数;
-
float,则取ceil(min_samples_split*样本数量)作为最小样本数。
如果节点样本数少于min_samples_split,则不会继续尝试选择最优特征来划分。若样本数量级非常大,推荐增大这个值。
|
min_samples_leaf
|
叶子节点(即分类)最少样本数
|
【int, float】 默认为1
-
int,则取传入值本身作为最小样本数;
-
float,则min_samples_leaf是百分比,ceil(min_samples_leaf * n_samples)是每个节点的最小样本数。
限制叶子节点最少的样本数,如果叶子节点数目小于样本数,则会和兄弟节点一起被剪枝
|
min_weight_fraction_leaf
|
叶子节点(即分类)最小的样本权重和
|
【float】。这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。默认是0,就是不考虑权重问题,所有样本的权重相同。
|
max_leaf_nodes
|
最大叶子节点数
|
【int, None】默认值None,限制最大叶子节点数,防止过拟合;
如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征多,可以加限制,具体的值可以通过交叉验证得到。
|
class_weight
|
样本类别权重
|
【dict, list of dicts, balanced】默认None,指定样本各类别的权重,主要是为了防止训练集某些类别的样本过多,导致训练的决策树过于偏向这些类别.
“balanced":自动计算,样本量少的类别对应的样本权重会高;
注意,对于多输出(包括多标记),应为其自己的dict中的每个列的每个类定义权重。例如,对于四类多标签分类权重应为[{0:1,1:1},{0:1,1:5},{0:1,1:1},{0:1,1: 1}]而不是[{1:1},{2:5},{3:1},{4:1}]。
|
min_inpurity_split
|
信息增益的阀值(已弃用)
|
策树在创建分支时,信息增益必须大于这个阈值,否则不分裂。
|
min_impurity_decrease
|
节点划分最小不纯度
|
【float】。默认值为0。限制决策树的增长,节点的不纯度(基尼系数,信息增益,均方差,绝对差)必须大于这个阈值,否则该节点不再生成子节点。
|
random_state
|
|
默认是None,【int, randomSate instance, None】
|
presort
|
|
布尔型,默认是False,表示在进行拟合之前,是否预分数据来加快树的构建。
对于数据集非常庞大的分类,presort=true将导致整个分类变得缓慢;当数据集较小,且树的深度有限制,presort=true才会加速分类。
|
Spark scala随机森林参数说明
setLabelCol
|
设置标签列
|
标签列的名称
|
setFeaturesCol
|
设置特征列
|
训练集DF中存储特征数据的列名
|
numTrees
|
决策树的个数
|
整型,默认20,增加决策树的个数会降低预测结果的方差,这样在测试时会有更高的accuracy。训练时间大致与numTrees呈线性增长关系。
|
setImpurity
|
不纯度函数
|
字符串,默认是"gini", "gini"or "entropy"
|
setMaxBins
|
离散化"连续特征"的最大划分数
|
整型,默认32,离散连续性变量时最大的分箱数,增加maxBins允许考虑更多分割候选项并进行细粒度分割决策, 但同时也增加了计算代价。
注:maxBins参数至少为任何分类特征的最大类别数M
|
setMaxDepth
|
树的最大深度
|
整型,默认5,更深的树木更具表现力(可能允许更高的准确性),但训练成本更高,容易过拟合。
但由于其它终止条件或者是被剪枝的缘故,最终的决策树的深度可能要比maxDepth小
|
setMinInfoGain
|
一个节点分裂的最小信息增益
|
值为[0,1],最小信息增益(设置阈值),小于该值将不再继续分叉
|
setMinInstancesPerNode
|
每个节点包含的最小样本数
|
如果某个节点的样本数量小于该值,则该节点将不再被分叉。(设置阈值)
|
setSeed
|
随机种子
|
长整型
|
numClasses
|
类的数量
|
|
Algo
|
决策树类型
|
分类或回归
|
setMaxMemoryInMB
|
收集足够统计信息的内存量
|
默认值为256 MB,以允许决策算法在大多数情况下工作。增加maxMemoryInMB可以通过允许更少的数据传递来加快训练速度(如果内存可用)。但是,随着maxMemoryInMB增长,可能会有减少的回报,因为每次迭代的通信量可以与maxMemoryInMB成比例。
|
subsamplingRate
|
学习决策树的训练数据的分数
|
此参数与训练树基础算法(使用RandomForest和GradientBoostedTrees)最相关,其中对原始数据进行子采样非常有用。对于训练单个决策树,该参数不太有用,因为训练实例的数量通常不是主要约束。
|
setPredictionCol
|
预测结果存储列
|
默认是"predict"
|
setProbabilityCol
|
类别预测结果的条件概率存储列
|
默认是"probability"
|
setRawPredictionCol
|
原始的算法预测结果存储列
|
默认是"rawPrediction"
|
Scala语言,随机森林调用及参数示例代码:
import org.apache.spark.ml.classificationRandomForestClassifier
val rf = new RandomForestClassifier().
setLabelCol("indexedLabel").
setFeaturesCol("indexedFeatures").
setNumTrees(numTrees).
setMaxBins(maxBins).
setMaxDepth(maxDepth).
setImpurity(impurity)
|
六、
随机森林优缺点
-
实现比较简单,模型泛化能力强
-
容易实现并行化
-
对于不平衡的数据集来说,它可以平衡误差
-
如果有很大一部分的特征遗失,仍可以维持准确度
-
在训练过程中,能够检测到feature间的互相影响
-
训练速度快,能够得到特征重要性排序
-
能够处理很高维度(feature很多)的数据,并且不用做特征选择(因为特征子集是随机选择的)
-
抗过拟合能力:通过平均决策树,降低过拟合的风险性
-
只有在半数以上的基分类器出现差错时才会做出错误的预测:随机森林非常稳定,即使数据集中出现了一个新的数据点,整个算法也不会受到过多影响,它只会影响到一颗决策树,很难对所有决策树产生影响。
-
比决策树算法更复杂,计算成本更高
-
对于小数据或者低维数据(特征较少的数据),可能不能产生很好的分类。(处理高维数据,处理特征遗失数据,处理不平衡数据是随机森林的长处)
-
无法控制模型内部的运行。只能在不同的参数和随机种子之间进行尝试。
-
随机森林在解决回归问题时,并没有像它在分类中表现的那么好,这是因为它并不能给出一个连续的输出。当进行回归时,随机森林不能够做出超越训练集数据范围的预测,这可能导致在某些特定噪声的数据进行建模时出现过度拟合
七、
应用领域
-
预测疾病的风险和病患者的易感性
-
做市场营销模拟的建模,统计客户来源,保留和流失
八、
随机森林代码
scala代码:
val labelIndexer = new StringIndexer().
setInputCol("label").
setOutputCol("indexedLabel").
fit(data)
// Automatically identify categorical features, and index them.
// Set maxCategories so features with > 4 distinct values are treated as continuous.
val featureIndexer = new VectorIndexer().
setInputCol("features").
setOutputCol("indexedFeatures").
setMaxCategories(4).
fit(data)
// Split the data into training and test sets (30% held out for testing)
val Array(trainingData, testData) = data.randomSplit(Array(0.7, 0.3))
// Train a RandomForest model.
val rf = new RandomForestClassifier().
setLabelCol("indexedLabel").
setFeaturesCol("indexedFeatures").
setNumTrees(numTrees).
setMaxBins(maxBins).
setMaxDepth(maxDepth).
setImpurity(impurity)
// Convert indexed labels back to original labels.
val labelConverter = new IndexToString().
setInputCol("prediction").
setOutputCol("predictedLabel").
setLabels(labelIndexer.labels)
// Chain indexers and forest in a Pipeline
val pipeline = new Pipeline().
setStages(Array(labelIndexer, featureIndexer, rf, labelConverter))
// Train model. This also runs the indexers.
val model = pipeline.fit(trainingData)
数据分析(三)实战——分类模型(随机森林与 AdaBoost )基本信息数据预处理观察数据集特点数据集划分特征选择异常值检测离散化标准化模型训练分类器选择评估指标选择训练过程默认参数训练结果参数调整最优训练结果结语
前言:根据个人的学习经历,最无奈的就是前面学习了一大堆的零碎知识点,却压根不知道怎么去使用,更不清楚前面所学的哪个知识点可以在哪里派上用场。所以这第三篇文章笔者打算先拿一个简单的案例...
分布式拒绝服务(distributed denial-of-service,DDoS)是目前常见的网络攻击方式之一。基于机器学习算法(SVM、HMM等)的DDoS攻击检测技术取得一些进展,但还存在着样本数量过多时易发生过拟合和未充分利用上下文信息等不足。为了弥补以上不足,提出一种基于随机森林的DDoS攻击检测方法,将数据流信息熵作为分类标准,令sourceIP、destinationIP、destinationPort分别代表数据流的源地址、目的地址、目的端口,采用SIDI(sourceIP-destinationIP)、SIDP(sourceIP-destinationPort)和DPDI(destinationPort-destinationIP)三个信息熵来分别表征三种多对一的特征,对TCP洪水攻击、UDP洪水攻击、ICMP洪水攻击等三种常见的攻击方式进行特征分析,在此基础上使用基于随机森林分类模型分别对三类DDoS攻击方式进行分类检测,实验结果表明该模型能够较为准确地区分正常流量和攻击流量,与HMM、SVM方法相比,基于RFC模型的DDoS检测方法有较高的检测率和较低的误报率。
基本上所有的机器学习领域都可以看到集成学习的身影,在现实中集成学习也有相当大的作用,它可以用来做市场营销模拟的建模,统计客户来源,保留和流失,也可用来预测疾病的风险和病患者的易感性。但是相应的,任何模型都有决策边界,n_estimators达到一定的程度之后,随机森林的精确性往往不在上升或开始波动,并且,n_estimators越大,需要的计算量和内存也越大,训练的时间也会越来越长。它的所有基评估器都是决策树,分类树组成的森林就叫做随机森林分类器,回归树所集成的森林就叫做随机森林回归器。
决策树+bagging=随机森林,随机森林是一种比较新的机器学习模型(非线性基于树的模型)集成学习方法。上世纪八十年代Breiman等人发明分类树算法,通过反复二分数据进行分类或回归,计算量大大降低,2001年Breiman把分类树组合成随机森林,即在变量(列)的使用和数据(行)的使用上进行随机化,生成很多分类树,再汇总分类树结果。随机森林在运算量没有显著提高前提下提高了预测精度,随机...
随机森林(Random Forest)是Bagging(一种并行式的集成学习方法)的一个拓展体,它的基学习器固定为决策树,多棵树也就组成了森林,而“随机”则在于选择划分属性的随机,随机森林在训练基学习器时,也采用有放回采样的方式添加样本扰动,同时它还引入了一种属性扰动,即在基决策树的训练过程中,在选择划分属性时,Random Forest先从候选属性集中随机挑选出一个包含K个属性的子集,再从这个子集中选择最优划分属性,一般推荐K=log2(d)。...
随机森林模型:非常典型的集成学习模型
集成模型简介:
集成学习模型使用一系列弱学习器(也称为基础模型或基模型)进行学习,并将各个弱学习器的结果进行整合,从而获得比单个学习器更好的学习效果。
集成学习模型的常见算法有Bagging算法和 Boosting算法两种。
Bagging算法的典型机器学习模型为随机森林模
集成学习模型使用一系列弱学习器(也称为基础模型或基模型)进行学习,并将各个弱学习器的结果进行整合,从而获得比单个学习器更好的学习效果。
集成学习模型的常见算法有Bagging算法和Boosting算法两种。
Bagging算法的典型机器学习模型为随机森林模型,而Boosting算法的典型机器学习模型则为AdaBoost、GBDT、XGBoost和LightGBM模型。
1.1 Bagging算法简介
Bagging算法的原理类似投票,每个弱学习器都有一票,最终根据所有弱学习器的投
1.项目背景
高质量的产品不仅能很好地满足顾客对产品使用功能的需要,获得良好的使用体验,提升企业形象和商誉,同时能为企业减少售后维修成本,增加利润。燃气灶市场已成为继家电市场之后各大电器公司竞争的新战场。某电器公司的燃气灶产品销售额一直在国内处于领先地位,把产品质量视为重中之重,每年都要对其产品质量数据进行分析研究,以期不断完善,精益求精。
2.获取数据
本次建模数据来源于...
集成模型简介
集成学习模型使用一系列弱学习器(也称为基础模型或基模型)进行学习,并将各个弱学习器的结果进行整合,从而获得比单个学习器更好的学习效果。集成学习模型的常见算法有Bagging算法和Boosting算法两种。Bagging算法的典型机器学习模型为随机森林模型,而Boosting算法的典型机器学习模型则为AdaBoost、GBDT、XGBoost和LightGBM模型。
Bagging算法
假设原始数据共有10000条,从中.
利用随机森林(Random forest)算法对数据进行分类,输出分类结果图; 利用验证样本集计算出分类结果的混淆矩阵, 输出分类结果的整体分类精度 和每一类地 物的分类精度。
emmm不要对下面的内容报有太大的期待,要求使用随机森林算法,我尝试了,但失败了,就只是用matlab自己的函数勉强完成了要求。我的工作量大概在于找到这个函数[大哭]
这里就不上传数据了,大概说下数据是啥样子的吧,待分类数据img是一个145乘145乘220的数据,145是位置,220是光谱信息;带标签的验证样本集trainall是
机器学习模型通常分为有监督和无监督学习算法。当我们定义(标记)参数时创建监督模型,包括相关的和独立的。相反,当我们没有定义(未标记)参数时,使用无监督方法。在本文中,我们将关注一个特定的监督模型,称为随机森林,并将演示泰坦尼克号幸存者数据的基本用例。在深入了解随机森林模型的细节之前,重要的是定义决策树、集成模型、Bootstrapping,这些对于理解随机森林模型至关重要。决策树用于回归和分类问题...