CART

  1. 分裂规则

    • 将现有节点的数据分裂成两个子集,计算每个子集的gini index

    • 子集的Gini index: \(gini_{child}=\sum_{i=1}^K p_{ti} \sum_{i' \neq i} p_{ti'}=1-\sum_{i=1}^K p_{ti}^2\) , 其中K表示类别个数,\(p_{ti}\)表示分类为i的样本在子集中的比例,gini index可以理解为该子集中的数据被错误分类的期望损失

    • 分裂后的Gini index: \(gini_s= \frac{N_1}{N}gini_{child_1}+\frac{N_2}{N}gini_{child_2}\) ,其中N为分裂之前的样本数,\(N_1\)和\(N_2\)为分裂之后两个子集的样本数

    • 选取使得\(gini_s\)最小的特征和分裂点进行分裂

  2. 减少过拟合

    • 设置树的最大深度(max_depth in sklearn.tree.DecisionTreeClassifier)

    • 设置每个叶子节点的最少样本个数(min_samples_leaf in sklearn.tree.DecisionTreeClassifier)

    • 剪枝

  3. 样本均衡问题

    • 若样本的类别分布极不均衡,可对每个类i赋予一个权重\(w_i\), 样本较少的类赋予较大的权重(class_weight in sklearn.tree.DecisionTreeClassifier),此时算法中所有用到样本类别个数的地方均转换成类别的权重和。例如\(p_{ti}=\frac{w_{i}m_i}{\sum_{i=1}^K w_{i}m_i}\) ,其中\(m_i\)为在子集中类别为\(i\)的样本数。此时分裂后的Gini index为 $$gini_s=\frac{weightsum(N_1)}{weightsum(N)}gini_{child_1}+\frac{weightsum(N_2)}{weightsum(N)}gini_{child_2}$$
  4. 回归问题

    • 和分类问题相似,只是分裂规则中的\(gini_{child}\)变为了mean squared error,即\(MSE_{child}=\frac{1}{N_{child}}\sum_{i \in child}(y_i-\bar{y}_{child})^2\)

Random Forest

  1. 随机性

    • 在每次建立新树的时候通过bootstrap方法从N个训练样本中有放回地随机选出N个新的样本(bootstrap in sklearn.ensemble.RandomForestClassifier)

    • 在每次分裂的时候从所有特征中随机选取部分特征进行查找(max_features in sklearn.ensemble.RandomForestClassifier)

  2. 样本均衡问题

    • 同CART一样,样本较少的类赋予较大的权重(class_weight in sklearn.ensemble.RandomForestClassifier)

    • 需要注意的是权重对于bootstrap的使用并没有影响,即bootstrap方法始终是等概率地从N个样本中选择,sklearn中的源码如下

      if forest.bootstrap:
      n_samples = X.shape[0]
      if sample_weight is None:
      curr_sample_weight = np.ones((n_samples,), dtype=np.float64)
      else:
      curr_sample_weight = sample_weight.copy() #已经包含了class_weight设为'balanced'或dict类型时的类别权重 indices = _generate_sample_indices(tree.random_state, n_samples) #bootstrap
      sample_counts = np.bincount(indices, minlength=n_samples)
      curr_sample_weight *= sample_counts #根据新的样本集合中每个原始样本的个数来调整样本权重
      ### 根据类别权重调整样本权重
      if class_weight == 'subsample':
      with catch_warnings():
      simplefilter('ignore', DeprecationWarning)
      curr_sample_weight *= compute_sample_weight('auto', y, indices)
      elif class_weight == 'balanced_subsample':
      curr_sample_weight *= compute_sample_weight('balanced', y, indices) tree.fit(X, y, sample_weight=curr_sample_weight, check_input=False)
      else:
      tree.fit(X, y, sample_weight=sample_weight, check_input=False)
  3. OOB(out-of-bag estimate)

    • 对每一个训练样本zi=(xi, yi),使用没有选中该样本的那些树构建该样本的随机森林预测

    • 计算所有训练样本的预测准确率(oob_score_ in sklearn.ensemble.RandomForestClassifier)

    • 很明显,只有bootstrap设为True时OOB才是有效的

  4. 特征重要性

    • 在CART构建过程中使用某特征进行分裂导致的gini系数的总的减少越多,那么认为该特征的重要性就越大

    • 随机森林中的特征重要性是各个决策树中的重要性总和或平均(feature_importances_ in sklearn.ensemble.RandomForestClassifier)

CART决策树和随机森林的更多相关文章

  1. [ML学习笔记] 决策树与随机森林(Decision Tree&Random Forest)

    [ML学习笔记] 决策树与随机森林(Decision Tree&Random Forest) 决策树 决策树算法以树状结构表示数据分类的结果.每个决策点实现一个具有离散输出的测试函数,记为分支 ...

  2. R语言︱决策树族——随机森林算法

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:有一篇<有监督学习选择深度学习 ...

  3. web安全之机器学习入门——3.2 决策树与随机森林

    目录 简介 决策树简单用法 决策树检测P0P3爆破 决策树检测FTP爆破 随机森林检测FTP爆破 简介 决策树和随机森林算法是最常见的分类算法: 决策树,判断的逻辑很多时候和人的思维非常接近. 随机森 ...

  4. 逻辑斯蒂回归VS决策树VS随机森林

    LR 与SVM 不同 1.logistic regression适合需要得到一个分类概率的场景,SVM则没有分类概率 2.LR其实同样可以使用kernel,但是LR没有support vector在计 ...

  5. 【Python数据挖掘】决策树、随机森林、Bootsing、

    决策树的定义 决策树(decision tree)是一个树结构(可以是二叉树或非二叉树).其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别. ...

  6. Machine Learning笔记整理 ------ (五)决策树、随机森林

    1. 决策树 一般的,一棵决策树包含一个根结点.若干内部结点和若干叶子结点,叶子节点对应决策结果,其他每个结点对应一个属性测试,每个结点包含的样本集合根据属性测试结果被划分到子结点中,而根结点包含样本 ...

  7. 决策树与随机森林Adaboost算法

    一. 决策树 决策树(Decision Tree)及其变种是另一类将输入空间分成不同的区域,每个区域有独立参数的算法.决策树分类算法是一种基于实例的归纳学习方法,它能从给定的无序的训练样本中,提炼出树 ...

  8. 什么是机器学习的分类算法?【K-近邻算法(KNN)、交叉验证、朴素贝叶斯算法、决策树、随机森林】

    1.K-近邻算法(KNN) 1.1 定义 (KNN,K-NearestNeighbor) 如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类 ...

  9. 美团店铺评价语言处理以及分类(tfidf,SVM,决策树,随机森林,Knn,ensemble)

    第一篇 数据清洗与分析部分 第二篇 可视化部分, 第三篇 朴素贝叶斯文本分类 支持向量机分类 支持向量机 网格搜索 临近法 决策树 随机森林 bagging方法 import pandas as pd ...

随机推荐

  1. Ubuntu14.04部署pyspider的过程

    1.安装,安装官方文档,应该先执行 sudo apt-get install python python-dev python-distribute python-pip libcurl4-opens ...

  2. Python绘图之matplotlib基本语法

    Matplotlib 是一个 Python 的 2D绘图库,通过 Matplotlib,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率谱,条形图,错误图,散点图等.当然他也是可以画出3D图形的 ...

  3. leetCode刷题(使用链表做加法)

    Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 0 -> 8 Explanation: 342 + 465 = ...

  4. python__基础 : 类的__init__,__str__,__del__方法

    __init__:当实例化一个类的时候,首相会执行__new__方法创建一个对象,接下来会执行__init__方法对对象的一些属性进行初始化. 所以如果对象有属性,一般会直接写在__init__方法里 ...

  5. 关于html以及js相关格式验证的记录

    关于html中禁止输入的一些写法主要是实现实时监听值:      下面的例子实现的事只运行输入数字切小数位数不能超过两位的示例.      1. onkeyup事件是在输的时候在键盘松开的时候进行触发 ...

  6. Excel常用的格式处理

    你有没有碰到在Excel中设置了行高自适应后,部分行的行高太小,整体界面不美观的问题呢? 你有没有碰到Excel中的各个sheet页中的各列内容中都有不同个数的回车换行符,内容看起来参差不齐,不美观呢 ...

  7. 网站开发中使用javascript获取浏览器滚动条宽度

    在网站开发中,有时候需要获取浏览器滚动条的宽度,在武汉蚂蹄软件服务中心的技术人员指导之下,我实现了该需求.记录如下: 首先说明一下原理: ①生成一个div,设置滚动条不可见,记录其宽度: ②将上面的d ...

  8. Struts2中的值栈

    一 什么是值栈 值栈: struts2中提供的一种类似于域对象的工具, 用于struts2中的存值和取值. 每次访问Action的时候, 都会创建一个action对象, 而每个action对象中都存在 ...

  9. swagger-ui生成api文档并进行测试

    一.Swagger UI简介 Swagger UI是一个API在线文档生成和测试的利器,目前发现最好用的.它的源码也开源在GitHub上,地址:GitHub: https://github.com/s ...

  10. Spring Security4.1.3实现拦截登录后向登录页面跳转方式(redirect或forward)返回被拦截界面

    一.看下内部原理 简化后的认证过程分为7步: 用户访问网站,打开了一个链接(origin url). 请求发送给服务器,服务器判断用户请求了受保护的资源. 由于用户没有登录,服务器重定向到登录页面 填 ...