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相关推荐

  1. svd降维 python案例_菜菜的机器学习sklearn实战-----sklearn中的降维算法PCA和SVD

    菜菜的机器学习sklearn实战-----sklearn中的降维算法PCA和SVD 概述 从什么叫维度说开来 简单讲,shape中返回了几个数字就是几维. 一张表最多就是一维 当一个数组中存在2张3行 ...

  2. 菜菜的机器学习sklearn实战-----sklearn入门与决策树

    菜菜的机器学习sklearn实战-----sklearn入门与决策树 菜菜的机器学习sklearn实战-----sklearn入门与决策树 sklearn入门 决策树 概述 决策树是如何工作的 skl ...

  3. 机器学习sklearn实战-----随机森林调参乳腺癌分类预测

    机器学习sklearn随机森林乳腺癌分类预测 机器学习中调参的基本思想: 1)非常正确的调参思路和方法 2)对模型评估指标有深入理解 3)对数据的感觉和经验 文章目录 机器学习sklearn随机森林乳 ...

  4. 机器学习Sklearn实战——其他线性回归模型、逻辑回归

    线性回归岭回归套索回归比较 import numpy as np from sklearn.linear_model import LinearRegression,Ridge,Lasso#50样本, ...

  5. 机器学习Sklearn实战——其他线性模型

    其他线性模型 岭回归   相比于传统的ols,在梯度下降的时候多了一项-learning_rate*2aw.无论w是正还是负,都让结果的绝对值变小(让系数变小,防止过拟合) 正则化  欠拟合:系数少, ...

  6. 机器学习Sklearn实战——手写线性回归

    手写线性回归 import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearReg ...

  7. 机器学习Sklearn实战——线性回归

    线性回归 import numpy as np from sklearn.linear_model import LinearRegression import matplotlib.pyplot a ...

  8. 机器学习Sklearn实战——梯度提升树二分类原理

    一.算法使用 (一)创建 (二)参数调整 cross_val_score:求单一参数最合适的值(KNN) GridSearchCV网格搜索:多参数组合最优的值 标准:准确率,精确率,召回率,F1 (三 ...

  9. 机器学习Sklearn实战——极限森林、梯度提升树算法

    极限森林 from sklearn.ensemble import ExtraTreesClassifier,RandomForestClassifier from sklearn.tree impo ...

最新文章

  1. 同一html页面中不同链接的不同样式
  2. UA PHYS515A 电磁理论V 电磁波与辐射1 电磁波的方程
  3. Leetcode 64 最小路径和 (每日一题 20210721)
  4. 36个非常有趣的互动网站设计作品范例
  5. python 数据库模块
  6. Apache20、lighttpd、nginx的比较[zt]
  7. 面试题——C++/C
  8. Leetcode每日一题:56. I. 数组中数字出现的次数
  9. VUE2.0增删改查附编辑添加model(弹框)组件共用
  10. 科大讯飞/百度/阿里/腾讯(BAT)智能语音识别(ASR)性能对比选择预计价格分享 - pytorch中文网...
  11. JMP比较组均值,检查差异
  12. java 静态方法调用的问题
  13. Linksys E 刷Tomato shibby
  14. 五、服务总线 - Bus
  15. ASP.NET Core 2.1 开发跨平台应用教程
  16. 应用“真心话大冒险”项目总结
  17. 个人公众号注销方法_微信公众号怎么注销,注销方法
  18. 51单片机应用篇-- --智能门锁
  19. Spacy en_core_web_sm
  20. mysql本周 下周下月,mysql 日期计算,今天,明天,本周,下周,本月,下月

热门文章

  1. tcp c++ bind 端口_计算机端口到底是什么?
  2. 结巴分词jieba添加自定义词典
  3. mysql crash_Mysql 无故crash
  4. blob字段乱码怎么处理_金九银十,你准备好了吗?没点Python面试题干货怎么行?(一)...
  5. java web 购物车_java web开发之实现购物车功能
  6. 中操作日志文件记录的是什么_SpringBoot+AOP实现用户操作日志的记录
  7. 最新的ndkr20编译c_史上最优雅的NDK加载pass方案
  8. 剪切粘贴时总是上次的内容_【Procreate 迷你课堂】#4 三指快速拷贝及粘贴
  9. Leetcode 739. 每日温度 (每日一题 20211014)
  10. 判断字符串数组中是否所有字符只出现了一次