版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章
报表开发与设计目录7.1什么是报表
7.2帆软产品简介
7.3开发环境准备
7.4快速开发一个报表7.5课后习题
7.1
什么是报表7.1什么是报表报表,作为现代企业信息管理的重要组成部分,不仅以表格、图表等直观形式动态展示数据,还承载着数据深度挖掘与可视化呈现的重任。类别:(1)表格报表(2)图表报表(3)仪表盘报表(4)地图报表(5)交叉表/透视表(6)地图报表(7)热力图7.2
报表开发工具简介7.2报表开发工具简介FineReport是一款专为报表制作、深度分析及高效展示而设计的强大工具,它赋能用户以轻松之姿构建出高度灵活且功能全面的数据分析与报表系统。通过运用FineReport,企业能够显著缩短项目开发与实施的周期,有效控制并降低相关成本,进而从根本上解决企业内部信息孤岛的问题,确保数据资源得以充分挖掘并发挥其应有的价值,驱动企业决策更加精准高效。7.2.1报表开发工具基本功能结构7.3
开发环境准备7.3开发环境准备准备开发环境的具体流程:7.4
快速开发一个报表7.4快速开发一个报表报表设计主要可以分为新建报表、数据准备、报表主体设计、报表预览几大部分。其中报表主体可以分为大标题、小标题、表格数据、结尾几大部分,本小节主要以普通报表为例,讲述如何按照报表设计流程快速设计一张报表。开发效果:7.5
课后习题7.5课后习题1.请简述报表的基本概念及其在企业信息管理中的作用。2.请列举报表的几种类型,并说明每种报表的特点和适用场景。3.请描述帆软产品FineReport的基本功能和特点。4.请解释报表系统的数据层、应用层和展示层的功能和作用。5.请简述FineReport在企业信息化过程中的作用。6.请描述开发报表系统的流程,包括数据连接、数据准备、报表主体设计等步骤。7.请举例说明如何使用FineReport设计一张普通报表,包括数据连接、数据准备、报表主体设计等步骤。第8章
线性回归与逻辑回归本章主要内容8.1线性回归8.2逻辑回归8.3课后习题8.1线性回归数据数据挖掘有价值的知识和信息(如预测发展趋势)数据数据统计统计信息(如环比、同比等)8.1.1线性回归原理——数据挖掘8.1.1线性回归原理——预测数值高尔顿研究父母和孩子身高关系父母和孩子的身高呈现“回归现象”回归算法主要用于“预测数值”假设挖掘模型为y=f(x)表达式为
y=ax+b8.1.1线性回归原理——简单举例历史数据x=10时y=100x=20时y=150训练出a=5\b=50即该模型在该场景应表示为y=5x+50待挖掘数据x=8时预测y=?x=8时预测y=90将历史数据代入模型:10a+b=10020a+b=1508.1.1线性回归原理假设有数据挖掘模型y=f(x)数学表达式为y=ax+b历史数据:当x=1.8时y=4.8
当x=4时y=8.2
当x=8时y=15.2
当x=8.3时y=14.8
当x=9.8时y=17.5......预测:当x=11.4时y=?数据点虽然无法真正用一条线来表示,但是y和x依然趋近于“一次关系”,这时就可以考虑使用“线性回归”8.1.1线性回归原理——多元线性回归序号属性1(x1)属性2(x2)属性3(x3)……属性500(x500)目标属性(y)181001050……705100502102002000……800210003153002800……1200280004780800……7009500581001050……800100506450500……3535000..........................................70017100350……700?假设模型表达式是:y=a1x1+a2x2+a3x3+……+a500x500+b历史数据如下求:第7001个数据中目标属性的取值?8.1.1线性回归原理——多元线性回归假设模型表达式是:y=f(x1,x2,x3...xn)
即:y=a1x1+a2x2+a3x3+……+anxn+b
将a1、a2、a3......an转换成w1、w2、w3......wn
将b转换为w0
原公式变为:y=f(x1,x2,x3...xn)
即:y=w1x1+w2x2+w3x3+……+wnxn+w0引入向量表示法设向量:x=(x0=1,x1,x2,x3...xn)w=(w0,w1,w2,w3...wn)将x和w代入y=f(x1,x2,x3...xn)则有多元线性回归表达:y=f(x)=wx其中w又被称为参数向量,多元线性回归模型训练的目标就是求w8.1.2损失函数与损失函数的解法训练模型的中心思想是让模型预测值与真实值之间的差距尽量小。
可以将这个差距表达为:,其中y是真实值,
是预测值
模型的最终任务是让y和更加接近。
假设一共有m个样本,下标i是样本编号,这m个样本的预测误差值之和是
考虑到误差正负号可能存在抵消,衡量标准改为m个样本的误差平方和
将
代入上面公式,则多元线性回归的损失函数为
8.1.2损失函数与损失函数的解法求损失函数最小值在训练模型时yi和xi都是历史数据的一部分,所以此时的目标就是求解J最小时w的取值,进而确定整个模型的参数。方法一:
求导法方法二:
梯度下降法8.1.2损失函数与损失函数的解法——求导法求导法涉及大量的矩阵运算,为了简便,损失函数书写方式调整为其中y是所有样本真实值组成的向量,w是特征参数组成的向量,X是所有样本数据组成的矩阵。推导f最小时w取值的步骤如下:求极值时导数为0注意:矩阵可逆的一个前提条件是矩阵要满秩(感兴趣的同事可以研究“矩阵的秩”和“多重共线性”问题)8.1.2损失函数与损失函数的解法——梯度下降法有没有求损失函数最小值时不受“前提条件”限制的方法呢?——有,梯度下降法。梯度下降法就是在求函数极值(如最小值)时,通过试探的方法,一步一步找到最小值。以一元函数y=f(x)为例,它的函数图像如右图所示。首先给函数一个x1,得到函数值f(x1),然后在x1处对f(x)求导,沿f(x)值向下方向选取x2,得到f(x2),比较f(x2)和f(x1),可以看到确实达到了函数值“下降”效果。然后再延f(x)在x2处导数向下方向继续寻找x3,以此类推,最终找到最小值。当f(xn)最小时,xn就是函数的极值点。8.1.2损失函数与损失函数的解法——梯度下降法如果是多元函数会是什么样呢?例如J是以w1和w2为变量的多元函数,它的梯度下降求解极值过程如右图所示。对于二元函数f来说,它寻找下降方向(也就是求导)时是针对w1和w2分别求偏导,然后沿着两个变量的方向寻找下一个取值点。当找到最小值时,对应的w1和w2就是函数的极值点。
对于更多元函数来说,已经无法用图像表示梯度下降过程了,但是思路都是一样的,沿着每个变量的下降方向探索。所以对于多元线性回归的损失函数,就是针对w1、w2......wn等变量求偏导,然后沿着它们分别的下降方向探索极值点。8.1.3正则化与过拟合——过拟合问题无论是导数法还是梯度下降法,在求出参数向量w后,模型参数确定,模型训练完毕!!!然而,万事大吉了吗?——需要注意过拟合问题。什么是过拟合?一个学生在备考的时候会做大量的练习题,但是如果考生只会做练习过的题,考试时出现新题就不会了,这就属于过拟合。在机器学习中,如果模型参数求解过程过分依赖训练数据集,就会出现“模型在训练集上表现很好,但在测试集上表现糟糕”的问题,这就是过拟合。避免过拟合穿上马甲我照样认识你8.1.3正则化与过拟合——多元线性回归与过拟合数据挖掘中,过拟合问题并不一定会出现,但“不得不防”。多元线性回归的数学表达式为:y=f(x)=wx+b。这个表达式中参数向量w主要与训练数据集x相关,所以不得不考虑出现过拟合的问题。如果多元线性回归出现了过拟合问题。可以使用以下两种思路解决
方法一:扩大训练集
方法二:使用正则化8.1.3正则化与过拟合——正则化线性回归中的正则化思想:在原始损失函数中,增加由参数向量组成,但与参数向量无关的“惩罚项”。常用两种正则化方式:
L1正则化(lasso回归)L2正则化(岭回归)由于惩罚项的存在,损失函数在求解极值时,w向量需要被考虑两次,惩罚项部分与训练集数据完全没有关系,所以缓解了函数过分依赖于训练集数据。8.1.3正则化与过拟合——正则化(L1和L2的区别)(1)L1正则化(lasso回归)的w参数向量中可能会有0,但L2正则化(岭回归)的参数向量不会出现0;(2)L2正则化(岭回归)可以避免多重共线性,但L1正则化(Lasso回归)没有此功能;L2正则化后,此时对w进行求导取0后变成了如下形式:
其中
肯定可逆,所以w肯定有解(3)Lasso回归是一次运算,因此模型计算速度比岭回归快。一些说明数据表中的列经常被称为:属性、特征、维、列等历史数据一般分为训练集和测试集,训练集就是用于训练模型的数据,测试集是为了检测模型的效果建模的步骤
第零步:与业务部门沟通
第一步:导入数据、探索数据
第二步:进行必要的数据预处理
第三步:建模
第四步:用测试集检验模型预测效果8.1.4线性回归的实现与模型评价——代码实现(以预测波士顿房价案例为例)#第一步:导入数据#导入numpy和pandas数据包importnumpyasnpimportpandasaspd#从boston_lishi.csv文件中导入原始数据df=pd.read_csv(r'E:\boston_lishi.csv',index_col='id')#X为原始数据中不包括target列部分,是由历史数据中“非结果列”组成的数据X=df.loc[:,(df.columns!='target')]#Y为原始数据中target列部分,是由历史数据中“结果列”组成的数据Y=df.loc[:,df.columns=='target']8.1.4线性回归的实现与模型评价——代码实现(以预测波士顿房价案例为例)#第二步:数据预处理#缺失值处理df.dropna()#数据标准化fromsklearn.preprocessingimportMinMaxScalerscaler=MinMaxScaler()X=scaler.fit_transform(X)#其他数据预处理将在第6次课介绍8.1.4线性回归的实现与模型评价——代码实现(以预测波士顿房价案例为例)#第三步建模#将历史数据按照8:2的比例分随机分为训练集和测试集fromsklearn.model_selectionimporttrain_test_splitXtrain,Xtest,Ytrain,Ytest=train_test_split(X,Y,test_size=0.2,random_state=420)#从sklearn的linear字库中导入岭回归工具包#如果引入岭回归的包importRidge;引入lasso回归的包importlassofromsklearn.linear_modelimportLinearRegressionasLR#创建模型reg=LR()#训练模型reg.fit(Xtrain,Ytrain)8.1.4线性回归的实现与模型评价——模型评价(以预测波士顿房价案例为例)#第四步,用测试集检验模型预测效果#使用predict方法,根据Xtest预测测试集的结果result=reg.predict(Xtest)#将测试集真实结果和预测结果进行对比df=pd.DataFrame({'真实结果':Ytest.loc[:,'target'],'预测结果':pd.Series(result.reshape(-1),index=Ytest.index)})print(df)这样能看出模型表现优良吗?8.1.4线性回归的实现与模型评价——模型评价(以预测波士顿房价案例为例)#第四步,用测试集检验模型预测效果#可以使用一些指标来评价模型表现,例如使用R2值评价多元线性回归score=reg.score(Xtest,Ytest)print(score)其中
是所有真实结果的平均值,
是第i个样本的预测值,
是第i个样本的预测值在统计学中,方差除了体现了数据之间的波动性之外,还可以体现数据集所携带的信息量
如果除以m就是数据集真实的方差,也就是数据集真实的信息量。除以m就是一个类方差数据,是真实值与预测值之间的信息差,也就是模型没有拟合出来的信息表达的是模型没有拟合出来的信息量和数据集真实信息量的占比,用1减去它,表达的意思是模型拟合出来的信息量占数据集真实信息量的占比。所以R2越接近1越好。8.1.5重要参数和属性但是LR()括号内是可以传递参数的。线性回归有哪些重要参数可以设置呢?(1)fit_intercept:内容为布尔型,意思是是否考虑使用截距,如果是False就不考虑截距。(2)normalize:内容为布尔型,意思是是否对数据进行标准化,如果是False就不进行标准化,将在第12章详细介绍标准化。(3)n_jobs:内容为整数,意思是计算时设置的任务个数,数值越高,任务越多,计算资源占用的越多。8.1.5重要参数和属性#可以使用coef_属性,查看线性回归各个参数的值print(reg.coef_)8.2逻辑回归逻辑回归逻辑回归“真名”叫logisticRegression,虽然也叫“回归”,但是它确实用于解决预测分类问题。分类问题的预测结果是类别型的(具体的类别叫“标签”)。例如猜一场足球比赛结果,就是通过各种信息,预测“主队赢”、“主队平”、“主队输”三个结果,这三个结果就是标签,预测比赛胜负结果就是典型的分类问题。8.2.1逻辑回归原理序号属性1(x1)属性2(x2)属性3(x3)……属性500(x500)目标属性(y)181001050……70502102002000……80013153002800……120014780800……7001581001050……80006450500……3530..........................................70017100350……700?通过属性1、属性2、属性3......确定目标属性(0或者1)8.2.1逻辑回归原理既然逻辑回归是用于分类问题,那为什么叫回归呢?——因为它的原理与线性回归非常像。
逻辑回归的数据表达式8.2.1逻辑回归原理那如何确定Θ中的各个特征参数呢?同样使用损失函数求极值的方法,但这个损失函数更加复杂,且是通过极大似然估计推导出来的。同样可以使用L1或者L2正则化对损失函数进行改造,改造后的L1或L2正则化如下:这个损失函数的求解过程非常复杂,主要包括随机梯度下降法、牛顿法等逻辑回归简单实现(以乳腺癌预测案例为例)#第一步:导入数据#导入numpy和pandas数据包importnumpyasnpimportpandasaspd#从boston_lishi.csv文件中导入原始数据df=pd.read_csv(r'E:\ruxian_lishi.csv',index_col='Patien')#X为原始数据中不包括target列部分,是由历史数据中“非结果列”组成的数据X=df.loc[:,(df.columns!='target')]#Y为原始数据中target列部分,是由历史数据中“结果列”组成的数据Y=df.loc[:,df.columns=='target']逻辑回归简单实现(以乳腺癌预测案例为例)
#第二步:数据预处理#缺失值处理df.dropna()#数据标准化fromsklearn.preprocessingimportMinMaxScalerscaler=MinMaxScaler()X=scaler.fit_transform(X)#其他数据预处理将在第6次课介绍逻辑回归简单实现(以乳腺癌预测案例为例)
第三步建模#将历史数据按照8:2的比例分随机分为训练集和测试集fromsklearn.model_selectionimporttrain_test_splitXtrain,Xtest,Ytrain,Ytest=train_test_split(X,Y,test_size=0.2,random_state=420)#导入逻辑回归工具包fromsklearn.linear_modelimportLogisticRegressionasLR#创建模型reg=LR()#训练模型reg.fit(Xtrain,Ytrain)逻辑回归简单实现(以乳腺癌预测案例为例)
#第四步,用测试集检验模型预测效果#使用predict方法,根据Xtest预测测试集的结果result=reg.predict(Xtest)#将测试集真实结果和预测结果进行对比df=pd.DataFrame({'真实结果':Ytest.loc[:,'target'],'预测结果':pd.Series(result,index=Ytest.index)})print(df)这样能看出模型表现优良吗?逻辑回归简单实现(以乳腺癌预测案例为例)
#第四步,用测试集检验模型预测效果#可以使用一些指标来评价模型表现,例如使用准确率评价逻辑回归score=reg.score(Xtest,Ytest)print(score)准确率:预测对的样本数/总样本数表达的是模型没有拟合出来的信息量和数据集真实信息量的占比,用1减去它,表达的意思是模型拟合出来的信息量占数据集真实信息量的占比。所以R2越接近1越好。准确率固然是分类模型最重要的衡量指标,但准确率高一定表示模型表现好吗?假设生活中如下案例:肺癌的发病率约千分之三,假设1000人中有3人是肺癌,模型预测结果为1000人均健康,此时模型的准确率是99.7%,但实际情况是“一个病人没检查出来”,这样的模型是我们想要的吗?8.2.2逻辑回归的实现方法与模型评价(混淆矩阵)8.2.2逻辑回归的实现方法与模型评价——混淆矩阵实现#生成混淆矩阵fromsklearn.metricsimportconfusion_matrixasCMcm=CM(Ytest,result,labels=[0,1])print(cm)#计算recallfromsklearn.metricsimportroc_curveFPR,recall,threshold=roc_curve(Ytest,result,pos_label=1)print(recall)8.2.2逻辑回归的实现方法与模型评价——AUC值AUC值其实是在画ROC曲线时的曲线面积(ROC曲线在二分类问题时,可以通过可视化方式直观看到模型在遇到类不均衡问题时的表现,感兴趣的同学可以自行研究),AUC值越大,分类在类不均衡问题中表现越好。AUC值实现#计算AUC值fromsklearn.metricsimportroc_auc_scorearea=roc_auc_score(Ytest,result)print(area)8.2.2逻辑回归的实现方法与模型评价——AUC值#计算AUC值fromsklearn.metricsimportroc_auc_scorearea=roc_auc_score(Ytest,result)print(area)AUC值,值越大,效果越好8.2.3重要参数和调参方法如果模型的表现不好怎么办?可以通过调整超参数取值,优化模型表现。所谓超参数就是模型中需要人为设定的参数,例如逻辑回归L1正则化和L2正则化中的C就是超参数,可以通过改变C值的大小,调整惩罚项在损失函数中的比例,改变模型训练后Θ的取值,从而改变模型的表现。8.2.3重要参数和调参方法——超参数penalty:内容是字符串,可以是“l1”或者“l2”,意思是使用L1或者L2正则化。solver:内容是字符串,包括“liblinear”、“lbfgs”、“newton-cg”、“sag”,意思是使用哪种方法对损失函数进行极值求解。这几个选项中“liblinear”是坐标轴下降法、“lbfgs”是牛顿法、“newton-cg”是另一种牛顿法、“sag”是随机梯度下降。其中坐标轴下降法适用于小数据集,也是默认值,而牛顿法和随机梯度下降适用于大数据集因为速度更快。max_iter:内容是整数型,意思是当solver选择牛顿法或者随机梯度下降法,就会涉及到算法的迭代(思路类似于梯度下降法找到极值点的过程),max_iter就是指定迭代次数,可以避免因迭代次数过多引起模型性能太低。但如果太小可能会无法收敛(找不到损失函数极值),所以一般根据自己设备的性能而定。C:内容是正浮点型数,L1正则化和L2正则化损失函数中的C,C越大,惩罚项重要程度越低。8.2.3重要参数和调参方法——参数选择学习曲线:例如针对逻辑回归的参数C,我们可以指定一个取值范围,然后计算每一个取值时模型的准确率,以C的取值为横坐标,以每个取值对应的模型准确率为纵坐标,绘制一条曲线,可以看出模型准确率随C取值的变化及峰值,从而选择参数取值。8.2.3重要参数和调参方法——交叉验证例如有1000条历史数据训练模型,需要将这1000条数据分成训练集和测试集。可以采用train_test_split方法按照一定比例随机选择训练接和测试集,虽然具有一定代表性,但不能完全看出模型训练的水平。这时就可以使用交叉验证,它相当于将1000条历史数据分成了10份(又称10折),第一次用其中1份作测试集,另外9份作训练集,第二次换1份作测试集,另外9份作训练集,以此类推,迭代10次,得到10个准确率。这样训练集和测试集涵盖了整个历史数据集,可以针对这10次的准确率做平均值,求得的准确率更有说服力。8.2.3重要参数和调参方法——交叉验证+学习曲线的实现#C的取值在0.4到30之间,检查模型的表现#引入交叉验证工具包fromsklearn.model_selectionimportcross_val_score#设置列表score,以便承接各个取值后交叉验证的结果score=[]#C在0.4到30间分别取30个值,检查模型表现foriinnp.linspace(0.4,30,30):#针对不同取值分别建模reg=LR(penalty='l1',solver='liblinear',C=i,max_iter=100)#针对每次取值的模型进行10折交叉验证,并对结果取平均值s=cross_val_score(reg,X,Y,cv=10).mean()
#将每次取值模型交叉验证表现装入列表score中
score.append(s)8.2.3重要参数和调参方法——交叉验证+学习曲线的实现(续)#绘制学习曲线importmatplotlib.pyplotaspltplt.plot(np.linspace(0.3,30,30),score,color='blue',label='cross_val_score')plt.legend()plt.show()#显示最终结果score=np.array(score)print("模型表现最好的准确率:")print(np.max(score))print("模型表现最好时C的取值:")print(np.linspace(0.3,30)[np.argmax(score)])8.3课后习题课后习题1.使用线性回归模型,重新做一遍波士顿房价预测实例,要求修改random_state数值,并通过train_test_split中的test_size参数将训练集和测试集比例修改为7:3。2.使用逻辑回归模型,重新做一遍乳腺癌预测实例,要求修改random_state数值,并通过train_test_split中的test_size参数将训练集和测试集比例修改为7:3,并使用学习曲线方式对C进行调参。第9章
决策树与随机森林本章主要内容9.1决策树9.2回归树9.3随机森林9.4课后习题9.1决策树9.1.1决策树的原理决策树:用于解决分类问题生活中的例子:母亲给女儿介绍一个男朋友,女儿根据各种信息判断是否同意去相亲叶子节点中间节点根节点9.1.2如何建立一棵决策树思路一:基于信息熵建树ID3、C4.5CART思路二:基于基尼系数建树9.1.2如何建立一棵决策树——信息熵信息熵是用来衡量一个随机变量出现的期望值。信息的不确定性越大,熵的值也就越大,出现的各种情况也就越多。例如“下一届国际足联男子世界杯冠军”这个句话的信息熵就大于“下一届国际乒联男子世界杯冠军”,因为前者在事件没有发生时的不确定性很高,冠军可能的情况包括法国队、巴西队、阿根廷队、德国队、英格兰队、意大利队......,而后者在事件没有发生时的不确定性很低,冠军可能的情况只有中国队。信息熵的计算公式为:
,其中X是所有发生的可能性,x是某一种可能性。以“2022年国际足联男子世界杯冠军”这个事件为例,假设共有8支队伍有可能夺冠,每支队伍夺冠的可能性都是1/8。则“2022年国际足联男子世界杯冠军”这件事的信息熵为:决策树的两种子方法ID3和C4.5就是使用信息熵作为建树的理论依据。9.1.2如何建立一棵决策树——ID3建树过程
ID3使用了基于信息熵计算的信息增益方法,信息增益公式为:
其中Gain(X)表示某一个特征的信息增益,ci表示第i中分类,xi表示某一特征的第i种数值步骤1:info(c)部分计算,即针对标签(是否买电脑)的信息熵计算:买电脑的样本为9,即买电脑的概率是9/14,不买电脑的概率是5/14。因此:info(c)=-9/14log2(9/14)-5/14log2(5/14)≈0.9409.1.2如何建立一棵决策树——ID3建树过程
ID3使用了基于信息熵计算的信息增益方法,信息增益公式为:
其中Gain(X)表示某一个特征的信息增益,ci表示第i中分类,xi表示某一特征的第i种数值步骤2:info(c|年龄)的计算,即针对年龄特征和标签的条件信息熵的计算:在年龄特征,一共分为三种情况:<30、30-40、>40
情况1:当年龄<30时,一共有5个样本,其中2个买电脑了,3个没买,即info(c|x<30)=-2/5log2(2/5)-3/5log2(3/5)
情况2:当30<=年龄<=40时,一共有4个样本,其中3个买电脑了,1个没买,即info(c|30<=x<=30)=-3/4log2(3/4)-1/4log2(1/4)情况3:当年龄>40时,一共有5个样本,其中3个买电脑了,2个没买,即info(c|x>40)=-3/5log2(3/5)-2/5log2(2/5)9.1.2如何建立一棵决策树——ID3建树过程
ID3使用了基于信息熵计算的信息增益方法,信息增益公式为:
其中Gain(X)表示某一个特征的信息增益,ci表示第i中分类,xi表示某一特征的第i种数值步骤3:计算Gain(年龄)Gain(年龄)=
info(c)
-5/14*info(c|x<30)
-4/14*info(c|30<=x<=40)
-5/14*info(c|x>40)
≈0.1509.1.2如何建立一棵决策树——ID3建树过程
ID3使用了基于信息熵计算的信息增益方法,信息增益公式为:
其中Gain(X)表示某一个特征的信息增益,ci表示第i中分类,xi表示某一特征的第i种数值步骤4:根据前三步计算方法,分别计算出:
Gain(年龄)
≈0.150
Gain(收入)
≈0.090
Gain(学生)
≈0.016
Gain(信用)
≈0.048其中“年龄”的信息增益是最大的9.1.2如何建立一棵决策树——ID3建树过程
ID3使用了基于信息熵计算的信息增益方法,信息增益公式为:
其中Gain(X)表示某一个特征的信息增益,ci表示第i中分类,xi表示某一特征的第i种数值第五步:根据第四步结果:选择信息增益最大的特征“年龄”作为根节点根据年龄将样本进行了区分:年龄小于30的节点落在了左侧面年龄在30到40之间的节点落在了中间年龄大于40的节点落在了右侧。9.1.2如何建立一棵决策树——ID3建树过程
9.1.2如何建立一棵决策树——ID3建树过程
针对这个表继续计算,每个特征的信息增益,Gain(收入)≈0.971Gain(学生)≈0.420Gain(信用)≈0.020。因此使用“收入”进行下一步分裂此次判断已经有了最终结果,即“买”或“不买”,这就是叶子节点。其他节点以此类推9.1.2如何建立一棵决策树——C4.5建树过程ID3算法并不是完美的,在上面的例子中将“年龄”、“收入”、“学生”、“信用”作为特征构建决策树。如果将“序号”也含在特征中,看看“序号”的信息增益。如果将“序号”也含在特征中,看看“序号”的信息增益。info(c)≈0.940Info(c|x=1)=-1/1*log2(1/1)-0/1*log2(0/1)=0Info(c|x=2)=-1/1*log2(1/1)-0/1*log2(0/1)=0Info(c|x=3)=-1/1*log2(1/1)-0/1*log2(0/1)=0......Info(c|x=14)=-1/1*log2(1/1)-0/1*log2(0/1)=0所以Gain(序号)=info(c)-0≈0.940这时发现序号的信息增益最大,应该首先以序号为根节点进行判断,可是这没有意义,序号列信息增益大的原因完全是因为序号的种类“太琐碎了”,从而导致条件信息熵是0。9.1.2如何建立一棵决策树——C4.5建树过程为了解决这个中由于某一个属性取值种类太多造成的问题,又引入了信息增益率的概念。信息增益率的公式为:GainRatio(X)=Gain(X)/SplitInfo(X)。其中SplitInfo(X)是针对X特征本身的信息熵计算SplitInfo(年龄),年龄3种可能的概率分别是
小于30岁:5/1430到40岁:4/14大于40岁:5/14
则SplitInfo(年龄)=-5/14*log2(5/14)-4/14*log2(4/14)-5/14*log2(5/14)≈0.189由ID3计算过程可知:Gain(年龄)≈0.150所以GainRatio(年龄)=0.150/0.189≈0.7949.1.2如何建立一棵决策树——C4.5建树过程
序号列的信息增益率呢?序号列一共有14种取值,每种取值概率都是1/14,因此SplitInfo(序号)=-1/14*log2(1/14)-1/14*log2(1/14)......-1/14*log2(1/14)≈3.8由前面(PPT第12页)计算可知:Gain(序号)=0.940所以GainRatio(序号)=0.940/3.8≈0.247选择信息增益率大的特征作为优选的判断特征。年龄的信息增益率(0.794)大于序号的信息增益率(0.247),因此年龄列比序号列更适合优先作为判断节点。其他特征的信息增益率及比较方法相同,每次迭代选取信息增益率最大的特征作为判断属性,建立决策树,这种算法叫做C4.5算法。现在选用信息熵作为建树依据的方法多数都是选择C4.5作为默认算法。9.1.2如何建立一棵决策树——CART建树过程除了信息熵,基尼系数(Gini)也可以作为建树的依据,基尼系数也可以体现出事物的不确定性(不纯度)。基尼系数的公式:其中I是所有的可能,i是某一种可能。某一属性Gini系数增益的公式为:针对“年龄”列进行统计:
Gini(买|年龄)=1-(2/8)2
-(3/8)2
-(3/8)2
≈0.656Gini(不买|年龄)=1-(3/6)2
-(1/6)2
-(2/6)2
≈0.611Gain(年龄)=9/14*Gini(买|年龄)+5/14*Gini(不买|年龄)
≈0.6409.1.2如何建立一棵决策树——CART建树过程基尼系数的公式:其中I是所有的可能,i是某一种可能。某一列Gini系数增益的公式为:针对“收入”列进行统计:Gini(买|收入)=1-(2/9)2-(5/9)2-(2/9)2≈0.592Gini(不买|收入)=1-(2/5)2-(1/5)2-(2/5)2≈0.64Gain(收入)=9/14*Gini(买|收入)+5/14*Gini(不买|收入)
=9/14*0.592+5/14*0.64
≈0.6099.1.2如何建立一棵决策树——CART建树过程基尼系数的公式:其中I是所有的可能,i是某一种可能。某一列Gini系数增益的公式为:针对“学生”列进行统计:Gini(买|学生)=1-(5/9)2-(4/9)2≈0.494Gini(不买|学生)=1-(2/5)2-(3/5)2≈0.48Gain(学生)=9/14*Gini(买|学生)+5/14*Gini(不买|学生)≈0.4899.1.2如何建立一棵决策树——CART建树过程基尼系数的公式:其中I是所有的可能,i是某一种可能。某一列Gini系数增益的公式为:针对“信用”列进行统计:Gini(买|信用)=1-(3/9)2-(6/9)2≈0.444Gini(不买|信用)=1-(3/5)2-(2/5)2≈0.48Gain(信用)=9/14*Gini(买|信用)+5/14*Gini(不买|信用)
≈0.4579.1.2如何建立一棵决策树——CART建树过程选择基尼增益小的特征作为判断特征,显然“信用”的信息增益系数最小,表示不纯度最小,所以通过信用特征来判断的结果能相对较“纯”。Gain(年龄)
≈0.640Gain(收入)≈0.609Gain(学生)≈0.489Gain(信用)≈0.457各子节点依据以上方式继续迭代9.1.2如何建立一棵决策树——信息熵VS基尼系数无论是信息熵、信息增益、信息增益率还是基尼系数,中心思想都是找到判断事务条件的不纯度。越“纯”的条件,判断得越“靠谱”。在实际使用中,信息熵和基尼系数的效果基本相同。信息熵的计算比基尼系数缓慢一些,因为基尼系数的计算不涉及对数。另外,因为信息熵对不纯度更加敏感,决策树的生长会更加“精细”,但更容易过拟合,但当模型拟合程度不足的时候,可以使用信息熵。实战中一般先选基尼系数,效果不好再换成信息熵9.1.3sklearn中的决策树实现#第一步:导入数据#导入numpy和pandas数据包importnumpyasnpimportpandasaspd#从boston_lishi.csv文件中导入原始数据df=pd.read_csv(r'E:\ruxian_lishi.csv',index_col='Patien')#X为原始数据中不包括target列部分,是由历史数据中“非结果列”组成的数据X=df.loc[:,(df.columns!='target')]#Y为原始数据中target列部分,是由历史数据中“结果列”组成的数据Y=df.loc[:,df.columns=='target']9.1.3sklearn中的决策树实现#第二步:数据预处理#缺失值处理df.dropna()#其他数据预处理将在第6次课介绍9.1.3sklearn中的决策树实现#第三步,建模#将历史数据按照8:2的比例分随机分为训练集和测试集fromsklearn.model_selectionimporttrain_test_splitXtrain,Xtest,Ytrain,Ytest=train_test_split(X,Y,test_size=0.2,random_state=420)#导入决策树工具包fromsklearn.treeimportDecisionTreeClassifierasDT#创建模型clf=DT()#训练模型clf.fit(Xtrain,Ytrain)9.1.3sklearn中的决策树实现#第四步,用测试集检验模型预测效果#使用predict方法,根据Xtest预测测试集的结果result=clf.predict(Xtest)#将测试集真实结果和预测结果进行对比df=pd.DataFrame({'真实结果':Ytest.loc[:,'target'],'预测结果':pd.Series(result,index=Ytest.index)})print(df)9.1.3sklearn中的决策树实现#第四步,用测试集检验模型预测效果#可以使用一些指标来评价模型表现,例如使用R2值评价多元线性回归score=clf.score(Xtest,Ytest)print(score)#其他指标(混淆矩阵、recall、AUC值等)与逻辑回归中的实现方法完全一致,不再赘述9.1.3sklearn中的决策树实现——决策树模型的重要属性#feature_importances:查看每个特征在构建决策树时的重要程度。实现方法如下:#查看每个特征的重要程度df=pd.read_csv(r'E:\ruxian_lishi.csv',index_col='Patien')#feature_importances_返回建模时,每个特征的重要程度fi=pd.Series(clf.feature_importances_,index=df.columns[0:-1])print(fi)9.1.4决策树调参——决策树的剪枝什么是剪枝?如果数据够复杂,建立的决策树也会很复杂,各种判断条件和判断结果“枝繁叶茂、层出不穷”,这样做会出现连个问题。第一、过拟合,因为训练得“太细”,导致整个模型过分依赖训练数据;第二、计算性能低,因为树结构太复杂,计算时需要占用大量资源,导致计算效率下降。为了避免树结构过于复杂,可以采用剪枝的方法。剪枝顾名思义,就是删除树中的一部分节点和叶子。左图为剪枝前的决策树,右图为剪之后的决策树。9.1.4决策树调参——决策树中可以实现剪枝的参数max_depth,参数内容是整数。max_depth就是指定树的最大深度,超过这个深度的中间节点和叶子节点统统砍掉,砍掉部分将变成一个叶子节点,这个节点的分类结果是砍掉部分样本数最多的分类。调参时也可以使用学习曲线+交叉验证的方法。min_samples_split,内容是整数,也是一个剪枝参数,一个节点必须要包含至少min_samples_split个样本,否则不再进行分枝。还有一个类似的参数:min_samples_leaf,也是一个剪枝参数,一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则不会在分枝,注意min_samples_leaf既可以是一个整数,表示样本个数,也可以是一个浮点小数,表示样本的比例。调参时也可以使用学习曲线+交叉验证的方法。如果说max_depth是在原有树基础上大刀阔如的砍掉太深的节点,那min_samples_split和min_samples_leaf就是在建树的过程中就小心翼翼的把握着树的结构,所以用max_depth剪枝的方法叫后剪枝,即在建树后剪枝;min_samples_split和min_samples_leaf叫先剪枝,即在建树的过程中就控制树的结构。二者可以配合使用。9.1.4决策树调参——决策树其他重要参数criterion,参数内容是是两个可选数值:gini(基尼系数)和entropy(信息熵),也就是之前介绍的两种建树方法,默认值是基尼系数。在实战中,一般先用基尼系数,如果结果不满意,再换成信息熵。random_state,参数内容是数值型。在使用维度较高(特征较多)的数据建树时,sklearn并不是将所有的特征都纳入建树过程,而是随机的挑选一些建树,random_state就是一种随机状态,不同随机状态挑选的特征不同,也就相当于建立了不同的决策树。Splitter,参数内容是两个可选值,best和random。上面提到random_state是在众多特征中挑选一部分特征建树,如果splitter参数选择的是best,那么选择的特征将更倾向于“重要的特征”(详见feature_importance_属性),如果splitter参数选择的是random,那就是“彻底”的随机选择特征建树了class_weight:
可以是None、balanced、或者字典类型。主要用于指定样本各类别的的权重,这样可以防止类不平衡问题(例如对于银行欺诈行为的统计数据,可能1000个人当中只有1个骗子,如果按照原始数据建模,骗子的数据会非常少,很难真正找到骗子的特征,而且即使对于骗子预测失败,把所有人都当好人,模型的准确率依然很好,因为有999个好人,准确率就是99.9%)。可以选用“balanced”,则算法会自己计算权重,样本量少的类别所对应的样本权重会高;还可以使用None,所有类别的权重都一样,也可以通过字典型指定各个样本的权重;。9.1.5决策树的重要属性和方法(1)属性feature_importances_(2)apply()方法9.2回归树9.2.1回归树的工作原理决策树主要是用于解决分类预测问题,决策树的建树方法还可以用于解决回归问题。这就会可以使用回归树。假设有根据历史数据建立如下回归树,目标是通过x1和x2的值预判y的取值:当一个被预测样本x1=40,x2=38,求这个样本的y值。这个被预测样本应该落在左数第二个叶子节点上,这个叶子上有三个历史y值,应该选哪个作为结果呢?答案是这个叶子节点所有历史y值的平均值,即26。9.2.1回归树的工作原理——回归树的损失函数回归树为什么使用叶子节点所有样本的平均值作为预测结果呢?这是通过回归树损失函数优化过程求得的。假设使用均方误差作为损失函数评断的依据,则损失函数如公式:其中f(xi)是通过回归树对样本xi进行预测的值,yi是样本xi的真实数值,i从1到n表示n个样本。设f(xi)为其中m表示某个叶子号,Cm表示m号叶子返回的值,I表示是某片叶子是否和这个样本发生关系,如果不发生关系I相当于0。所以f(xi)返回了所有和这个样本相关叶子节点的返回值。将f(xi)代入损失函数得
,此时的J便是回归树的损失函数。目标为求J最小值时Cm取值
9.2.1回归树的工作原理——回归树的损失函数损失函数这个公式的意思是对于一个样本i,找到所有(M个)和它有关的叶子,计算叶子返回值和真实值的方差,然后计算所有(n个)样本的均方差。既然我们理解了这个公式的意思是,可以给它进行一个变形。我们可以针对某一个叶子,计算叶子返回值C和这个叶子所有相关样本真实值的方差,然后再累加所有叶子节点上的方差,再除以样本数,结果同样是所有样本的均方误差。此时损失函数变为什么样的Cm能让这个损失函数最小呢?我们可以针对损失函数关于Cm求导,因为前面的M和n都是常数,所以求导时可以忽略不计,则损失函数J关于关于Cm求导,为:此时损失函数优化的目标就变成了求此导数等于0时的解。假设叶子中和样本i相关的样本有Nm个,则原公式变为
,求解得:由此可见当Cm取值为叶子中相关样本值的平均值时损失函数可以取极值。9.2.2回归树建树过程假设有如下数据:第一步:将原始数据按照X1小打到排序,则原数据表变为如下:9.2.2回归树建树过程第一步生成的新数据表:第二步:以X1列中前2个数的平均值(5和10的平均值)7.5为分界线,将样本分成两部分,X1<7.5的样本在左,X1>7.5的样本在右9.2.2回归树建树过程第三步:计算所有样本方差此时,左面叶子的返回值是20,右面叶子的返回值是其他样本y值的平均值
。然后将第一步得到新表中各个样本根据x1取值放入指定叶子,例如第一行样本x1等于5,小于7.5,所以被分到左边叶子,计算该样本y值与该叶子返回值之间的方差(20-20)2,即0;第二行样本x1为10,大于7.5,所以被分到右边叶子,计算该样本y值与叶子返回值之间的方差(15-)2
;第三行样本x1为20,大于7.5,所以落在叶子,计算该样本y值18与叶子返回值的方差是(18-
)2。以此类推,计算所有样本的均方差。9.2.2回归树建树过程步骤四:以x1列第2和第3个数的平均值(10和20的平均值是15)为分界线,将数据分成两部分,x1<15的落在左侧,x1>15的落在右侧,同样计算所有样本的均方差。步骤五:将X1列所有可能分枝的均方差都求出来步骤六:将X2和X3列所有可能分枝的均方差都求出来步骤七:找出均方差最小的分枝可能进行分枝,将数据的各个样本分到左侧和右侧节点。步骤八:针对左侧节点和右侧节点的数据,按照步骤一到步骤六,计算所有可能分枝的均方差,找到最小均方差的分枝方法继续分枝。步骤九:在新的分枝中不断再分枝,直到符合停止分枝的条件(如分到了叶子节点、树层数限制、分枝样本条件数限制等)。9.2.3回归树的实现#第一步:导入数据#导入numpy和pandas数据包importnumpyasnpimportpandasaspd#从boston_lishi.csv文件中导入原始数据df=pd.read_csv(r'E:\boston_lishi.csv',index_col='id')#X为原始数据中不包括target列部分,是由历史数据中“非结果列”组成的数据X=df.loc[:,(df
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2027年高考地理一轮复习:湘教版高中选择性必修3知识点考点提纲
- 开学第一课感恩教育主题班会课件
- 网络内容发布年度个人总结
- 橡胶坝工程的施工方法
- 污水处理厂环境安全隐患排查整治方案
- 污水处理企业有限空间安全管理制度
- 商品房项目海绵城市设施维护施工方案-施工技术方案
- 食品营养与健康论
- 密闭空间作业企业驾驶员检修维修安全操作规程
- 走路小班健康教案
- 幼儿园保安考试试题及答案
- 煤矿班组长现场安全管控培训课件
- 四川省水电投资经营集团有限公司所属电力公司2026年员工公开招聘(221人)考试备考试题及答案详解
- LYT 3464-2026《退化草原免耕补播技术规程》(纯净版)
- 上海八年级上册数学-二次根式的乘法和除法 同步练习
- 胸痹常用中医护理技术详解
- 《方法系统论》教材
- 湖南钢铁集团秋招面试题及答案
- 《再生工业盐 氯化钠(征求意见稿)》
- 20220902 葛洲坝集团路桥公司恩施至广元国家高速公路万州至开江段B合同段桥梁工程专项风险评估报(苎溪河特大桥)附专家评审意见及执行情况 B标
- (2026年)肾功能不全患者护理课件
评论
0/150
提交评论