版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第1章
数据仓库概述目录1.1什么是数据仓库
1.2数据仓库与传统数据库
1.3数据仓库的体系结构
1.4数据仓库服务器1.5多维数据模型1.6OLAP、OLTP及与数据仓库的关系1.7OLAP服务器1.8课后习题1.1
什么是数据仓库1.1什么是数据仓库数据仓库(DataWarehouse,DW)是一个面向主题的(SubjectOriented)、集成的(Integrated)、相对稳定的(Non-Volatile)、反映历史变化(TimeVariant)的数据集合,用于支持管理决策(DecisionMakingSupport)。特点:(1)数据仓库是一个面向主题的数据集合(2)数据仓库是集成的(3)数据仓库是相对稳定的(4)数据仓库反映历史变化1.2
数据仓库与传统数据库1.2数据仓库与传统数据库数据仓库的形成离不开数据库,因此,数据仓库与数据库之间存在千丝万缕的联系,也存在着很多区别。存在的联系:(1)技术基础共享(2)数据基础及规范化要求(3)发展趋势及融合1.2数据仓库与传统数据库区别:1.3
数据仓库的体系结构1.3数据仓库的体系结构(1)数据源层(2)数据准备(3)数据仓库服务器(4)OLAP服务器(5)前端客户层1.4
数据仓库服务器1.4数据仓库服务器数据仓库服务器中装载着数据仓库、数据集市以及描述数据仓库的元数据库等数据系统,这些数据系统共同支撑上层应用系统进行挖掘、分析。(1)数据仓库模型从结构的角度看,有三种数据仓库模型,分别为企业仓库、数据集市和虚拟仓库。(2)企业仓库企业仓库(EnterpriseWarehouse),有时也被称为企业级数据仓库或企业数据仓库(EnterpriseDataWarehouse,EDW),是一个集中式的、面向企业全局的数据存储和检索系统。1.4数据仓库服务器数据仓库服务器中装载着数据仓库、数据集市以及描述数据仓库的元数据库等数据系统,这些数据系统共同支撑上层应用系统进行挖掘、分析。(3)数据集市按照数据来源和功能不同,数据集市可以分为从属数据集市和中央数据集市。1.4数据仓库服务器数据仓库服务器中装载着数据仓库、数据集市以及描述数据仓库的元数据库等数据系统,这些数据系统共同支撑上层应用系统进行挖掘、分析。(4)虚拟仓库
虚拟仓库是一种数据集合和处理方式的概念,它并不对应于某个具体的物理存储位置,而是将分布在不同系统和地域的数据源在逻辑上连接到一起,实现数据的集中管理和统一查询。虚拟仓库易于建立,但需要操作数据库服务器有足够资源。1.5
多维数据模型1.5多维数据模型多维数据模型是数据仓库中用于数据分析和决策支持的一种重要数据组织方式。在数据仓库中,多维数据模型通过构建数据立方体(DataCube)等结构,将数据按照多个维度进行组织,以便进行复杂的数据分析。数据立方体允许以多维数据建模和观察,下图给出展示了常见的数据立方体数据结构图:1.5多维数据模型多维数据模型可以以星型模式、雪花模式、或事实星座模式的形式存在。(1)星型模式(StarSchema):1.5多维数据模型多维数据模型可以以星型模式、雪花模式、或事实星座模式的形式存在。(2)雪花模式(SnowflakeSchema):1.5多维数据模型多维数据模型可以以星型模式、雪花模式、或事实星座模式的形式存在。(3)事实星座(FactConstellations)::1.6
OLAP、OLTP及与数据仓库的关系1.6OLAP、OLTP及与数据仓库的关系联机事务处理(OnlineTransactionProcessing,OLTP)主要任务是执行联机事务和查询处理。涵盖了单位的大部分日常操作,如购物、库存、银行、工资、注册、记账等。联机分析处理(OnlineAnalyticalProcessing,OLAP)主要任务是在数据分析和决策方面为用户或“知识工人”提供服务。这种系统可以用不同的格式组织提供数据,以便满足不同用户的不同需求。1.7
OLAP服务器1.7OLAP服务器数据仓库中的OLAP(OnlineAnalyticalProcessing,在线分析处理)服务器是一个专门用于支持复杂数据分析和查询的软件或硬件平台。主要功能:(1)数据存储与管理(2)数据聚合与统计(3)数据查询与分析(4)报表生成与可视化1.8
课后习题1.8课后习题1.请简述数据仓库的基本概念及其与操作型数据库的区别
。2.数据仓库的四个基本特征是什么?请分别解释它们的含义。3.请描述数据仓库的三层体系结构,并说明每一层的作用和意义。4.数据准备过程中包括哪些关键步骤?这些步骤对于数据仓库的建设有何重要性?5.简述企业仓库、数据集市和虚拟仓库的定义及其各自的特点。6.请解释ROLAP、MOLAP和HOLAP的区别,并讨论它们在不同场景下的适用性。7.如何理解数据仓库与OLAP之间的关系?它们在决策支持系统中是如何协作的?8.结合实际案例,谈谈数据仓库在企业管理决策中的作用和价值。第2章
分布式数据仓库目录2.1什么是Hive
2.2Hive用在哪里
2.3Hive与传统数据仓库的比较
2.4Hive的优缺点2.5Hive的功能与架构2.6Hive运行流程2.7Hive数据存储模型2.8课后习题1.1
什么是Hive2.1什么是HiveHive是一个建立在Hadoop文件系统上的数据仓库基础架构,它提供了一系列工具,能够对存储在HDFS(Hadoop分布式文件系统)中的数据进行数据提取、转换和加载(ETL),允许熟悉SQL的用户查询数据,同时也允许熟悉MapReduce的开发者开发mapper和reducer来处理复杂的分析工作。特性:(1)灵活方便的ETL(2)支持Tez、Spark等多种计算引擎(3)可直接访问HDFS文件以及HBase(4)易用易编程2.2Hive用在哪里2.2Hive用在哪里Hive的最佳使用场合是大数据集的批处理作业,例如,网络日志分析或者不同行业中的用户行为分析、风险管理等多个方面。2.3Hive与传统数据仓库的比较1.2数据仓库与传统数据库区别:1.2数据仓库与传统数据库区别:2.4Hive的优缺点2.4Hive的优缺点Hive使用集群模式和超时重传机制实现了高可靠和高容错。2.4Hive的优缺点
但是,Hive本身也有一些缺点:(1)延迟高,因为MR本身延迟就高(2)不支持物化视图(就是不能在试图上进行增删改,仅支持普通的查询视图)(3)不适用OLTP(4)只支持函数,不支持存储过程2.5Hive的功能与架构2.5Hive的功能与架构Hive的功能结构:2.6Hive运行流程2.6Hive运行流程Hive的运行流程是一个复杂但高度优化的过程,它主要依赖于Hadoop的MapReduce框架或其他执行引擎(如Tez、Spark)来处理大规模数据,下图给出了一个基本的工作流程:2.7Hive数据存储模型2.7Hive数据存储模型Hive的数据存储模型是建立在Hadoop文件系统之上的,它提供了灵活的数据存储方式,以支持大规模数据的存储和分析。数据库表表倾斜数据分区分区桶桶桶桶正常数据2.8
课后习题2.8课后习题1.请简述Hive的基本概念及其在大数据处理中的作用。2.Hive的运行流程包括哪些主要阶段?每个阶段的主要任务是什么?3.请解释Hive的三种部署方式:内嵌模式、本地模式和远程模式,并说明它们的主要区别。4.简述Hive数据存储模型的主要组成部分,包括数据库、表、分区、桶等概念及其作用。5.请解释Hive中桶的概念及其作用,并说明如何创建分桶表以及分桶的应用场景。第3章HiveQL操作目录3.1Hive基本操作
3.2数据定义语言
3.3数据管理语言
3.4数据查询语言3.5课后习题
3.1Hive基本操作3.1Hive基本操作SQL(StructuredQueryLanguage)是用于管理关系数据库的编程语言,本章节将基于Hive介绍SQL语句,简称HiveQL,无论基于哪种技术,SQL语句它包含了如下几种主要的语言类别:(1)数据定义语言(2)数据操纵语言(3)数据控制语言(4)事务控制语言(5)数据查询语言3.2
数据定义语言3.2数据定义语言(1)建表与SQL一样,在HiveQL中,建表操作也是通过CREATETABLE语句来实现的。用户需要指定表的名称、列名、数据类型以及其他可选的属性,如分区、存储格式等。(2)修改表修改表操作包括更改表名、增加/删除列、更改列的数据类型、增加/删除分区等。在Hive中,这些操作分别通过ALTERTABLE语句的不同子句来实现。(3)删除表删表操作通过DROPTABLE语句来实现,该操作会删除表及其元数据,但不会删除外部表所指向的HDFS上的数据。3.3
数据管理语言3.3数据管理语言(1)数据导入在Hive中,使用INSERT语句来插入数据与使用LOADDATAINPATH命令是两种不同的操作。INSERT语句通常用于将查询结果插入到表中,而LOADDATAINPATH用于将HDFS上的文件移动到Hive表中。(2)数据导出数据导出操作可以通过INSERTOVERWRITE语句将查询结果导出到HDFS上的文件或目录中,或者使用EXPORTTABLE命令(仅适用于部分Hive版本和存储格式)。3.4
数据查询语言3.4数据查询语言Hive数据库的查询操作与关系型数据库相似,特别的是Hive提供了窗口函数(WindowFunctions),这些函数可以对数据集中的相关行集(即“窗口”)执行计算,而无需对数据进行分组。窗口函数常用于执行运行总计、移动平均、排名等操作。Hive支持的窗口函数可以分为以下几类:(1)排名函数(2)分析函数(3)聚合函数3.5
课后习题3.5课后习题1.请描述Hive中的DDL(数据定义语言)、DML(数据管理语言)和DQL(数据查询语言)操作的主要内容。2.请举例说明如何在Hive中创建表、修改表、删除表、分区以及数据导入和导出的操作。3.请简述Hive中托管表和外部表的区别,以及它们在实际应用中的适用场景。第4章
表格处理本章主要内容4.1针对表格的操作4.2常用函数4.3图表4.1
针对表格的操作4.1针对表格的操作4.1.1数据分列4.1.2Ctr+E4.1.3大小写数字转换4.1.4快速定位缺失值4.1.5冻结窗口4.2
常用函数4.2常用函数4.2.1数值运算函数4.2.2字符处理函数4.2.3逻辑运算函数4.2.4VLOOKUP4.2.5时间序列函数4.3
图表4.3图表4.3.1生成图表4.3.2图表的细节修改第5章Python与Numpy本章主要内容5.1Python简介5.2Numpy简介5.3课后习题5.1Python简介5.1Python简介近些年,由于Python语言的简洁性、易读性和可扩展性,IT行业内外掀起了一股学习Python的热潮,特别是随着大量方便快捷的扩展工具包涌现,Python更是成为了很多都市白领的必备技能。5.1.1Anaconda简介Anaconda是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项,还有很多安装好的工具包,比如之后介绍的numpy、pandas等。有了Anaconda我们的PC机就可以运行各种各样的Python科学计算程序。5.1.1Anaconda简介下载&双击傻瓜式“下一步”5.1.2JupiterNotebook简介5.1.2JupiterNotebook简介快速执行某个cell里的代码(shift+Enter)向前增加一个cell(a)向后增加一个cell(b)删除一个cell(dd)清空已执行的结果5.1.3Python常用语法变量类型列表型与字典型5.2Numpy简介5.2Numpy简介——原生python的问题实战案例:(1)有一个列表,里面装有5个数字,现让所有的数字都加上100,得到一个新列表。(2)一个人买了5种商品,第一个列表中存放着5种商品的个数,第二个列表中存放着5中商品的单价,求每个商品花了多少钱?5.2Numpy简介——numpy安装5.2.1初始数组——Numpy中的ndarrayndarray是个好东西!!有了它,numpy可以无循环地对整组数据进行快运算。(1)ndarray数组大小不能变动,(2)数组内元素类型必须保持一致(3)进行对位运算的数组大小必须相同(4)进行对位运算的数组内元素类型必须相同5.2.2数组的创建用原生python的列表创建用numpy创建特定数组(zerosones)用numpy创建有规律的数组(arangelinspace)用numpy创建随机数组(random.randintrandom.uniform)5.2.3数组的索引——数组的形状与维度多维数组reshapeshapesizeT5.2.3数组的索引传统索引 array[0][0]新索引
array[0,0]切片布尔型索引花式索引5.2.4Numpy的常用方法和属性求数组中每个元素的绝对值:np.abs()求数组中每个元素四舍五入值:np.round()求数组中每个元素向上取整:np.ceil()求数组中每个元素向下取整:np.floor()求数组中所有元素的平均值:np.mean()求数组中所有元素的方差:np.var()求数组中所有元素的标准差:np.std()求数组中最大值:np.max()求数组中最小值:np.min()求数组中最大值对应的索引:np.argmax()求数组中最小值对应的索引:np.argmin()取两个数组中对位小的部分:np.minimum(a1,a2)取两个数组中对位小的部分:np.maximum(a1,a2)5.2.4Numpy的常用方法和属性np.inf和np.nan5.3
课后习题5.3课后习题1.安装Anaconda,运行图5-8、图5-9所示代码;2.创建1个拥有8个元素的一维数组,内容是8个随机整数,取值范围是1-100,然后将这个数组转化成一个2行4列的二维数组;3.创建1个拥有8个元素的一维数组,内容是8个随机整数,取值范围是1-100,采用布尔型索引找出其中大于10的元素;4.创建1个拥有8个元素的一维数组,内容是8个随机整数,取值范围是1-100,计算数组中所有元素的平均值、方差。第6章Pandas与Matplotlib本章主要内容6.1Pandas6.2时间序列6.3Matplotlib6.4课后习题6.1Pandas6.1pandas——问题引入问题:一个数据表由什么组成?表1一季度股票收益表(单位:元)6.1pandas——问题引入对于某一列数据业务含义的描述第一种描述方式:这一列的数据分别是“1010、2010、3010、4010、5010”,这些数据对应的索引分别是“王二麻、张三、李四、王五、赵六”第二种描述方法:这一列数据分别表示“王二麻股票收益是1010”、“张三股票收益是2010”、“李四股票收益是3010”、“王五股票收益是4010”、“赵六股票收益是5010”如果使用numpy中的ndarray是否合理?如果使用字典型是否合理?6.1.1pandas中的SeriesPandas是一个非常强大的数据分析工具包(表格处理神器),可以进行丰富的数学运算和操作、灵活的缺失值处理,并且还提供了时间序列等数据分析常用功能。安装方法如下:Series是pandas提供的一种数据类型,和Seriess1(ndarray)很像,但是由一组数据和一组与之相关的索引组成,可以理解为带有索引的一列数据。6.1.2Series的创建方法一:通过pandas中的Series方法将原生python列表改造成Seires(注意index选项的使用)方法二:通过pandas中的Series将numpy中的ndarray改造成Series(注意index选项的使用)方法三:通过pandas中的Series方法将原生python中的字典型改造成Series注意:区分下标索引和标签索引6.1.3Series的索引index和values属性下标索引和标签索引(均支持普通索引、切片、布尔型索引等索引方法)loc和iloc(均支持普通索引、切片、布尔型索引等索引方法)6.1.4Series的数据对齐普通对位计算对位计算时的自动对齐(以标签索引为主,注意:如果无法对齐,则用nan补位或用其他数字补位)6.1.5Series的空值处理空值的判断删除填充替代Series数学计算Series常见的统计类计算(与numpy几乎一模一样)求Seriess1中每个元素的绝对值:s1.abs()求Seriess1中每个元素四舍五入值:s1.round()求Seriess1中每个元素向上取整:s1.ceil()求Seriess1中每个元素向下取整:s1.floor()求Seriess1中所有元素的平均值:s1.mean()求Seriess1中所有元素的方差:s1.var()求Seriess1中所有元素的标准差:s1.std()求Seriess1中最大值:s1.max()求Seriess1中最小值:s1.min()求Seriess1中最大值对应的索引:s1.argmax()求Seriess1中最小值对应的索引:s1.argmin().......6.1.6pandas中的DataFrameDataFrame是Pandas最重要的数据类型,它是一个表格型的数据结构,主要面向表格数据的处理。DataFrame可以被看做是由Series组成的字典,这些Series共用一个索引。股票1:股票2:股票3:理解为6.1.6pandas中的DataFrame——创建DataFrame方法一:使用pandas中的dataframe方法,将多个Series合并成dataframe(如果多个Series的索引对不上,坚持“对齐原则”,如果无法对齐将会出现nan,处理思路方法与Series的空值处理基本一致)方法二:读取csv等类型文件(注意:index_col和names选项)6.1.7DataFrame的属性indexcolumnsvaluesshapesizedescribe()6.1.8DataFrame索引与切片传统索引切片花式索引布尔型索引(注意:只能使用[])6.1.9DataFrame的对位运算与对齐原则对位计算(遵守对齐原则)表的合并单表排序单表统计计算(内容形式与Series基本相同)6.1.10DataFrame处理缺失值删除有空值的行删除有空值的列删除全空的行填充6.1.11DataFrame的常用方法meansumstdsort_valuessort_indexdescribe6.2
时间序列6.2.1生成一个时间序列使用to_datatime方法将列表中的字符串转成时间序列Pandas可以生成各种有规律的时间序列6.2.2时间序列的操作查看某个月的数据查看某些时间区间的数据查看各个月的数据统计6.2.3read_csv的高级应用read_csv的高级选项to_csv的使用6.3Matplotlib6.3matplotlib——安装matplotlib是一个画图的工具库,安装方式如下:6.3.1使用matplotlib画折线图importnumpyasnpimportpandasaspd#引入matplotlib工具包importmatplotlib.pyplotasplt#创建表示x值的ndarray和y值的ndarray,二者为线性关系x=np.array(
[1,3,5,7,9])y=np.array([11,13,15,17,19])#画线段图,x是横坐标,y是纵坐标plt.plot(x,y)#显示画图plt.show()6.3.2图表详细信息plt.title("Pic1")#显示图的名称plt.xlabel("xlabel")#显示x轴名称plt.ylabel("ylabel")#显示y轴名称plt.xlim(0,6)#调整x轴的范围为0-5plt.ylim(2,35)#调整y轴的范围为2-35plt.xticks([0,2,4,6])#x轴只显示列表里的点plt.yticks([10,20,30,35])#y轴只显示列表里的点plt.legend()#将plot中label的内容以图例形式显示出6.3.3其他图——使用matplotlib画柱状图
importnumpyasnpimportpandasaspdimportmatplotlib.pyplotasplt#一共有四组数据作为x轴,分别是Season1Season2Season3Season4season=['Season1','Season2','Season3','Season4']#四个季度的收入分别是10万、15万、20万、10万income=[10,15,20,10]#显示四个季度收入的柱状图,并指定对应颜色是红、黄、绿、蓝plt.bar(season,income,color=['red','yellow','green','blue'])plt.show()6.3.3其他图——使用matplotlib画饼状图
importnumpyasnpimportpandasaspdimportmatplotlib.pyplotasplt#一共有四组数据作为x轴,分别是Season1Season2Season3Season4season=['Season1','Season2','Season3','Season4']#四个季度的收入分别是10万、15万、20万、10万income=[10,15,20,10]#画饼状图,显示四个季度收入占全年收入的占比,并显示比例(显示小数点后1位)plt.pie(income,labels=season,autopct='%.1f%%')plt.show()6.4
课后习题6.4课后习题1.创建一个随机数组,将其变为Series类型变量,使用默认下标索引。2.创建一个从2024年1月1日起,连续50个工作日的时间序列。3.自行创建一个DataFrame类型数据,将其保存在D盘的zuoye.csv文件中。4.自行研究Matplotlib.pyplot工具中的画布与子图功能第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系数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 维修工年度述职报告
- 公司员工安全课件
- 临床输血管理相关制度(试题及答案)
- 煤矿安全机电管理
- 综合交通枢纽旅客休息区施工方案
- 止血包扎技术考试题及答案(2026年)
- 2025年版《静脉治疗护理技术操作标准》试题及参考答案
- 关键设备点检作业指导书
- 危险货物运输企业焊工装卸作业安全操作规程
- 化学实验室安全管理
- 2026年美妆个护行业洞察数据报告
- 安徽芜湖2026年无为市泉塘镇村级后备干部招聘考试试卷-含答案解析
- 2026年安徽省产品质量监督检验研究院见习人员招募备考题库及答案详解(历年真题)
- 全域投放设高跑低解决思路与投产提升法则
- 陇西国家基本气象站迁建项目水土保持报告表
- 2026年水发集团社会招聘249人笔试备考试题及答案解析
- 2026年三力测试全真模拟试题集
- 码垛作业安全操作规程
- 2026年审计法相关知识竞赛经典例题附答案详解【考试直接用】
- 2026年职业教育法考试题库及答案
- 落实意识形态责任制制度
评论
0/150
提交评论