机器学习Sklearn实战——adaboost
pandas批量处理体测成绩
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt
data = pd.read_excel("/Users/zhucan/Desktop/18级高一体测成绩汇总.xls")
cond = data["班级"] != "班级"
data = data[cond]data.fillna(0,inplace=True)
data.isnull().any() #没有空数据了
结果:
班级 False
性别 False
姓名 False
1000米 False
50米 False
跳远 False
体前屈 False
引体 False
肺活量 False
身高 False
体重 False
dtype: bool
data.head()
#1000米成绩有string 有int
def convert(x):if isinstance(x,str):minute,second = x.split("'")int(minute)minute = int(minute)second = int(second)return minute + second/100.0else:return x
data["1000米"] = data["1000米"].map(convert)
score = pd.read_excel("/Users/zhucan/Desktop/体侧成绩评分表.xls",header=[0,1])
score
def convert(item):m,s = item.strip('"').split("'")m,s =int(m),int(s)return m+s/100.0score.iloc[:,-4] = score.iloc[:,-4].map(convert)def convert(item):m,s = item.strip('"').split("'")m,s =int(m),int(s)return m+s/100.0score.iloc[:,-2] = score.iloc[:,-2].map(convert)
score
data.columns = ['班级', '性别', '姓名', '男1000', '男50米跑', '跳远', '体前屈', '引体', '肺活量', '身高', '体重']
data["男50米跑"] = data["男50米跑"].astype(np.float)
for col in ["男1000","男50米跑"]:#获取成绩的标准s = score[col]def convert(x):for i in range(len(s)):if x<=s["成绩"].iloc[0]:if x == 0:return 0 #没有参加这个项目return 100elif x>s["成绩"].iloc[-1]:return 0 #跑的太慢elif (x>s["成绩"].iloc[i-1]) and (x<=s["成绩"].iloc[i]):return s["分数"].iloc[i]data[col + "成绩"] = data[col].map(convert)
for col in ['跳远', '体前屈', '引体', '肺活量']:s = score["男"+col]def convert(x):for i in range(len(s)):if x>s["成绩"].iloc[i]:return s["分数"].iloc[i]return 0data[col+"成绩"] = data[col].map(convert)
data.columns
结果:
Index(['班级', '性别', '姓名', '男1000', '男50米跑', '跳远', '体前屈', '引体', '肺活量', '身高','体重', '男1000成绩', '男50米跑成绩', '跳远成绩', '体前屈成绩', '引体成绩', '肺活量成绩'],dtype='object')
#根据索引的顺序,去data取值
cols = ['班级', '性别', '姓名', '男1000','男1000成绩','男50米跑','男50米跑成绩','跳远','跳远成绩','体前屈','体前屈成绩','引体','引体成绩', '肺活量','肺活量成绩','身高','体重']
data[cols]
#计算BMI
data["BMI"] = data["体重"]/data["身高"]
def convert(x):if x>100:return x/100else:return x
data["身高"] = data["身高"].map(convert)
data["BMI"] = data["体重"]/(data["身高"])**2
def convert_bmi(x):if x >= 26.4:return 60elif (x <= 16.4) or (x > 23.3 and x <= 26.3):return 80elif x >= 16.5 and x <= 23.2:return 100else:return 0
data["BMI_score"] = data["BMI"].map(convert_bmi)
#统计分析
data["BMI_score"].value_counts().plot(kind = "pie",autopct = "%0.2f%%")
#统计分析
data["BMI_score"].value_counts().plot(kind = "bar")
data.groupby(["男1000成绩"])["BMI_score"].count().plot(kind = "bar")
adaboost
值越大,特征越明显,越被容易分开;越后面的学习器,权重越大
梯度提升树没有修改原来的数据,使用的是残差,最终结果就是最后一棵树
上面的图不是GBDT
Boosting与Bagging模型相比,Boosting可以同时降低偏差和方差,Bagging只能降低模型的方差。在实际应用中,Boosting算法也还是存在明显的高方差问题,也就是过拟合。
import numpy as np
y = np.array([0,1]*5)
y_ = np.array([0,0,0,0,0,0,0,1,0,1])
w = 0.1*(y != y_).sum()
round(w,1)
结果:
0.3
0.5*np.log((1-0.3)/0.3)
round((0.5*np.log((1-0.3)/0.3)),2)
结果:
0.42
adaboost原理案例举例
from sklearn.ensemble import AdaBoostClassifier
from sklearn import tree
import matplotlib.pyplot as plt
X = np.arange(10).reshape(-1,1)
y = np.array([1,1,1,-1,-1,-1,1,1,1,-1])
ada = AdaBoostClassifier(n_estimators=3)
ada.fit(X,y)
plt.figure(figsize = (9,6))
_ = tree.plot_tree(ada[0])
y_ = ada[0].predict(X),4
y_
结果:
array([ 1, 1, 1, -1, -1, -1, -1, -1, -1, -1])
#误差率
e1 = np.round(0.1*(y != y_).sum(),4)
e1
结果:
0.3
#计算第一棵树权重
#随机森林中每棵树的权重是一样的
#adaboost提升树中每棵树的权重不同
a1 = np.round(1/2*np.log((1-e1)/e1),4)
a1
结果:
0.4236
#样本预测准确:更新的权重
w2 = 0.1*np.e**(-a1*y*y_)
w2 = w2/w2.sum()
np.round(w2,4)
结果:
array([0.0714, 0.0714, 0.0714, 0.0714, 0.0714, 0.0714, 0.1667, 0.1667,0.1667, 0.0714])
#样本预测准确:更新的权重
w2 = 0.1*np.e**(-a1*y*y_)
w2 = w2/w2.sum()
np.round(w2,4)
结果:
array([0.0714, 0.0714, 0.0714, 0.0714, 0.0714, 0.0714, 0.1667, 0.1667,0.1667, 0.0714])
从上述第一轮的整个迭代过程可以看出:被误分类样本的权值之和影响误差率,误差率影响基本分类器在最终分类器中所占的权重
分类函数f1(x)= a1*G1(x)= 0.4236G1(x)
plt.figure(figsize = (9,6))
_ = tree.plot_tree(ada[1])
e2 = 0.0714*3
e2
结果:
0.2142
a2 = np.round(1/2*np.log((1-e2)/e2),4)
a2
结果:
0.6499
y_ = ada[1].predict(X)
#样本预测准确:更新的权重
w3 = w2*np.e**(-a2*y*y_)
w3 = w3/w3.sum()
np.round(w3,4)
结果:
array([0.0454, 0.0454, 0.0454, 0.1667, 0.1667, 0.1667, 0.106 , 0.106 ,0.106 , 0.0454])
plt.figure(figsize = (9,6))
_ = tree.plot_tree(ada[2])
树划分按照gini系数;结果和按照误差率是一致的~
y_ = ada[2].predict(X)
e3 = (w3*(y_ != y)).sum()
a3 = 1/2*np.log((1-e3)/e3)
a3
#样本预测准确:更新的权重
w4 = w3*np.e**(-a3*y*y_)
w4 = w4/w4.sum()
np.round(w4,4)
结果:
array([0.125 , 0.125 , 0.125 , 0.1019, 0.1019, 0.1019, 0.0648, 0.0648,0.0648, 0.125 ])
display(a1,a2,a3)
结果:
0.4236
0.6498960745553556
0.7521752700597043
弱分类器合并成强分类器
综上,将上面计算得到的a1、a2、a3各值代入G(x)中,G(x) = sign[f3(x)] = sign[ a1 * G1(x) + a2 * G2(x) + a3 * G3(x) ],得到最终的分类器为:
G(x) = sign[f3(x)] = sign[ 0.4236G1(x) + 0.6496G2(x)+0.7514G3(x) ]
ada.predict(X)
结果:
array([ 1, 1, 1, -1, -1, -1, 1, 1, 1, -1])
y_predict = a1*ada[0].predict(X) + a2*ada[1].predict(X) +a3*ada[2].predict(X)
y_predict
np.sign(y_predict).astype(np.int)
array([ 1, 1, 1, -1, -1, -1, 1, 1, 1, -1])
机器学习Sklearn实战——adaboost相关推荐
- svd降维 python案例_菜菜的机器学习sklearn实战-----sklearn中的降维算法PCA和SVD
菜菜的机器学习sklearn实战-----sklearn中的降维算法PCA和SVD 概述 从什么叫维度说开来 简单讲,shape中返回了几个数字就是几维. 一张表最多就是一维 当一个数组中存在2张3行 ...
- 菜菜的机器学习sklearn实战-----sklearn入门与决策树
菜菜的机器学习sklearn实战-----sklearn入门与决策树 菜菜的机器学习sklearn实战-----sklearn入门与决策树 sklearn入门 决策树 概述 决策树是如何工作的 skl ...
- 机器学习sklearn实战-----随机森林调参乳腺癌分类预测
机器学习sklearn随机森林乳腺癌分类预测 机器学习中调参的基本思想: 1)非常正确的调参思路和方法 2)对模型评估指标有深入理解 3)对数据的感觉和经验 文章目录 机器学习sklearn随机森林乳 ...
- 机器学习Sklearn实战——其他线性回归模型、逻辑回归
线性回归岭回归套索回归比较 import numpy as np from sklearn.linear_model import LinearRegression,Ridge,Lasso#50样本, ...
- 机器学习Sklearn实战——其他线性模型
其他线性模型 岭回归 相比于传统的ols,在梯度下降的时候多了一项-learning_rate*2aw.无论w是正还是负,都让结果的绝对值变小(让系数变小,防止过拟合) 正则化 欠拟合:系数少, ...
- 机器学习Sklearn实战——手写线性回归
手写线性回归 import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearReg ...
- 机器学习Sklearn实战——线性回归
线性回归 import numpy as np from sklearn.linear_model import LinearRegression import matplotlib.pyplot a ...
- 机器学习Sklearn实战——梯度提升树二分类原理
一.算法使用 (一)创建 (二)参数调整 cross_val_score:求单一参数最合适的值(KNN) GridSearchCV网格搜索:多参数组合最优的值 标准:准确率,精确率,召回率,F1 (三 ...
- 机器学习Sklearn实战——极限森林、梯度提升树算法
极限森林 from sklearn.ensemble import ExtraTreesClassifier,RandomForestClassifier from sklearn.tree impo ...
最新文章
- 同一html页面中不同链接的不同样式
- UA PHYS515A 电磁理论V 电磁波与辐射1 电磁波的方程
- Leetcode 64 最小路径和 (每日一题 20210721)
- 36个非常有趣的互动网站设计作品范例
- python 数据库模块
- Apache20、lighttpd、nginx的比较[zt]
- 面试题——C++/C
- Leetcode每日一题:56. I. 数组中数字出现的次数
- VUE2.0增删改查附编辑添加model(弹框)组件共用
- 科大讯飞/百度/阿里/腾讯(BAT)智能语音识别(ASR)性能对比选择预计价格分享 - pytorch中文网...
- JMP比较组均值,检查差异
- java 静态方法调用的问题
- Linksys E 刷Tomato shibby
- 五、服务总线 - Bus
- ASP.NET Core 2.1 开发跨平台应用教程
- 应用“真心话大冒险”项目总结
- 个人公众号注销方法_微信公众号怎么注销,注销方法
- 51单片机应用篇-- --智能门锁
- Spacy en_core_web_sm
- mysql本周 下周下月,mysql 日期计算,今天,明天,本周,下周,本月,下月
热门文章
- tcp c++ bind 端口_计算机端口到底是什么?
- 结巴分词jieba添加自定义词典
- mysql crash_Mysql 无故crash
- blob字段乱码怎么处理_金九银十,你准备好了吗?没点Python面试题干货怎么行?(一)...
- java web 购物车_java web开发之实现购物车功能
- 中操作日志文件记录的是什么_SpringBoot+AOP实现用户操作日志的记录
- 最新的ndkr20编译c_史上最优雅的NDK加载pass方案
- 剪切粘贴时总是上次的内容_【Procreate 迷你课堂】#4 三指快速拷贝及粘贴
- Leetcode 739. 每日温度 (每日一题 20211014)
- 判断字符串数组中是否所有字符只出现了一次