CART决策树和随机森林
CART
分裂规则
将现有节点的数据分裂成两个子集,计算每个子集的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\)最小的特征和分裂点进行分裂
减少过拟合
设置树的最大深度(max_depth in sklearn.tree.DecisionTreeClassifier)
设置每个叶子节点的最少样本个数(min_samples_leaf in sklearn.tree.DecisionTreeClassifier)
剪枝
样本均衡问题
- 若样本的类别分布极不均衡,可对每个类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}$$
回归问题
- 和分类问题相似,只是分裂规则中的\(gini_{child}\)变为了mean squared error,即\(MSE_{child}=\frac{1}{N_{child}}\sum_{i \in child}(y_i-\bar{y}_{child})^2\)
Random Forest
随机性
在每次建立新树的时候通过bootstrap方法从N个训练样本中有放回地随机选出N个新的样本(bootstrap in sklearn.ensemble.RandomForestClassifier)
在每次分裂的时候从所有特征中随机选取部分特征进行查找(max_features in sklearn.ensemble.RandomForestClassifier)
样本均衡问题
同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)
OOB(out-of-bag estimate)
对每一个训练样本zi=(xi, yi),使用没有选中该样本的那些树构建该样本的随机森林预测
计算所有训练样本的预测准确率(oob_score_ in sklearn.ensemble.RandomForestClassifier)
很明显,只有bootstrap设为True时OOB才是有效的
特征重要性
在CART构建过程中使用某特征进行分裂导致的gini系数的总的减少越多,那么认为该特征的重要性就越大
随机森林中的特征重要性是各个决策树中的重要性总和或平均(feature_importances_ in sklearn.ensemble.RandomForestClassifier)
CART决策树和随机森林的更多相关文章
- [ML学习笔记] 决策树与随机森林(Decision Tree&Random Forest)
[ML学习笔记] 决策树与随机森林(Decision Tree&Random Forest) 决策树 决策树算法以树状结构表示数据分类的结果.每个决策点实现一个具有离散输出的测试函数,记为分支 ...
- R语言︱决策树族——随机森林算法
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:有一篇<有监督学习选择深度学习 ...
- web安全之机器学习入门——3.2 决策树与随机森林
目录 简介 决策树简单用法 决策树检测P0P3爆破 决策树检测FTP爆破 随机森林检测FTP爆破 简介 决策树和随机森林算法是最常见的分类算法: 决策树,判断的逻辑很多时候和人的思维非常接近. 随机森 ...
- 逻辑斯蒂回归VS决策树VS随机森林
LR 与SVM 不同 1.logistic regression适合需要得到一个分类概率的场景,SVM则没有分类概率 2.LR其实同样可以使用kernel,但是LR没有support vector在计 ...
- 【Python数据挖掘】决策树、随机森林、Bootsing、
决策树的定义 决策树(decision tree)是一个树结构(可以是二叉树或非二叉树).其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别. ...
- Machine Learning笔记整理 ------ (五)决策树、随机森林
1. 决策树 一般的,一棵决策树包含一个根结点.若干内部结点和若干叶子结点,叶子节点对应决策结果,其他每个结点对应一个属性测试,每个结点包含的样本集合根据属性测试结果被划分到子结点中,而根结点包含样本 ...
- 决策树与随机森林Adaboost算法
一. 决策树 决策树(Decision Tree)及其变种是另一类将输入空间分成不同的区域,每个区域有独立参数的算法.决策树分类算法是一种基于实例的归纳学习方法,它能从给定的无序的训练样本中,提炼出树 ...
- 什么是机器学习的分类算法?【K-近邻算法(KNN)、交叉验证、朴素贝叶斯算法、决策树、随机森林】
1.K-近邻算法(KNN) 1.1 定义 (KNN,K-NearestNeighbor) 如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类 ...
- 美团店铺评价语言处理以及分类(tfidf,SVM,决策树,随机森林,Knn,ensemble)
第一篇 数据清洗与分析部分 第二篇 可视化部分, 第三篇 朴素贝叶斯文本分类 支持向量机分类 支持向量机 网格搜索 临近法 决策树 随机森林 bagging方法 import pandas as pd ...
随机推荐
- Node笔记一
什么是javascript? --脚本语言 --运行在浏览器中 --一般用来做客户端页面的交互 javascript运行环境 --运行在浏览器内核中的JS引擎 浏览器这种javascript可以做什么 ...
- python 整理数据中的图片
import shutil import time import pymysql conn=pymysql.connect(host="222",user="root&q ...
- swagger上传文件并支持jwt认证
背景 由于swagger不仅提供了自动实现接口文档的说明而且支持页面调试,告别postman等工具,无需开发人员手动写api文档,缩减开发成本得到大家广泛认可 但是由于swagger没有提供上传文件的 ...
- .NET开发微信小程序-获取OpenId
注:获取当前用户信息只需要用GetUserInfo这个方法就行.这里就不需要提了 前端代码: CallBack:回调函数 function GetOpenID(CallBack){ var appIn ...
- Python_生成大量随机信息
#coding=utf-8 import random import string import codecs ''' 演示如何使用Python标准库random来生成随机数据,这在需要 ''' #常 ...
- WordPress调用特色图片地址源,去除特色图片img标签其他样式
我们在制作WordPress主题时候想要给wordpress特色图片,这也是为了更加的美观,但是我们直接使用wordpress特色图片引用代码的时候却发现,出现下面的情况. wordpress特色图片 ...
- 【转】Java线程面试题 Top 50
不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎.大多数待遇丰厚的Java开发职位都要求开发者精通多线程 ...
- mysql管理工具navicat的快捷键
1. ctrl + q 或者 ctrl+n: 打开新查询窗口 2. ctrl + r: 运行当前窗口内的所有语句 3. ctrl + shit + r: 只运行选中的语句 4. ctrl + w: ...
- linux ulimit 调优
概要:linux系统默认open files数目为1024, 有时应用程序会报Too many open files的错误,是因为open files 数目不够.这就需要修改ulimit和file-m ...
- 关于局域网 手机连接apache服务器报403forbidden错误参考如下2017.6.6
http://www.glbwl.com/wampServer-403-forbidden.html