Adaboost
概述
Adaboost的思想是将关注点放在被错误分类的样本上,减小上一轮被正确分类的样本权值
Adaboost采用加权投票的方法,分类误差小的弱分类器的权重大,而分类误差大的弱分类器的权重小
算法流程
1.
2.
3.
- a.
- b.
- c.
这里隐含两个点
- 1.
- 2.
案例
第二次的迭代中的划分如下
理解
从这个案例里面我们也可以看到,这里用的基分类器还是CART树,只不过
1.这里只有一维数据
2.计算切分点,并没有使用基尼系数,而是直接采用了Adaboost的误差函数
3.扩展一下的话,我们仍然可以使用CART树,对所有特征(多维),所有切分点,依次计算带权重的损失函数(而不是基尼指数)
4.CART替换损失函数有一定的局限性,貌似无法扩展到平方损失函数和交叉熵损失函数(都是连续函数无法转为示性函数I),至少网上我没找到相关资料
5.网上找了些资料,还找到一个CART支持带权重的算法,如下
另外还找到了一位网友的代码,其实现方式的确也是照着这个算法实现的
p_i = 1.0 * value * np.mean(weight_counter.get(key)) / x_num
这句是照着图片里面的p公式写的,的确一模一样,感觉这个算法好像更靠谱些
点击查看代码
"""
定义计算gini系数相关的函数,代码封装到ml_models.utils
"""
import numpy as np
def gini(x, sample_weight=None):
"""
计算基尼系数 Gini(D)
:param x:
:param sample_weight:
:return:
"""
x_num = len(x)
# 如果sample_weight为None设均设置一样
if sample_weight is None:
sample_weight = np.asarray([1.0] * x_num)
x_counter = {}
weight_counter = {}
# 统计各x取值出现的次数以及其对应的sample_weight列表
for index in range(0, x_num):
x_value = x[index]
if x_counter.get(x_value) is None:
x_counter[x_value] = 0
weight_counter[x_value] = []
x_counter[x_value] += 1
weight_counter[x_value].append(sample_weight[index])
# 计算gini系数
gini_value = 1.0
for key, value in x_counter.items():
p_i = 1.0 * value * np.mean(weight_counter.get(key)) / x_num
gini_value -= p_i * p_i
return gini_value
def cond_gini(x, y, sample_weight=None):
"""
计算条件gini系数:Gini(y,x)
"""
x = np.asarray(x)
y = np.asarray(y)
# x中元素个数
x_num = len(x)
# 如果sample_weight为None设均设置一样
if sample_weight is None:
sample_weight = np.asarray([1.0] * x_num)
# 计算
gini_value = .0
for x_value in set(x):
x_index = np.where(x == x_value)
new_x = x[x_index]
new_y = y[x_index]
new_sample_weight = sample_weight[x_index]
p_i = 1.0 * len(new_x) / x_num
gini_value += p_i * gini(new_y, new_sample_weight)
return gini_value
def gini_gain(x, y, sample_weight=None):
"""
gini值的增益
"""
x_num = len(x)
if sample_weight is None:
sample_weight = np.asarray([1.0] * x_num)
return gini(y, sample_weight) - cond_gini(x, y, sample_weight)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)