本文主要是介绍三个臭皮匠——集成学习AdaBoost简单代码实现示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
转载自[https://zhuanlan.zhihu.com/p/27126737]
三个臭皮匠——AdaBoost简单代码实现示例
- 转载内容(引子)
- 第一个学习器
- 封装函数(python)
- 第一轮误差
- 第二个学习器
- 第二轮误差
- 第三个学习器
- 第三轮误差
- 总结
转载内容(引子)
第一个学习器
返回顶部
import numpy as np
import pandas as pddata = {'x':[i for i in range(10)], 'y':[1, 1, 1, -1, -1, -1, 1, 1, 1, -1]}
df = pd.DataFrame(data, columns=['x', 'y'])
df['w'] = 0.1
df
x | y | w | |
---|---|---|---|
0 | 0 | 1 | 0.1 |
1 | 1 | 1 | 0.1 |
2 | 2 | 1 | 0.1 |
3 | 3 | -1 | 0.1 |
4 | 4 | -1 | 0.1 |
5 | 5 | -1 | 0.1 |
6 | 6 | 1 | 0.1 |
7 | 7 | 1 | 0.1 |
8 | 8 | 1 | 0.1 |
9 | 9 | -1 | 0.1 |
封装函数(python)
返回顶部
正函数(小于分界点为1,大于分界点为-1,reverse = True)
负函数(小于分界点为-1,大于分界点为1,reverse = False)
def find_min(df, reverse=True):# 正函数g_p = lambda x,s:int(x < s) * 2 - 1 # 满足时1 * 2 - 1 = 1;不满足时0 * 2 - 1 = -1# 负函数g_n = lambda x,s:int(x > s) * 2 - 1g = g_p if reverse else g_nx = df['x']e_idx = 1 # 误差权重初值x_idx = 0 # 误差权重初值对应分界点 for i in x:df_temp = df.copy(deep=True)df_temp['e'] = 0 # 将['e']属性先统一赋值0df_temp['G'] = df_temp['x'].apply(lambda x: g(x, i - 0.5))df_temp.loc[df_temp['y'] != df_temp['G'], ['e']] = df_temp['w'] # 当['y']属性与['G']属性不一致时,['e']为其权重e = df_temp['e'].sum() # 误差(['y']与['G']不一致)权重求和if e < e_idx: # 找最小误差权重及其对应分界点e_idx, x_idx = e, (i - 0.5)return g, round(e_idx, 3), round(x_idx, 1)
def find_func(df):g_p, e_p, s_p = find_min(df) # 正函数返回误差及对应分界点g_n, e_n, s_n = find_min(df, reverse = False) # 负函数返回误差及对应分界点if e_p < e_n: # 选择误差较小的正函数(或负函数)return g_p, e_p, s_preturn g_n, e_n, s_n
def alpha(df):g, e, split = find_func(df)alpha = round((1.0 / 2) * (np.log(1 - e) - np.log(e)), 4)df['G'] = df['x'].apply(lambda x: g(x, split))df['w'] = round(df['w']* np.exp(-alpha * df['y'] * df['G']), 4)df['w'] = round(df['w'] / (df['w'].sum()), 4)return g, split, alpha
g1, split1, alpha1 = alpha(df)
alpha1
0.4236
func =lambda x:np.sign(alpha1 * g1(x, split1))
df['G'] = df['x'].apply(lambda x: int(func(x)))
df
x | y | w | G | |
---|---|---|---|---|
0 | 0 | 1 | 0.0715 | 1 |
1 | 1 | 1 | 0.0715 | 1 |
2 | 2 | 1 | 0.0715 | 1 |
3 | 3 | -1 | 0.0715 | -1 |
4 | 4 | -1 | 0.0715 | -1 |
5 | 5 | -1 | 0.0715 | -1 |
6 | 6 | 1 | 0.1666 | -1 |
7 | 7 | 1 | 0.1666 | -1 |
8 | 8 | 1 | 0.1666 | -1 |
9 | 9 | -1 | 0.0715 | -1 |
第一轮误差
返回顶部
df.loc[df['y'] != df['G'], ['x']].count()
x 3
dtype: int64
第二个学习器
返回顶部
g2, split2, alpha2 = alpha(df)
alpha2
0.6505
func =lambda x:np.sign(alpha1 * g1(x, split1) + alpha2 * g2(x, split2))
df['G'] = df['x'].apply(lambda x: int(func(x)))
df
x | y | w | G | |
---|---|---|---|---|
0 | 0 | 1 | 0.0454 | 1 |
1 | 1 | 1 | 0.0454 | 1 |
2 | 2 | 1 | 0.0454 | 1 |
3 | 3 | -1 | 0.1669 | 1 |
4 | 4 | -1 | 0.1669 | 1 |
5 | 5 | -1 | 0.1669 | 1 |
6 | 6 | 1 | 0.1059 | 1 |
7 | 7 | 1 | 0.1059 | 1 |
8 | 8 | 1 | 0.1059 | 1 |
9 | 9 | -1 | 0.0454 | -1 |
第二轮误差
返回顶部
df.loc[df['y'] != df['G'], ['x']].count()
x 3
dtype: int64
第三个学习器
返回顶部
g3, split3, alpha3 = alpha(df)
alpha3
0.7514
func =lambda x:np.sign(alpha1 * g1(x, split1) + alpha2 * g2(x, split2) + alpha3 * g3(x, split3))
df['G'] = df['x'].apply(lambda x: int(func(x)))
df
x | y | w | G | |
---|---|---|---|---|
0 | 0 | 1 | 0.1248 | 1 |
1 | 1 | 1 | 0.1248 | 1 |
2 | 2 | 1 | 0.1248 | 1 |
3 | 3 | -1 | 0.1021 | -1 |
4 | 4 | -1 | 0.1021 | -1 |
5 | 5 | -1 | 0.1021 | -1 |
6 | 6 | 1 | 0.0649 | 1 |
7 | 7 | 1 | 0.0649 | 1 |
8 | 8 | 1 | 0.0649 | 1 |
9 | 9 | -1 | 0.1248 | -1 |
第三轮误差
返回顶部
df.loc[df['y'] != df['G'], ['x']].count()
x 0
dtype: int64
总结
“三个臭皮匠抵过一个诸葛亮”,多个弱分类器(准确率大于50%)串起来(协作)能达到很好的准确度。
欢迎关注,敬请点赞!
返回顶部
这篇关于三个臭皮匠——集成学习AdaBoost简单代码实现示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!