Quick BI数据大屏可视化大赛
一、活动背景为帮助企业客户更好地满足大屏相关的数据可视化需求,Quick BI推出数据大屏模块(当前免费公测中),同时举办本次Quick BI数据大屏可视化大赛活动,帮助用户更好地学习和掌握数据大屏的功能和应用。数据大屏是面向企业数据消费者,将可视化和场景叙事技术结合,运行在智能设备上,非接触式连接的酷炫大屏,满足CXO大盘、业务监控、以及对外PR等场景、从而推动企业数据群体消费。数据大屏的常见应用场景包括CXO驾驶舱、活动数据监控、项目会议演示、对外接待或PR等,是Quick BI四大数据分析场景的重要组成部分,致力于满足企业高可视化要求的数据展示场景。二、活动规则1.作品要求:参与活动的用户需要使用Quick BI产品的数据大屏模块,搭建1张大屏页面(不得直接套用内置Quick BI模板)。Quick BI产品控制台:bi.aliyun.com2.数据来源:参赛选手自行准备,可使用企业相关数据搭建(敏感数据可打马赛克或做脱敏处理)。3.评分规则:Quick BI产品团队将对选手提交的作品进行评分,评分主要考虑以下因素:评分维度占比可视化展现美观性60%作品推广价值40%三、奖励发放大赛最终将评选出一等奖3名、二等奖5名、三等奖10名,给予不同额度的天猫超市购物卡(电子版)奖励:奖项名额奖品一等奖3猫超卡¥1000/人二等奖5猫超卡¥500/人三等奖10猫超卡¥100/人四、作品提交提交参赛报名表(点击报名),包含参赛作品的高清截图(敏感数据可打马赛克或做脱敏处理),数据大屏公开分享链接(可选),以及作品简介(包含数据来源,清洗建模及展现、创意思路,推广价值等)信息。注:大赛组织方有权将参赛作品、作品相关、作者信息用于宣传品、指定及授权媒体发布、官方网站浏览及下载、展览(含巡展)等活动项目,本活动最终解释权归Quick BI产品团队所有。五、活动时间作品提交时间:2022年6月13日-2022年7月3日作品评分时间:2022年7月4日-2022年7月6日奖品发放时间:2022年7月7日六、学习资料Quick BI数据大屏产品文档:https://help.aliyun.com/document_detail/108979.htmlQuick BI数据大屏产品视频:https://help.aliyun.com/document_detail/433242.htmlQuick BI数据大屏产品Demo:https://bi.aliyun.com/template/nl/public七、部分优秀作品赏析1.钢结构行业智慧大屏 数据大屏链接:https://bi.aliyuncs.com/token3rd/screen/view/pc.htm?pageId=3895cea2-d36e-428e-b2aa-b62d399177d6&accessToken=5b5c84ae85dcf39ad2f828df4f907b86 访问密码:600477 参赛公司:杭萧钢构股份有限公司 作品名称:钢结构行业智慧大屏 作者:杭萧钢构工业互联网研究院 作品介绍: 钢结构行业智慧大屏分成《项目大屏》和《土地大屏》两部分,数据来自公司自研数据智能采集系统。两张大屏的背景选取了钢结构项目具有代表性的东方明珠和杭州之门项目,杭州之门项目为杭萧钢构承建。 《项目大屏》从全国800多个公共资源交易网站进行项目信息采集,通过数据清洗,筛选出与公司业务相关的项目信息进行存储,再通过人工智能NLP技术从非结构化的文本数据中提取有价值的数据,包括项目金额、项目地址、业主单位名称、招标联系人等并将数据建模入库。通过数据的不断积累,目前从全国33个省直辖市,匹配关联项目数12757个。通过对数据的分析,可以看出华东地区的项目数量最多,将公司营销资源向华东区域分公司做倾斜。调配公司资源的同时也有利于公司战略决策部署。 《土地大屏》数据来自全国各地区政府网站发布的土地招拍挂信息,从数据中可以看出全国待建项目总体情况,为公司未来打好基础和提前量。从数据中,可以分析出工业用地占比相对较高,可以在厂房相关项目调配和部署。同时通过分析每日的钢铁价格数据,实时计算项目成本信息。 2020年杭萧钢构工业互联网研究院的成立意味着杭萧钢构在数字化转型的尝试,工业互联网研究院充分利用云计算、大数据、人工智能、BIM、数字孪生、互联网等先进技术,建设实现数字化转型和各业务板块、各公司的集团化、信息化、数智化管理平台。在多次探索和尝试中我们选择了阿里云quickBI作为数据分析决策工具。 杭萧钢构内部大屏《总裁驾驶舱》就是使用quickBI作为开发工具进行开发的,分别为全国13家子公司产量信息、考勤信息、资金信息、收款信息等做分析和展示,为公司决策层提供了便利。在开发使用过程中遇到一系列问题,阿里云quick BI团队的售后工程师都能认真且负责的态度解决,在这里非常感谢阿里云quick BI团队工程师们。2.深圳XX科技-销售驾驶舱数据大屏公开分享链接:https://das.base.shuju.aliyun.com/t/yaqUnm 投屏密码:797080 数据来源:公司实时销售数据 清洗建模:剔除测试企业及无效订单数据,建立“客户数”、“销售成本额”、“毛利率”等销售指标。展现及思路: 1、大屏中上部主看板展示boss及管理者最关心的关键销售指标:当月、当天销售额、KPI完成率、成交客户数、所花费成本、毛利率,以及最近一段时间的销售额; 2、大屏中下部展示重点关注的指标:重点产品在重点城市的销售情况,可看到产品销售额的构成、以及各重点城市销售额相比于上个月的增减变化; 3、左边和右边的板块为销售拆解部分,左边按渠道/代理商进行拆解,展示表现优秀/不如人意的销售渠道及下游;右边按产品分类进行拆解,展示产品的大类销售占比及小类具体销售额,并附有产品所处阶段的注释。 总的来说,销售驾驶舱可以让关心当前销售数据的CXO快速了解到相关主要指标和主要维度拆解数据,了解后可再进行进一步的提问和分析。推广价值: 1、深色大屏虽然酷炫,但大部分管理者日常所看还是以浅色为主,浅色看板可以让用户更容易把大屏与日常报表联系/对比,发现大屏相比于仪表板的优点,例如布局更灵活自由、组件能力更强等; 2、主题通用易推广:浅层销售分析数据,企业看板的万金油。
对于聚类结果的评价指标, 核心的思想可以分为什么?
对于聚类结果的评价指标, 核心的思想可以分为什么?
MySQL数据库基本操作-DDL
🐾DDL解释DDL(Data Definition Language),数据定义语言,该语言部分包括以下内容:对数据库的常用操作对表结构的常用操作修改表结构💐对数据库的常用操作对表结构的常用操作-创建表🌸创建表格式create table [if not exists]表名(
字段名1 类型[(宽度)] [约束条件] [comment '字段说明'],
字段名2 类型[(宽度)] [约束条件] [comment '字段说明'],
字段名3 类型[(宽度)] [约束条件] [comment '字段说明']
)[表的一些设置];创建表是构建一张空表,指定这个表的名字,这个表有几列,每一列叫什么名字,以及每一列存储的数据类型。create table if not exists student(
sid int,
name varchar(20),
gender varchar(20),
age int,
birth date,
address varchar(20),
score double
);🌷数值类型🍀日期和时间类型🌹字符串类型🌻表的基本操作修改表结构格式🌺修改表添加列alter table 表名 add 列名 类型(长度) [约束];#为student表添加一个新的字段为:系别 dept 类型为 varchar(20)ALTER TABLE student ADD `dept` VARCHAR(20); 比如有时候我们针对一张已经创建好的表格进行做出增加列的操作,可以使用alter命令,这个命令在后续的操作常用。🍁修改列名和类型alter table 表名 change 旧列名 新列名 类型(长度) 约束; #为student表的dept字段更换为department varchar(30)ALTER TABLE student change `dept` department VARCHAR(30); 使用change这个关键词,前面跟最初的原始列名,后面加自定义的新名字,注意后面需要加上类型。🍃修改表删除列alter table 表名 drop 列名;#删除student表中department这列ALTER TABLE student DROP department;看了上面几个操作,我们也需要总结出一些规律,通过alter命令 table 表名 操作关键词 具体的操作列。🍂修改表名rename table 表名 to 新表名;#将表student改名成 sturename table `student` ?to stu;rename ......to🍄总结通过上述的几个命令,我们发现对于数据库,以及表格进行操作,我们可以使用alter命令操作,其中设计到:新增列;对列进行改名;删除列;修改表名,其次需要掌握的就是数据表的创建,这里的创建基本的格式就是:create table 表名(列名 类型(长度)) 文末资源推荐🍓 🍑 🍈 🍌 🍐 🍍 🍠 🍆 🍅 🌽①可做大数据测试系统;②可以做数据挖掘数据;③可做数据预处理系统数据;④可做气科研数据.........点击下方即可下载 ??????????2018-2022年全国区县天气数据集大全(包含月度数据、日度数据)-数据集文档类资源-CSDN下载
①机器学习推荐算法之关联规则(Apriori)——支持度;置信度;提升度
🍎走进关联规则🍊什么是关联规则?🐾🐾情景引入:🍺啤酒与尿布🍼在一家超市里,有一个有趣的现象:尿布和啤酒赫然摆在一起出售。但是这个奇怪的举措却使尿布和啤酒的销量双双增加了。这不是一个笑话,而是发生在美国沃尔玛连锁店超市的真实案例,并一直为商家所津津乐道。沃尔玛拥有世界上最大的数据仓库系统,为了能够准确了解顾客在其门店的购买习惯,沃尔玛对其顾客的购物行为进行购物篮分析,想知道顾客经常一起购买的商品有哪些。沃尔玛数据仓库里集中了其各门店的详细原始交易数据。在这些原始交易数据的基础上,沃尔玛利用数据挖掘方法对这些数据进行分析和挖掘。一个意外的发现是:"跟尿布一起购买最多的商品竟是啤酒!经过大量实际调查和分析,揭示了一个隐藏在"尿布与啤酒"背后的美国人的一种行为模式:在美国,一些年轻的父亲下班后经常要到超市去买婴儿尿布,而他们中有30%~40%的人同时也为自己买一些啤酒。产生这一现象的原因是:美国的太太们常叮嘱她们的丈夫下班后为小孩买尿布,而丈夫们在买尿布后又随手带回了他们喜欢的啤酒。这就是隐藏在实际生活中的关联规则吗,也是数据挖掘的一种形式,生活中的各类事物都会产生价值,善于挖掘事物的价值就会有不一样的价值。联规则最初提出的动机是针对购物篮分析(Market Basket Analysis)问题提出的。假设分店经理想更多的了解顾客的购物习惯。特别是,想知道哪些商品顾客可能会在一次购物时同时购买?为回答该问题,可以对商店的顾客事物零售数量进行购物篮分析。该过程通过发现顾客放入“购物篮”中的不同商品之间的关联,分析顾客的购物习惯。这种关联的发现可以帮助零售商了解哪些商品频繁的被顾客同时购买,从而帮助他们开发更好的营销策略。关联规则是指事物间的相互联系,反映了一个事物与其他事物之间的相互依存性和关联性。如果两个或者多个事物之间存在一定的关联关系,那么其中一个事物就能够通过其他事物预测得到。🍒关联规则的分类按处理值分类,关联规则可以分为量化型和布尔型布尔型关联规则是研究数据项在某个事务中是否会出现。量化型关联规则主要是离散型的数据,关联规则中的数据项是数量型的。在对量化进行关联规则进行挖掘时,通常使用统计学、离散方法等对量化数值进行离散化。分化成几个离散区间,从而转换成布尔型关联规则挖掘。关联规则按所涉及的抽象层次可以分为单层和多层比如每科成绩之间的关联挖掘就是单层的。而专业课、公共课等之间的关联挖掘,就是多层的。因为 他们是属于不同层级。根据数据维数则可以分为,单维和多维比如,购买网球,只涉及到一个维度。年龄购买网球,则涉及到年龄和网球两个维度。🍉关联规则的基本概念(1)项对一个数据表而言,表的每个字段都具有一个或多个不同的值。字段的每种取值都是一个项Item。(2)项集项的集合称为项集itemset。包含k个项的项集被称为k-项集,k表示项集中项的数目。由所有的项所构成的集合是最大的项集,一般用符号I表示。(3)事务事务是项的集合。本质上,一个事务就是事实表中的一条记录。事务是项集I的子集。事务的集合称为事务集。一般用符号D表示事务集/事务数据库。(4)关联规则给定一个事务集D,挖掘关联规则的问题就变成如何产生支持度和可信度分别大于用户给定的最小支持度和最小可信度的关联规则的问题。(标准)(5)支持度(同时,交;元组总数)若D中的事务包含A∪B的百分比为s,则称关联规则AB的支持度为s。即:support(AB )= P(A∪B ) = 包含A和B的元组数/元组总数(6)可信度(同时,交;条件概率)若D中包含A的事务同时也包含B的的百分比为c,则称关联规则 AB 的置信度/可信度为c,即:confidence(AB )=P(B|A) = 包含A和包含B的元组数/包含A的元组数 = support(A∪B )/support(A)根据上面的例子,可以求解到苹果——>啤酒的置信度=3/8 /4/8=3/475%的置信度(7)频繁项集项集的出现频率是包含项集的事务数,简称项集的频率;项集满足最小支持度阈值minsup,如果项集的出现频率大于或等于minsup与D中事务总数的乘积;满足最小支持阈值的项集就称为频繁项集(大项集)。频繁k项集的集合记为Lk;如何得出频繁项集,apriori算法的价值所在(8)强关联规则大于或等于最小支持度阈值和最小置信度阈值的规则叫做强关联规则关联分析的最终目的,就是为了找出强关联规则??????????算法那么,关联规则的本质,其实就是挖掘频繁项,那么算法的目的也就是尽可能快速有效的挖掘不同事物间 关系出现的频率。而衡量规则是否成立的两个参考维度,就是支持度和置信度。常用的算法有 Apriori 算法 ,FP-growth 算法。这两个算法,前者主要用迭代方法挖掘,不适用于多维挖掘。后者利用存储优化,大幅提高了挖掘性能。(9)Lift(提升度)指A项和B项一同出现的频率,但同时要考虑这两项各自出现的频率。公式表达:{A→B}的提升度={A→B}的置信度/P(B):提升度反映了关联规则中的A与B的相关性,提升度>1且越高表明正相关性越高,提升度<1且越低表明负相关性越高,提升度=1表明没有相关性。负值,商品之间具有相互排斥的作用。🎈🎈 通过了解上面的一些概念知识,这里给出来一个具体的实例:事务: 每一条交易称为一个事务,例如:上表中包含8个事务。项: ? ?交易中的每一个物品称为一个项,例如:苹果、啤酒。项集:包含零个或者多个项的集合叫做项集,例如{苹果,啤酒} 、{牛奶,啤酒,米饭}。 k-项集:包含k个项的项集叫做k-项集。例如{苹果}叫做1-项集,{牛奶,啤酒,米饭}叫做3-项集。前件和后件:对于规则{苹果}->{啤酒},{苹果}叫前件,{啤酒}叫后件。📢 📣🍩🍩下面也通过对三个度量指标进行实例的分析1?? 支持度:{苹果}在8次交易中出现了4次,所以其支持度为50%。一个项集也可以包含多项,比如{苹果,啤酒,米饭}的支持度为2/8,即25%。可以人为设定一个支持度阈值,当某个项集的支持度高于这个阈值时,我们就把它称为频繁项集。2?? 置信度:{苹果→啤酒}的置信度=(支持度{苹果,啤酒}/支持度{苹果})=3/4,即75%。置信度有一个缺点,那就是它可能会错估某个关联规则的重要性。只考虑了苹果的购买频率,而并未考虑啤酒的购买频率。如果啤酒也很受欢迎(支持度很高),如上表,那么包含苹果的交易显然很有可能也包含啤酒,这会抬高置信度指标。3?? 提升度:{苹果→啤酒}的提升度等于{苹果→啤酒}的置信度除以{啤酒}的支持度,{苹果→啤酒}的提升度等于1,这表示苹果和啤酒无关联。{X→Y}的提升度大于1,这表示如果顾客购买了商品X,那么可能也会购买商品Y;而提升度小于1则表示如果顾客购买了商品X,那么不太可能再购买商品Y。为什么说置信度是有缺点的呢?下面我们看一个实际的例子@快来看📢 📣📢 置信度的局限——错估某个关联规则的重要性📑实际案例 各商品在与啤酒相关的关联规则中的支持度 置信度很高,但是提升度较低,关联效果不好!{啤酒→汽水}规则的置信度最高,为17.8%。然而,在所有交易中,二者出现的频率都很高,所以它们之间的关联可能只是巧合。这一点可以通过其提升度为1得到印证,即购买啤酒和购买汽水这两个行为之间并不存在关联。置信度很低,但是关联效果较好!比如{啤酒→男士护肤品}规则的置信度低,这是因为男士护肤品的总购买量不大。尽管如此,如果一位顾客买了男士护肤品,那么很有可能也会买啤酒,这一点可以从较高的提升度(2.6)推断出来。提升度为负数,无关联!{啤酒→浆果}的情况则恰好相反。从提升度小于1这一点,我们可以得出结论:如果一位顾客购买了啤酒,那么可能不会买浆果。虽然很容易算出各个商品组合的销售频率,但是商家往往更感兴趣的是所有的热销商品组合。为此,需要先为每种可能的商品组合计算支持度,然后找到支持度高于指定阈值的商品组合。那么如何去计算和找出热销商品的组合策略呢?手动的去就是,综合比对吗?如果是在理解算法原理,那倒是可以,但是如果是在进行项目实战,显然无法进行。提升度难道是最好的判断标准吗?显然不是,下面我们一起看看,提升度会受到哪些因素的影响吧!以及提升度的来源是什么?提升度和零事务的关系假设:10000个超市订单(10000个事务),其中购买三元牛奶(A事务)的6000个,购买伊利牛奶(B事务)的7500个,4000个同时包含两者。三元牛奶(A事务)和伊利牛奶(B事务)的支持度为:0.4三元牛奶(A事务)对伊利牛奶(B事务)的置信度为:0.67说明在购买三元牛奶后,有0.67的用户去购买伊利牛奶。伊利牛奶(B事务)对三元牛奶(A事务)的置信度为:0.53说明在购买伊利牛奶后,有0.53的用户去购买三元牛奶。在没有任何条件下,B事务的出现的比例是0.75,而出现A事务,且同时出现B事务的比例是0.67,也就是说设置了A事务出现这个条件,B事务出现的比例反而降低了。这说明A事务和B事务是排斥的。我们把0.67/0.75的比值作为提升度,即P(B|A)/P(B),称之为A条件对B事务的提升度,即有A作为前提,对B出现的概率有什么样的影响,如果提升度=1说明A和B没有任何关联,如果<1,说明A事务和B事务是排斥的,>1,我们认为A和B是有关联的,但是在具体的应用之中,我们认为提升度>3才算作值得认可的关联。提升度是一种很简单的判断关联关系的手段,但是在实际应用过程中受零事务的影响比较大,零事务在上面例子中可以理解为既没有购买三元牛奶也没有购买伊利牛奶的订单。数值为10000-4000-2000-3500=500,可见在本例中,零事务非常小,但是在现实情况中,零事务是很大的。在本例中如果保持其他数据不变,把10000个事务改成1000000个事务,那么计算出的提升度就会明显增大,此时的零事务很大(1000000-4000-2000-3500),可见提升度是与零事务有关的,零事务越多,提升度越高。
①机器学习分类算法之LightGBM(梯度提升框架)
走进LightGBM什么是LightGBM?在上一篇的文章里,我介绍了XGBoost算法,它是是很多的比赛的大杀器,但是在使用过程中,其训练耗时很长,内存占用比较大。在2017年年1月微软在GitHub的上开源了LightGBM。该算法在不降低准确率的前提下,速度提升了10倍左右,占用内存下降了3倍左右。LightGBM是个快速的,分布式的,高性能的基于决策树算法的梯度提升算法。可用于排序,分类,回归以及很多其他的机器学习任务中。GBDT (Gradient Boosting Decision Tree) 是机器学习中一个长盛不衰的模型,其主要思想是利用弱分类器(决策树)迭代训练以得到最优模型,该模型具有训练效果好、不易过拟合等优点。GBDT不仅在工业界应用广泛,通常被用于多分类、点击率预测、搜索排序等任务;在各种数据挖掘竞赛中也是致命武器,据统计Kaggle上的比赛有一半以上的冠军方案都是基于GBDT。而LightGBM(Light Gradient Boosting Machine)是一个实现GBDT算法的框架,支持高效率的并行训练,并且具有更快的训练速度、更低的内存消耗、更好的准确率、支持分布式可以快速处理海量数据等优点。LightGBM是一个梯度提升框架,使用基于树的学习算法。常用的机器学习算法,例如神经网络等算法,都可以以mini-batch的方式训练,训练数据的大小不会受到内存限制。而GBDT在每一次迭代的时候,都需要遍历整个训练数据多次。如果把整个训练数据装进内存则会限制训练数据的大小;如果不装进内存,反复地读写训练数据又会消耗非常大的时间。尤其面对工业级海量的数据,普通的GBDT算法是不能满足其需求的。LightGBM提出的主要原因就是为了解决GBDT在海量数据遇到的问题,让GBDT可以更好更快地用于工业实践。XGBoost的缺点在LightGBM提出之前,最有名的GBDT工具就是XGBoost了,它是基于预排序方法的决策树算法。这种构建决策树的算法基本思想是:首先,对所有特征都按照特征的数值进行预排序。其次,在遍历分割点的时候用O(#data)的代价找到一个特征上的最好分割点。最后,在找到一个特征的最好分割点后,将数据分裂成左右子节点。这样的预排序算法的优点是能精确地找到分割点。但是缺点也很明显:首先,空间消耗大。这样的算法需要保存数据的特征值,还保存了特征排序的结果(例如,为了后续快速的计算分割点,保存了排序后的索引),这就需要消耗训练数据两倍的内存。其次,时间上也有较大的开销,在遍历每一个分割点的时候,都需要进行分裂增益的计算,消耗的代价大。最后,对cache优化不友好。在预排序后,特征对梯度的访问是一种随机访问,并且不同的特征访问的顺序不一样,无法对cache进行优化。同时,在每一层长树的时候,需要随机访问一个行索引到叶子索引的数组,并且不同特征访问的顺序也不一样,也会造成较大的cache miss。LightGBM的优化为了避免XGBoost的缺陷,并且能够在不损害准确率的条件下加快GBDT模型的训练速度,lightGBM在传统的GBDT算法上进行了如下优化:基于Histogram的决策树算法。单边梯度采样 Gradient-based One-Side Sampling(GOSS):使用GOSS可以减少大量只具有小梯度的数据实例,这样在计算信息增益的时候只利用剩下的具有高梯度的数据就可以了,相比XGBoost遍历所有特征值节省了不少时间和空间上的开销。互斥特征捆绑 Exclusive Feature Bundling(EFB):使用EFB可以将许多互斥的特征绑定为一个特征,这样达到了降维的目的。带深度限制的Leaf-wise的叶子生长策略:大多数GBDT工具使用低效的按层生长 (level-wise) 的决策树生长策略,因为它不加区分的对待同一层的叶子,带来了很多没必要的开销。实际上很多叶子的分裂增益较低,没必要进行搜索和分裂。LightGBM使用了带有深度限制的按叶子生长 (leaf-wise) 算法。直接支持类别特征(Categorical Feature)支持高效并行Cache命中率优化LightGBM的基本原理LightGBM树的生长方式是垂直方向的,其他的算法都是水平方向的,也就是说Light GBM生长的是树的叶子,其他的算法生长的是树的层次。LightGBM选择具有最大误差的树叶进行生长,当生长同样的树叶,生长叶子的算法可以比基于层的算法减少更多的loss。下面的图解释了LightGBM和其他的提升算法的实现在 Histogram 算法之上,LightGBM 进行进一步的优化。首先它抛弃了大多数 GBDT 工具使用的按层生长 (level-wise) 的决策树生长策略,而使用了带有深度限制的按叶子生长 (leaf-wise) 算法。Level-wise 过一次数据可以同时分裂同一层的叶子,容易进行多线程优化,也好控制模型复杂度,不容易过拟合。但实际上 Level-wise 是一种低效的算法,因为它不加区分的对待同一层的叶子,带来了很多没必要的开销,因为实际上很多叶子的分裂增益较低,没必要进行搜索和分裂。 Leaf-wise 则是一种更为高效的策略,每次从当前所有叶子中,找到分裂增益最大的一个叶子,然后分裂,如此循环。因此同 Level-wise 相比,在分裂次数相同的情况下,Leaf-wise 可以降低更多的误差,得到更好的精度。Leaf-wise 的缺点是可能会长出比较深的决策树,产生过拟合。因此 LightGBM 在 Leaf-wise 之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合。 数据的数量每天都在增加,对于传统的数据科学算法来说,很难快速的给出结果。LightGBM的前缀‘Light’表示速度很快。LightGBM可以处理大量的数据,运行时占用很少的内存。另外一个理由,LightGBM为什么这么受欢迎是因为它把重点放在结果的准确率上。LightGBM还支持GPU学习,因此,数据科学家广泛的使用LightGBM来进行数据科学应用的部署。既然可以提升速度,那么它可以在小数据集上面使用吗?不可以!不建议在小数据集上使用LightGBM。LightGBM对过拟合很敏感,对于小数据集非常容易过拟合。对于多小属于小数据集,并没有什么阈值,但是从我的经验,我建议对于10000+以上的数据的时候,再使用LightGBM。这也很明显,因为小的数据集使用XGBoost就可以了呀。实现LightGBM非常简单,复杂的是参数的调试。LightGBM有超过100个参数,但是不用担心,你不需要所有的都学。Histogram 算法直方图算法的基本思想是先把连续的浮点特征值离散化成k个整数,同时构造一个宽度为k的直方图。在遍历数据的时候,根据离散化后的值作为索引在直方图中累积统计量,当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点。使用直方图算法有很多优点。首先,最明显就是内存消耗的降低,直方图算法不仅不需要额外存储预排序的结果,而且可以只保存特征离散化后的值,而这个值一般用 8 位整型存储就足够了,内存消耗可以降低为原来的1/8。 (内存消耗低) 然后在计算上的代价也大幅降低,预排序算法每遍历一个特征值就需要计算一次分裂的增益,而直方图算法只需要计算k次(k可以认为是常数),时间复杂度从O(#data*#feature)优化到O(k*#features)。 当然,Histogram 算法并不是完美的。由于特征被离散化后,找到的并不是很精确的分割点,所以会对结果产生影响。但在不同的数据集上的结果表明,离散化的分割点对最终的精度影响并不是很大,甚至有时候会更好一点。直方图加速 LightGBM 另一个优化是 Histogram(直方图)做差加速。一个容易观察到的现象:一个叶子的直方图可以由它的父亲节点的直方图与它兄弟的直方图做差得到。通常构造直方图,需要遍历该叶子上的所有数据,但直方图做差仅需遍历直方图的k个桶。利用这个方法,LightGBM 可以在构造一个叶子的直方图后,可以用非常微小的代价得到它兄弟叶子的直方图,在速度上可以提升一倍。实际上大多数机器学习工具都无法直接支持类别特征,一般需要把类别特征,转化到多维的0/1 特征,降低了空间和时间的效率。而类别特征的使用是在实践中很常用的。基于这个考虑,LightGBM 优化了对类别特征的支持,可以直接输入类别特征,不需要额外的0/1 展开。并在决策树算法上增加了类别特征的决策规则。在 Expo 数据集上的实验,相比0/1 展开的方法,训练速度可以加速 8 倍,并且精度一致。据我们所知,LightGBM 是第一个直接支持类别特征的 GBDT 工具。 LightGBM 的单机版本还有很多其他细节上的优化,比如 cache 访问优化,多线程优化,稀疏特征优化等等。优化汇总如下:LightGBM并行优化LightGBM 还具有支持高效并行的优点。LightGBM 原生支持并行学习,目前支持特征并行和数据并行的两种。 ? ?特征并行的主要思想是在不同机器在不同的特征集合上分别寻找最优的分割点,然后在机器间同步最优的分割点。 ? ?数据并行则是让不同的机器先在本地构造直方图,然后进行全局的合并,最后在合并的直方图上面寻找最优分割点。 LightGBM 针对这两种并行方法都做了优化: ? ?在特征并行算法中,通过在本地保存全部数据避免对数据切分结果的通信; ? ?在数据并行中使用分散规约 (Reduce scatter) 把直方图合并的任务分摊到不同的机器,降低通信和计算,并利用直方图做差,进一步减少了一半的通信量。基于投票的数据并行则进一步优化数据并行中的通信代价,使通信代价变成常数级别。在数据量很大的时候,使用投票并行可以得到非常好的加速效果。注意:当生长相同的叶子时,Leaf-wise 比 level-wise 减少更多的损失。高速,高效处理大数据,运行时需要更低的内存,支持 GPU不要在少量数据上使用,会过拟合,建议 10,000+ 行记录时使用。
大数据面试--HBASE
一、HBASE的特点是什么?1)大:一个表可以有数十亿行,上百万列;2)无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中不同的行可以有截然不同的列;3)面向列:面向列(族)的存储和权限控制,列(族)独立检索;4)稀疏:空(null)列并不占用存储空间,表可以设计的非常稀疏;5)数据多版本:每个单元中的数据可以有多个版本,默认情况下版本号自动分配,是单元格插入时的时间戳;6)数据类型单一:Hbase 中的数据都是字符串,没有类型。二、HBASE适用于什么场景?① 半结构化或非结构化数据 对于数据结构字段不够确定或杂乱无章很难按一个概念去进行抽取的数据适合用 HBase。以上面的例子为例,当业务发展需要存储 author 的 email,phone, address 信息时 RDBMS 需要停机维护,而 HBase 支持动态增加。② 记录非常稀疏RDBMS 的行有多少列是固定的,为 null 的列浪费了存储空间。而如上文提到的,HBase 为 null 的 Column 不会被存储,这样既节省了空间又提高了读性能。③ 多版本数据如上文提到的根据 Row key 和 Column key 定位到的 Value 可以有任意数量的版本值,因此对于需要存储变动历史记录的数据,用 HBase 就非常方便了。比如上例中的 author 的 Address 是会变动的,业务上一般只需要最新的值,但有时可能需要查询到历史值。④ 超大数据量当数据量越来越大,RDBMS 数据库撑不住了,就出现了读写分离策略,通过一个 Master 专门负责写操作,多个 Slave 负责读操作,服务器成本倍增。 随着压力增加,Master 撑不住了,这时就要分库了,把关联不大的数据分开部署,一些 join 查询不能用了,需要借助中间层。随着数据量的进一步增加, 一个表的记录越来越大,查询就变得很慢,于是又得搞分表,比如按 ID 取模分成多个表以减少单个表的记录数。经历过这些事的人都知道过程是多么的折腾。 采用HBase 就简单了,只需要加机器即可,HBase 会自动水平切分扩展,跟Hadoop 的无缝集成保障了其数据可靠性(HDFS)和海量数据分析的高性能(MapReduce)。三、HBASE的rowkey的设计原则?(1)Rowkey 长度原则Rowkey 是一个二进制码流,Rowkey 的长度被很多开发者建议说设计在10~100 个字节,不过建议是越短越好,不要超过 16 个字节。原因如下:① 数据的持久化文件 HFile 中是按照 KeyValue 存储的,如果 Rowkey 过长比如 100 个字节,1000 万列数据光 Rowkey 就要占用 100*1000 万=10 亿个字节, 将近 1G 数据,这会极大影响 HFile 的存储效率;② MemStore 将缓存部分数据到内存,如果 Rowkey 字段过长内存的有效利用率会降低,系统将无法缓存更多的数据,这会降低检索效率。 因此 Rowkey的字节长度越短越好。③ 目前操作系统是都是 64 位系统,内存 8 字节对齐。控制在 16 个字节,8字节的整数倍利用操作系统的最佳特性。(2)Rowkey 散列原则如果 Rowkey 是按时间戳的方式递增,不要将时间放在二进制码的前面,建议将 Rowkey 的高位作为散列字段,由程序循环生成,低位放时间字段, 这样将提高数据均衡分布在每个 Regionserver 实现负载均衡的几率。如果没有散列字段,首字段直接是时间信息将产生所有新数据都在一个 RegionServer 上堆积的 热点现象,这样在做数据检索的时候负载将会集中在个别RegionServer,降低查询效率。(3)Rowkey 唯一原则必须在设计上保证其唯一性。四、hbase中scan和get的功能以及实现的异同?HBase 的查询实现只提供两种方式:1)按指定 RowKey 获取唯一一条记录,get 方法(org.apache.hadoop.hbase.client.Get) Get 的方法处理分两种 : 设置了ClosestRowBefore 和 没有设置 ClosestRowBefore 的 rowlock。主要是用来保证行的事务性,即每个 get 是以一个 row 来标记的。一个 row 中可以有很多 family 和 column。2)按指定的条件获取一批记录,scan 方法(org.apache.Hadoop.hbase.client.Scan)实现条件查询功能使用的就是 scan方式。(1)scan 可以通过 setCaching 与 setBatch 方法提高速度(以空间换时间);(2)scan 可以通过 setStartRow 与 setEndRow 来限定范围([start,end)start 是闭区间,end 是开区间)。范围越小,性能越高。(3)scan 可以通过 setFilter 方法添加过滤器,这也是分页、多条件查询的基础。五、hbase中的cell结构?HBase 中通过 row 和 columns 确定的为一个存贮单元称为 cell。Cell:由{row key, column(= + ), version}唯一确定的单元。cell 中的数据是没有类型的,全部是字节码形式存贮。六、简述 HBase 中 compact 用途是什么,什么时候触发,分为哪两种,有什么区别,有哪些相关配置参数?在 hbase 中每当有 memstore 数据 flush 到磁盘之后,就形成一个 storefile,当 storeFile 的数量达到一定程度后,就需要将 storefile 文件来 进行compaction 操作。Compact 的作用:① 合并文件② 清除过期,多余版本的数据③ 提高读写数据的效率HBase 中实现了两种 compaction 的方式:minor and major. 这两种compaction 方式的区别是:1)Minor 操作只用来做部分文件的合并操作以及包括 minVersion=0 并且设置 ttl 的过期版本清理,不做任何删除数据、多版本数据的清理工作。2)Major 操作是对 Region 下的 HStore 下的所有 StoreFile 执行合并操作,最终的结果是整理合并出一个文件。七、每天百亿数据存入 HBase,如何保证数据的存储正确和在规定的时间里全部录入完毕,不残留数据?需求分析:1)百亿数据:证明数据量非常大;2)存入 HBase:证明是跟 HBase 的写入数据有关;3)保证数据的正确:要设计正确的数据结构保证正确性;4)在规定时间内完成:对存入速度是有要求的。解决思路:1)数据量百亿条,什么概念呢?假设一整天 60x60x24 = 86400 秒都在写入数据,那么每秒的写入条数高达 100 万条,HBase 当然是支持不了每秒百万条数据的, 所以这百亿条数据可能不是通过实时地写入,而是批量地导入。批量导入推荐使用 BulkLoad 方式(推荐阅读:Spark 之读写 HBase),性能是普通写入方式几倍以上;2)存入 HBase:普通写入是用 JavaAPI put 来实现,批量导入推荐使用BulkLoad;3)保证数据的正确:这里需要考虑 RowKey 的设计、预建分区和列族设计等问题;4)在规定时间内完成也就是存入速度不能过慢,并且当然是越快越好,使用BulkLoad。八、hbase优化方法?1)减少调整减少调整这个如何理解呢?HBase 中有几个内容会动态调整,如 region(分区)、HFile,所以通过一些方法来减少这些会带来 I/O 开销的调整。① Region如果没有预建分区的话,那么随着 region 中条数的增加,region 会进行分裂,这将增加 I/O 开销,所以解决方法就是根据你的 RowKey 设计来进行预建分区, 减少 region 的动态分裂。② HFileHFile 是数据底层存储文件,在每个 memstore 进行刷新时会生成一个HFile,当 HFile 增加到一定程度时,会将属于一个 region 的 HFile 进行合并,这个步骤会带来开销但不可避免,但是合并后 HFile 大小如果大于设定的值,那么 HFile 会重新分裂。为了减少这样的无谓的 I/O 开销,建议估计项目数据量大小, 给 HFile 设定一个合适的值。2)减少启停数据库事务机制就是为了更好地实现批量写入,较少数据库的开启关闭带来的开销,那么 HBase 中也存在频繁开启关闭带来的问题。① 关闭 Compaction,在闲时进行手动 Compaction。因为 HBase 中存在 Minor Compaction 和 Major Compaction,也就是对HFile 进行合并,所谓合并就是 I/O 读写,大量的 HFile 进行肯定会带来 I/O开销, 甚至是 I/O 风暴,所以为了避免这种不受控制的意外发生,建议关闭自动 Compaction,在闲时进行 compaction。② 批量数据写入时采用 BulkLoad。如果通过 HBase-Shell 或者 JavaAPI 的 put 来实现大量数据的写入,那么性能差是肯定并且还可能带来一些意想不到的问题,所以当需要写入大量离线数据时 建议使用 BulkLoad。3)减少数据量虽然我们是在进行大数据开发,但是如果可以通过某些方式在保证数据准确性同时减少数据量,何乐而不为呢?① 开启过滤,提高查询速度开启 BloomFilter,BloomFilter 是列族级别的过滤,在生成一个 StoreFile同时会生成一个 MetaBlock,用于查询时过滤数据② 使用压缩一般推荐使用 Snappy 和 LZO 压缩4)合理设计在一张 HBase 表格中 RowKey 和 ColumnFamily 的设计是非常重要,好的设计能够提高性能和保证数据的准确性① RowKey 设计:应该具备以下几个属性散列性:散列性能够保证相同相似的 rowkey 聚合,相异的 rowkey 分散,有利于查询。简短性:rowkey 作为 key 的一部分存储在 HFile 中,如果为了可读性将rowKey 设计得过长,那么将会增加存储压力。唯一性:rowKey 必须具备明显的区别性。业务性:举例来说:假如我的查询条件比较多,而且不是针对列的条件,那么 rowKey 的设计就应该支持多条件查询。如果我的查询要求是最近插入的数据优先,那么 rowKey 则可以采用叫上Long.Max-时间戳的方式,这样 rowKey 就是递减排列。② 列族的设计:列族的设计需要看应用场景优势:HBase 中数据时按列进行存储的,那么查询某一列族的某一列时就不需要全盘扫描,只需要扫描某一列族,减少了读 I/O; 其实多列族设计对减少的作用不是很明显,适用于读多写少的场景劣势:降低了写的 I/O 性能。原因如下:数据写到 store 以后是先缓存在memstore 中,同一个 region 中存在多个列族则存在多个 store, 每个 store都一个 memstore,当其实 memstore 进行 flush 时,属于同一个 region 的store 中的 memstore 都会进行 flush,增加 I/O 开销。九、region如何预建分区?预分区的目的主要是在创建表的时候指定分区数,提前规划表有多个分区,以及每个分区的区间范围,这样在存储的时候 rowkey 按照分区的区间存储,可以避免 region 热点问题。通常有两种方案:方案 1:shell 方法create ‘tb_splits’, {NAME => ‘cf’,VERSIONS=> 3},{SPLITS =>[‘10’,’20’,’30’]}方案 2:JAVA 程序控制① 取样,先随机生成一定数量的 rowkey,将取样数据按升序排序放到一个集合里;② 根据预分区的 region 个数,对整个集合平均分割,即是相关的 splitKeys;③ HBaseAdmin.createTable(HTableDescriptortableDescriptor,byte[][]splitkeys)可以指定预分区的 splitKey, 即是指定region 间的 rowkey 临界值。十、HRegionServer 宕机如何处理?1)ZooKeeper 会监控 HRegionServer 的上下线情况,当 ZK 发现某个HRegionServer 宕机之后会通知 HMaster 进行失效备援;2)该 HRegionServer 会停止对外提供服务,就是它所负责的 region 暂时停止对外提供服务;3)HMaster 会将该 HRegionServer 所负责的 region 转移到其他HRegionServer 上,并且会对 HRegionServer 上存在 memstore 中还未持久化到磁盘中的数据进行恢复;4)这个恢复的工作是由 WAL 重播来完成,这个过程如下:① wal 实际上就是一个文件,存在/hbase/WAL/对应 RegionServer 路径下。② 宕机发生时,读取该 RegionServer 所对应的路径下的 wal 文件,然后根据不同的 region 切分成不同的临时文件 recover.edits。③ 当 region 被分配到新的 RegionServer 中,RegionServer 读取 region时会进行是否存在 recover.edits,如果有则进行恢复。十一、habse读写流程?读:① HRegionServer 保存着 meta 表以及表数据,要访问表数据,首先 Client先去访问 zookeeper,从 zookeeper 里面获取 meta 表所在的位置信息, 即找到这个 meta 表在哪个 HRegionServer 上保存着。② 接着 Client 通过刚才获取到的 HRegionServer 的 IP 来访问 Meta 表所在的 HRegionServer,从而读取到 Meta,进而获取到 Meta 表中存放的元数据。③ Client 通过元数据中存储的信息,访问对应的 HRegionServer,然后扫描所在 HRegionServer 的 Memstore 和 Storefile 来查询数据。④ 最后 HRegionServer 把查询到的数据响应给 Client。写:① Client 先访问 zookeeper,找到 Meta 表,并获取 Meta 表元数据。② 确定当前将要写入的数据所对应的 HRegion 和 HRegionServer 服务器。③ Client 向该 HRegionServer 服务器发起写入数据请求,然后HRegionServer 收到请求并响应。④ Client 先把数据写入到 HLog,以防止数据丢失。⑤ 然后将数据写入到 Memstore。⑥ 如果 HLog 和 Memstore 均写入成功,则这条数据写入成功。⑦ 如果 Memstore 达到阈值,会把 Memstore 中的数据 flush 到 Storefile中。⑧ 当 Storefile 越来越多,会触发 Compact 合并操作,把过多的 Storefile合并成一个大的 Storefile。⑨ 当 Storefile 越来越大,Region 也会越来越大,达到阈值后,会触发 Split操作,将 Region 一分为二。十二、habse的内部机制是什么?Hbase 是一个能适应联机业务的数据库系统物理存储:hbase 的持久化数据是将数据存储在 HDFS 上。存储管理:一个表是划分为很多 region 的,这些 region 分布式地存放在很多 regionserver 上 Region 内部还可以划分为 store, store 内部有memstore 和 storefile。版本管理:hbase 中的数据更新本质上是不断追加新的版本,通过 compact操作来做版本间的文件合并 Region 的 split。集群管理:ZooKeeper + HMaster + HRegionServer。十三、Hbase 中的 memstore 是用来做什么的?hbase 为了保证随机读取的性能,所以 hfile 里面的 rowkey 是有序的。当客户端的请求在到达 regionserver 之后,为了保证写入 rowkey 的有序性, 所以不能将数据立刻写入到 hfile 中,而是将每个变更操作保存在内存中,也就是memstore 中。memstore 能够很方便的支持操作的随机插入, 并保证所有的操作在内存中是有序的。当 memstore 达到一定的量之后,会将 memstore里面的数据 flush 到 hfile 中,这样能充分利用 hadoop 写入大文件的性能优势, 提高写入性能。由于 memstore 是存放在内存中,如果 regionserver 因为某种原因死了,会导致内存中数据丢失。所有为了保证数据不丢失, hbase 将更新操作在写入memstore 之前会写入到一个 write ahead log(WAL)中。WAL 文件是追加、顺序写入的,WAL 每个 regionserver 只有一个, 同一个 regionserver 上所有 region 写入同一个的 WAL 文件。这样当某个 regionserver 失败时,可以通过 WAL 文件,将所有的操作顺序重新加载到 memstore 中。十四、HBase 在进行模型设计时重点在什么地方?一张表中定义多少个Column Family 最合适?为什么?Column Family 的个数具体看表的数据,一般来说划分标准是根据数据访问频度,如一张表里有些列访问相对频繁,而另一些列访问很少, 这时可以把这张表划分成两个列族,分开存储,提高访问效率。十五、如何提高 HBase 客户端的读写性能?请举例① 开启 bloomfilter 过滤器,开启 bloomfilter 比没开启要快 3、4 倍② Hbase 对于内存有特别的需求,在硬件允许的情况下配足够多的内存给它③ 通过修改 hbase-env.sh 中的 export HBASE_HEAPSIZE=3000 #这里默认为 1000m④ 增大 RPC 数量通过修改 hbase-site.xml 中的 hbase.regionserver.handler.count 属性,可以适当的放大 RPC 数量,默认值为 10 有点小。十六、hbase集群安装注意事项?① HBase 需要 HDFS 的支持,因此安装 HBase 前确保 Hadoop 集群安装完成;② HBase 需要 ZooKeeper 集群的支持,因此安装 HBase 前确保ZooKeeper 集群安装完成;③ 注意 HBase 与 Hadoop 的版本兼容性;④ 注意 hbase-env.sh 配置文件和 hbase-site.xml 配置文件的正确配置;⑤ 注意 regionservers 配置文件的修改;⑥ 注意集群中的各个节点的时间必须同步,否则启动 HBase 集群将会报错。十七、直接将时间戳作为行健,在写入单个 region 时候会发生热点问题,为什么呢?region 中的 rowkey 是有序存储,若时间比较集中。就会存储到一个 region中,这样一个 region 的数据变多,其它的 region 数据很少,加载数据就会很慢, 直到 region 分裂,此问题才会得到缓解。十八、如何解决 HBase 中 region 太小和 region 太大带来的冲突?Region 过大会发生多次 compaction,将数据读一遍并重写一遍到 hdfs 上,占用 io,region 过小会造成多次 split,region 会下线,影响访问服务, 最佳的解决方法是调整 hbase.hregion. max.filesize 为 256m。
Session Replay产品调研分析
Session Replay,可以译为会话回放、会话追踪,相关商业化软件的目的在于提供给用户在网站中记录和回放浏览者的会话的能力,用户体验团队、产品团队、营销团队往往会利用这些 Session Replay 产品提供的清晰的交互画面,进行一系列的数据分析,以便了解浏览者真实的使用体验并进行针对性的优化,这其中包括但不限于:核心功能的交互路径遇到的错误一些困惑的使用交互产品视图结合G2商业化软件的搜索结果和G2评分排名,我们可以看到老牌劲旅 Dynatrace,以及专注于做会话分析的LogRocket、fullstory名列前茅,更多维度的比较和排名可以参考:https://www.g2.com/categories/session-replay?utf8=%E2%9C%93&order=g2_score本文接下来将会从功能使用、隐私处理和问题三个方面,挑选 Dynatrace 和 LogRocket 进行产品进行调研和分析DynatraceDynatrace 作为 APM 领域的佼佼者,在可观测性方面的产品能力一直保持领先,单看 Session Replay 这一项功能,其可配置项几乎是同类产品中最多的,首先看看功能功能通过其控制台 Web 页签,创建一个 Web 类型的应用,利用 Agentless 的方式注入 JavaScript 的探针采集一些网页的基础数据此时,我们可以清晰的看到一张当前网页各类分析的仪表盘,并提供了详细分析的入口,其中包含了会话分析性能分析(页面加载、用户交互性能分析)用户行为分析(Top action、event)错误分析网站可用性分析域名分析页面访问分布本文不做具体展开,后续会有专门的文章来讲解 Dynatrace 的 Web APM 功能,本文重点看会话分析相关功能点击网页右上角的用户会话分析按钮,我们可以进入一个会话分类搜索的页面,这里我们看到可以通过各类过滤条件进行筛选,比如应用名、应用类型、浏览器类型、浏览器版本、地理位置等,下面就是根据过滤条件得到的结果,包含了此类型会话的一些基础信息(平均时长、会话数、平均访问情况等)进入具体的页面能看到该类型会话的具体每一个会话列表,如果打开了 Session Replay 功能,则可以进入 Replay 页面进行查看隐私处理从上面的动图可以看到,回放时候,页面的绝大部分被 * 所替代,大多数类似的产品在设计功能的时候都需要考虑用户隐私,毕竟采用录屏的方式去获取浏览者的访问行为,很大程度上会带来用户隐私的挑战。在 Dynatrace 中,主要提供了以下几个功能:设置录制开关首先我们可以看到,Dynatrace 提供了一个开关来供用户进行可操作的 Session Replay 模式,打开这个模式的时候,Dynatrace 中的 Session replay 功能需要用户在代码中手动调用 enableSessionReplay 从而开始录制数据的采集,这样用户就可以根据一些页面url、特定访问路径,来灵活的控制什么时候进行页面数据的录制录制数据的敏感信息屏蔽另外可以看到,Dynatrace 提供了几个敏感数据屏蔽的等级,可以依据自身网页的特点,对录制数据的关键信息进行屏蔽,比如承载用户输入的 input 框这类敏感操作,就可以利用 Mask user input 这个等级进行处理。问题由于录制页面并不是传统的录屏技术,而是采用的浏览器增量快照的形式,具体的浏览器录制技术可以参考之前写的调研文章:浏览器录制技术,所以存在很多录制内容的限制,Dynatrace 也在文档中有所说明我们也可以看到,利用DOM增量快照的形式,无法录制的环节主要就会集中在以下3个方面的内容特殊的标签:媒体元素、Canvas、WebGL、浏览器控件等Iframe:跨越了Frame的方式,无法保证同源和 Iframe 内部的脚本过期的资源或者需要权限访问的私人资源,包括但不限于图片资源、CSS样式资源、URL外链LogRocket功能相对于 Dynatrace 非常庞大的功能组合,LogRocket 非常简单轻量,LogRocket几乎只专注于用户行为分析方面的研究和深入,提供访问日志、会话分析、错误分析、时序分析、路径分析、热力图等功能,整理而言都是为了用户体验、用户行为分析服务,我们可以看到功能分布也十分清晰会话分析部分,也是包含了一些会话的基本内容(发生时间、时长、浏览器版本、IP等),也可在很明显的位置看到回放的按钮。在会话回放的页面,我们可以看到 LogRocket 除了提供基本的回放窗口以外,还提供了类似 Chrome 的 Devtool 工具,从而帮助用户从性能、访问栈的维度,对此次回放进行更深层次的分析,另外回放的进度条上也标注了错误的点,toolbar 也和 Dynatrace 类似,提供了倍数、跳过无交互阶段、全屏、键盘事件等一系列的功能。隐私处理LogRocket 并未像 Dynatrace 一样提供了几个等级的隐私策略,而是利用几种规则来处理:通过data-private标签来指定具体的 DOM 块进行屏蔽通过两个配置 textSanitizer 和 inputSanitizer 来进行配置,对 text 和 input 单独处理,类似 mask-all 和mask-user-input 的屏蔽等级通过data-public也可以屏蔽掉的元素显示置回来问题和 Dynatrace 一样,基于 DOM 增量快照录制的方式,几乎都有类似的问题,比如 CSS 资源不可访问、Shadow DOM等,更多的详情可以参考:https://docs.logrocket.com/docs/troubleshooting-sessions写在最后Session Replay 技术目前应用的领域主要还是集中于用户行为分析,错误定位等场景,还有类似 FullStory 的不仅仅有自身的方案,还提供了和集成的能力,比如监控领域很出名的 Sentry 就是采用的FullStory的集成方案来透出 Session Replay 的相关功能,而绝大部分商业化产品都是提供了一个大而全的数字化分析方案,Session Replay 只是其中很小的一环,需要结合日志数据、时序数据、全链路Trace、机器学习等方案进行全方面的分析。
一文了解 SLS 文本分析作业
使用场景与限制在海量日志场景下,由于信息爆炸,传统的关键词过滤、正则匹配等手段依赖大量的专家知识,因此我们很难快速的从日志中获取关键信息。对此文本分析作业首先对海量日志数据进行聚类,聚类得到的日志类别数量往往远小于原始日志的数量,这样我们就可以方便的浏览这些日志类别获取日志的整体信息,如果出现某些高风险的日志类别,可以根据类别信息进一步查找与之相关的原始日志,快速定位需要关注的原始日志。在得到日志的聚类结果之外,文本分析作业还会持续跟踪各个日志类别的状态变化,包括是否有新的、未知的日志类别产生,某类别日志的日志量是否发生了突变,以及出现的低频的、罕见的日志,这三类状态变化很有可能与系统的潜在风险相关,用户可以通过查看这几状态变化,进一步缩小问题定位时的排查范围。文本分析作业以滑动窗口的形式准实时的处理数据,依次对每一个时间窗口内的日志进行聚类,再将不同时间窗口中的日志类别进行关联,以便实现对于不同日志类别状态的跟踪检测,如下图所示时间窗口中的日志聚类情况要在这个窗口结束后才会产生,分析结果有大约一个时间窗口长度的延迟,目前可选的时间窗口长度大于5分钟,因此对于时效性要求比较高的场景可能不适用。日志聚类算法的准确性会受到日志结构、复杂性的影响,如果日志中包含超过50%的变量成分(logging 语句中动态填充的部分),聚类算法的准确性会降低,因此文本分析作业更适用于稳定、规范的系统日志,对于复杂度、灵活度较高的业务日志,如果聚类的准去性较低,可以考虑使用 SLS 数据加工能力对原始数据进行一定的预处理,去除日志中不需要考虑的变量成分后再使用文本分析作业进行处理。文本分析作业持续消费日志库中的原始日志,如果日志库中的日志量太大,比如一个时间窗口中日志量超过了分析作业的处理能力,那么文本分析作业的进度相对于日志产生进度越来越滞后,最终丧失时效性。目前文本分析作业可以处理每分钟30w左右的日志,如果日志结构比较简单,那么可以处理更多日志。如果日志量超过了处理能力,那么一方面可以用算法提供的黑白名单能力过滤掉需要用关心的日志(比如 debug, info 等级的日志),减少处理的日志量,另一方面如果日志分布在多个 shard 上,可以申请增加文本分析作业的资源,提高分析的并行度。作业配置说明文本分析作业的配置主要包含两类配置数据配置:指定待分析的文本数据所在的日志库与日志字段,文本分析作业使用数据配置读写指定的日志库算法配置:指定文本聚类算法的参数,文本分析作业使用这些参数对算法进行初始化数据说明在上一节我们提到日志聚类算法对于日志的结构和复杂性有一定的要求,如果变量成分太多会影响聚类的准确性。因此我们待处理的日志最好是结构化和半结构化的数据,文本分析作业可以使用日志结构方便的忽略日志中不需要考虑的变量部分。以 K8S 运行时日志为例,我们在日志采集时将日志整理成了以下的结构{
"eventId": {
"metadata": {
"name": "fxs8k4kpprzxfm7.16c9b3e37060acb6",
"namespace": "default",
"selfLink": "/api/v1/namespaces/default/events/fxs8k4kpprzxfm7.16c9b3e37060acb6",
"uid": "5e9a03f8-7f67-4fbd-8e5a-3e5a2ac979fd",
"resourceVersion": "143303381",
"creationTimestamp": "2022-01-13T02:35:28Z"
},
"reason": "FailedMount",
"message": "Unable to mount volumes for pod",
"source": {
"component": "kuberenetes-events-generator"
},
"firstTimestamp": "2022-01-13T02:35:28Z",
"lastTimestamp": "2022-01-13T02:35:28Z",
"count": 1,
"type": "Warning",
"eventTime": null,
"reportingComponent": "",
"reportingInstance": ""
},
"__time__": 1642041328,
"hostname": "",
"__topic__": "",
"__pack_meta__": "1|MTYzMjcwMzAzOTA0NjQ2NDA2NA==|7|6",
"level": "Warning",
"__source__": "",
"pod_id": "f340de16-ff1f-4e25-910f-3b238e10d800",
"pod_name": "fxs8k4kpprzxfm7"
}可以看到 K8S 运行日志中包含大量的的变量字段,如 eventId.metadata.namespace, eventId.type 等等,对于这些结构良好的变量字段我们可以使用 SQL 查询分析进行实时统计,我们仅需要关心其中的自由文本字段,如 eventId.message。数据配置数据配置时首先需要指定文本数据所在的日志库(源日志库)以及分析结果要写入的日志库(目标日志库)。其中源日志库我们需要在作业基础信息配置页通过在相应配置项的下拉框中进行勾选,包括勾选源日志库所在 project 名称,以及源日志库的名称对于目标日志库,智能异常分析 APP 中所有作业,包括文本分析作业,都将分析结果写到源日志库所在 project 中名为 internal-ml-log 的日志库中(如果作业创建时这个日志库不存在,作业将自动创建这个日志库),我们无法修改目标日志库。完成基本信息配置后点击下一步,我们将进入数据配置和算法配置中。数据特征配置包括一下三项日志实体字段配置:非必填项,这个配置项主要是用来帮助文本分析作业区分同一个日志库中不同来源的日志。日志实体字段是日志中的若干个字段(目前最多配置2个字段),这些字段值的组合可以唯一标识日志数据的来源。我们以 K8S 日志为例,不同的系统在 K8S 环境中往往通过 namespace 进行隔离,如果我们希望分析作业分别处理不同 namespace 下的日志,那么我们可以配置日志实体字段为 eventId.metadata.namespace;进一步的,在 namespace 的基础上,我们希望文本分析作业区分不同系统模块的日志,那么我们可以再增加一个实体字段 eventId.source.component。如果我们不配置任何日志字段,分析作业将认为日志库中的日志来自同一日志来源或者用户并不需要区分日志来源,直接处理全部日志。日志文本字段配置:必填项,这个配置项主要用来指定日志中待分析的文本字段,以 K8S 日志为例,我们可以填入 eventId.message。如果有多个文本字段需要分析,我们可以在该配置项中填入多个字段,如 eventId.reason 等等。分析作业在处理时会依次拼接指定的文本字段成一个文本进行处理,如果指定的字段不是文本类型,将强制转化成文本类型处理。日志等级字段配置:非必填项,这个配置用于帮助文本分析作业判断日志的等级。分析作业在检测日志异常状态时会考虑日志等级,例如 error 日志突增的严重项要大于 info 日志的突增。如果我们没有指定或者指定了错误的日志等级字段,日志等级将被赋值为 unknown。在 K8S 日志中,level 字段标志了日志等级。算法配置算法配置包括算法的基础配置与告警配置,在基础配置中我们需要选择分析作业运行的基本参数,而在高级配置中我们更加深入的定制算法的行为。对于这两类配置我们都提供了常用的初始值。在基础配置中,目前我们提供了两类算法日志异常分析算法:该算法通过文本距离算法计算文本之间的相似度,将相似的日志聚为一类。适用于如系统日志等等规范、稳定的日志。日志模板匹配算法:该算法完全通过用户指定文本正则模板对日志数据进行配置,适用于我们可以直接从源代码获取日志 logging 语句的场景。在算法选择时,由于直接从代码的 logging 语句中获取日志模板往往比较困难,我们建议优先选择日志异常分析算法。另外为了应对一些业务场景中日志结构较为复杂、基于文本相似度的聚类算法效果可能较差的问题,我们将在近期上线基于词频的聚类算法。这两类算法都包含了以下两个相同的配置项时间窗口长度:我们在上面介绍过文本分析作业以滑动窗口的形式依次处理每个窗口中的日志数据,时间窗口长度用来配置滑动窗口的长度,以秒为单位。时间窗口长度越大,分析结果的实时性越弱。异常总数阈值:在同一个时间窗口中,可能有多个日志类别出现异常。但是日志数据作为指示性相对较弱的观测数据,个别日志类别的异常可能是有系统的正常抖动引起,并不意味着系统异常。这里的异常总数阈值表示当一个时间窗口中的异常日志类别数超过了这个阈值,那么系统可能确实存在异常。我们可以配置正整数作为绝对阈值或者 0~0.5 的小数作为相对阈值。由于该值为经验值,忘完难以选择最合适的数值,我们刚开始可以直接使用初始值。除了这两项基本配置,当我们选择日志模板匹配算法时,我们需要指定预设的日志模板的地址。首先我们需要在智能异常分析 APP 中进入 辅助数据 -> 日志模板 页面,在其中配置日志正则模板,主要包括以下配置项配置项说明source日志正则模板来源标识,用于区分不用来源的模板,比如来自 Hadoop 或者 Spark 的日志模板pattern_id日志正则模板的唯一标识符pattern日志正则模板package可选项,产生日志代码所在的 packageclass可选项,产生日志代码所在的 classlevel可选项,日志正则模板的风险等级extra可选项,为后续兼容性预留的字段日志正则模板配置完成后,在日志模板匹配算法中的模板源配置项中,我们可以勾选日志正则模板来源,如下除了算法的基础配置,我们可以展开下方的高级配置项对算法进行深度配置,包括以下配置项初始化窗口数量:默认值是 24,表示分析作业在开始运行后的 24个时间窗口内只进行算法模型的训练,不输出异常事件,在后续的时间窗口中使用训练的算法模型对日志数据进行分析处理(算法仍然会在后续的时间窗口中持续训练更新)。最大静默窗口数:默认值是 672,表示如果一个日志类别出现后的 672个时间窗口内这个日志类别没有在此出现,那么将认为这个日志类别已经消失。之后如果再次遇到该日志类别,将会产生新日志类别异常。由于分析作业同时会检测罕见日志类别异常,同样也会对于这类低频出现的日志类别进行提示,因此我们可以设置较大的最大静默窗口数。采样率:如果日志数据量巨大,超过了分析作业的处理能力,那么可以通过配置较低的采样率,只对随机部分日志进行处理。分隔符:文本分析作业使用这里配置的分隔符将文本数据进行切分。数据过滤配置:如果我们只对特对日志等级的日志感兴趣,那么可以针对日志等级配置白名单和黑名单,例如只关心 warning, error 等风险度较高的日志。分析作业运行时只会处理满足过滤条件的日志。通识字段配置:日志内容中的值可能满足特定的格式,比如时间、IP 和数字等等,我们可以针对这些特定的格式配置正则模板,分析作业运行时会使用正则模板(模板表达式)匹配日志内容,将满足模板的部分替换成统一的名称(模板名称)。默认提供 IP、日期、时间和数字的模板,可以根据日志内容的特定,配置其他正则模板。如果配置的模板太多,会影响分析作业的运行效率,建议总的模板数量在 5个以内。模板配置完成后可以通过下方的测试框进行测试,检查配置的正则模板是否符合预期。最后我们需要在调度配置中设置任务运行的起始时间,如果起始时间为过去时间,那么文本分析作业将消费历史数据,直至追到当前数据产生进度;如果配置时间为未来时间,那么文本分析作业将等到对应时刻再开始运行。上述配置完成后,点击下方的“完成”按键即完成了文本分析作业的创建。仪表盘说明在文本分析作业创建完成后,我们可以通过 智能异常分析 APP -> 文本分析 -> 作业标识 进入作业分析结果仪表盘,查看作业的分析结果。文本分析仪表盘包括以下两个页签日志模板管理页面:在这个页面中我们可以查看文本分析作业挖掘到的日志模板 ID,日志模板内容,日志等级等等信息在这里我们可以了解日志的整体信息,快速浏览日志。我们也可以通过每个日志模板右侧的概览按键查看日志模板对应的日志数量的变化以及可能的异常情况日志异常详情页面:这个页面主要关注于日志中的异常事件,这里我们可以查看各个日志类别在各个时间窗口中的异常情况,以及日志整体(包括各个日志类别)在各个时间窗口中的异常情况。我们还可以在下方的异常事件列表中查看各个异常事件的详情。在定位问题时,我们可以在日志类别异常总览色块图中查看哪一个时间窗口日志整体的异常程度比较高,点击对应的色块,将在下方的异常事件类别中展示发生在该窗口的各个异常事件;我们也可以直接在下方的日志异常事件列表中过滤和某个日志等级相关的异常,或者某种类型的异常。目前我们正在进行文本分析作业与告警的集成,是得文本分析作业中发现的异常状态可以及时的推送给用户。
②数据预处理之数据清理,数据集成,数据规约,数据变化和离散化
数据规约是指在保证原始数据信息不丢失的前提下,减少分析使用的数据量,数据规约中最常使用的方式是维规约。维规约的含义是从将原先高维的数据合理的压缩成低维数据,从而减少数据量,常用的方法为特征的提取, LDA 和 PCA 降维。特征的提取为从海量数据中选择与挖掘目标相关的属性成一个子表,不包含无关的属性,比如关于泰坦尼克号生产数据的数据挖掘中,船客 Name 与幸存率是无关的,就可以不放入子表中。PCA 是基于方差的聚类降维, LDA 是基于有监督的降维,都可以对高维数据进行降维。假定某公司进行一次知识发现的任务,选取的数据集为数据仓库中的全部数据(数据量基本在数 T 以上),固然这样可以获得的数据是最完整的,但由于数据仓库中的数据是非常大的,在如此大的数据集上进行复杂且存在迭代计算的数据分析,所要花费的时间是很长的,分析一个结果可能需要一个月的时间,时间不满足用户的需求,使得这种全量数据的分析是不可行。数据归约技术采用维规约和数据量规约等方式,可以对数据仓库中的海量数据进行提取,获得较小数据集,仍可大致保留原数据的完整性。这样,完成一个效率和效果的兼顾,在允许的时间内完成数据挖掘任务。?数据的变换是将原始的特征数据进行归一化和标准化的操作。归一化是将原始数值变为(0,1)之间的小数,变换函数可采用最小最大规范化等方法。标准化是将数据按比例缩放,使之落入一个小的特定区间,常用的函数为是 z-score 标准化,处理后的均值为 0,标准差为 1,一般标准化要求原始数据近似符合高斯分布。归一化的原因在于不同变量往往量纲不同,归一化可以消除量纲对最终结果的影响,使不同变量具有可比性。数据挖掘过程中,数值较大的特征,会被算法当成权重较大,但实际情况是数值较大,并不一定代表该特征更重要,归一化和标准化后的数据可以避免这个问题的出现。数据离散化可通过聚类,直方图,分箱等方式完成数据的离散化。 下面介绍一下具体的实现方法以及原理1、Min-Max 规范化 [0,1]规划Min-max 规范化方法:将原始数据变换到[0,1]的空间中。让原始数据投射到指定的空间[min, max],用公式表示就是:新数值 =(原数值 - 极小值)/(极大值 - 极小值)。定义:也称为离差标准化,是对原始数据的线性变换,使得结果映射到0-1之间。本质:把数变为【0,1】之间的小数。转换函数:(X-Min)/(Max-Min)如果想要将数据映射到-1,1,则将公式换成:(X-Mean)/(Max-Min)from sklearn import preprocessing
import numpy as np
# 初始化数据,每一行表示一个样本,每一列表示一个特征
x = np.array([
[0.,-3.,1.],
[3.,1.,2.],
[0.,1.,-1.]
])
# 将数据进行 [0, 1] 规范化
min_max_scaler = preprocessing.MinMaxScaler()
min_max_x = min_max_scaler.fit_transform(x)
print(min_max_x)2、Z-Score 规范化Z-Score 的方法:新数值 = (原数值 - 均值)/ 标准差。定义:这种方法给与原始数据的均值(mean)和标准差(standard deviation)进行数据的标准化。经过处理的数据符合标准正态分布,即均值为0,标准差为1.本质:把有量纲表达式变成无量纲表达式。转换函数:(X-Mean)/(Standard deviation)假设 小明 所在的班级平均分为 80,标准差为 10。小华 所在的班级平均分为 120,标准差为 100。那么 小明 的新数值 =(80-80)/10=0,小华 的新数值 =(80-120)/100=-0.4。那么在 Z-Score 标准下,如果小明和小华的成绩都是80,小明 的成绩会比 小华 的成绩好。因此,我们能看到 Z-Score 的优点是算法简单,不受数据量级影响,结果易于比较。不足在于,它需要数据整体的平均值和方差,而且结果没有实际意义,仅是用于比较!!!注意是每一个算法都需要使用归一化,标准化吗?答案不是的,如果考虑的是距离还不是相似度函数那么就需要,反之则需要;例如:随机森林,它从不比较一个特征与另一个特征,不许要规范化。归一化后加快了梯度下降求最优解的速度。归一化有可能提高精度(归一化是让不同维度之间的特征在数值上有一定的比较性)。两种归一化方法的使用场景:(1)在分类、聚类算法中,需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候,第二种方法(Z-score standardization)表现更好。第一种方法(线性变换后),其协方差产生了倍数值的缩放,因此这种方式无法消除量纲对方差、协方差的影响,对PCA分析影响巨大;同时,由于量纲的存在,使用不同的量纲、距离的计算结果会不同。(2)在不涉及距离度量、协方差计算、数据不符合正太分布的时候,可以使用第一种方法或其他归一化方法。比如图像处理中,将RGB图像转换为灰度图像后将其值限定在(0 ,255)的范围。第二种归一化方式中,新的数据由于对方差进行了归一化,这时候每个维度的量纲其实已经等价了,每个维度都服从均值为0、方差1的正态分布,在计算距离的时候,每个维度都是去量纲化的,避免了不同量纲的选取对距离计算产生的巨大影响。通常情况下,如果使用下面的库from sklearn.preprocessing import MinMaxScaler,MaxAbsScaler,StandardScaler
#最大最小[0,1]
#[-1,1]
#去均值化注意:归一化适用于相似函数,标准化适用于距离度量情况正则化正则化主要用于避免过拟合的产生和减少网络误差。常见的有正则项有 L1 正则 和 L2 正则 以及 Dropout ,其中 L2 正则 的控制过拟合的效果比 L1 正则 的好。L1正则化可以产生稀疏解,即会使得很多参数的最优值变为0,以此得到的参数就是一个稀疏矩阵或者向量了。可以用于特征选择。L2正则化可以产生值很小的参数,即会使得很多参数的最优值很小。可以防止模型过拟合。简单来说L1适合用于特征选取,降低模型的复杂度;L2可以解决模型的过拟合。那么也就是说你可以这样去理解,L1适用于特征较多的情况下特征选择: 它会让模型参数向量里的元素为0的点尽量多。 因此可以排除掉那些对预测值没有什么影响的特征,从而简化问题。所以 L1 范数解决过拟合措施实际上是减少特征数量。可解释性: 模型参数向量稀疏化后,只会留下那些对预测值有重要影响的特征。 这样我们就容易解释模型的因果关系。 比如针对某个癌症的筛查,如果有100个特征,那么我们无从解释到底哪些特征对阳性成关键作用。 稀疏化后,只留下几个关键特征,就更容易看到因果关系最后给大家分享一张,机器学习必看到的一张图
Python监督学习之分类算法的概述
初入机器学习,无论是在书本上,还是在学习平台上,第一个介绍的就是监督学习,那么什么是监督学习呢?监督——顾名思义,把你“看着学习”,说的直白一点就是让你的计算机明白一种规律,并且按照这种规律进行大量的学习,最后通过该规律进行预测或者分类。生活中有垃圾分类,也有物品的好坏分类,在这个世界上凡事存在的东西,我们都会给它定义一个属性,人也不例外,有好人坏人之称,也有穷人富人之别,一个事物可以被定义多个属性。在监督学习里面,又分为:分类和回归,这里简单的介绍一下什么是分类,什么样的数据适合做分类,分类又分为多少种?分类:适用于目标列离散的数据,注意这里是目标列,也就是通过模型需要预测的列,它如果是一个离散的数据,那么适用于分类。分类又分为:二分类,多分类二分类就是一个目标列只有两种情况,一般的分类以二分类为主,比如在预测肿瘤是良性还是恶性,预测商品是否会被售卖成功,检测某样品是否合格。多分类就是一个目标列有多种情况,比如某信用等级有:A、B、C、D四种情况,那么这个时候就是一个多分类的情况,多分类得的算法和二分类差不多,在细节上有点不一样。分类方法的定义:分类分析的是根据已知类别的训练集数据,建立分类模型,并利用该分类模型预测未知类别数据对象所属的类别。分类方法的应用:1、模式识别(Pattern Recognition),就是通过计算机用数学技术方法来研究模式的自动处理和判读。模式识别的目标往往是识别,即分析出待测试的样本所属的模式类别。2、预测,从利用历史数据记录中自动推导出对给定数据的推广描述,从而能对未来数据进行类预测。现实应用案例1、行为分析2、物品识别、图像检测3、电子邮件的分类(垃圾邮件和非垃圾邮件等)4、新闻稿件的分类、手写数字识别、个性化营销中的客户群分类、图像/视频的场景分类等分类器分类的实现方法是创建一个分类器(分类函数或模型),该分类器能把待分类的数据映射到给定的类别中。创建分类的过程与机器学习的一般过程一致上一篇文章我们讲述了,机器学习的框架和以及相关的理论知识,也就是说在一个完整的模型训练当中,这些步骤是不可或缺的。分类器的构建标准 使用下列标准比较分类和预测方法预测的准确率:模型正确预测新数据的类编号的能力速度:产生和使用模型的计算花销健壮性:给定噪声数据或有空缺值的数据,模型正确预测的能力可伸缩性:对大量数据,有效的构建模型的能力可解释性:学习模型提供的理解和洞察的层次常见的分类算法逻辑回归(尽管是回归的算法但实际上是完成分类的问题)决策树(包括 ID3 算法、 C4.5 算法和 CART 算法)神经网络贝叶斯K-近邻算法支持向量机(SVM)这些分类算法适合的使用场景并不完全一致,需要根据实际的应用评价才能选对适合的算法模型。分类算法的常见应用包括:决策树方法在医学诊断、贷款风险评估等领域应用;神经网络在识别手写字符、语音识别和人脸识别等应用,贝叶斯在垃圾邮件过滤、文本拼写纠正方向的应用等。分类也是一个常见的预测问题,这个分类解决的问题与生活中分类问题基本一致,比如我们会根据天气的情况决定是否出行,这里面的天气情况就是因变量特征值,出行与否就是因变量标签值,分类算法是将我们思考的过程进行了自动化或半自动化。数据挖掘中的分类典型的应用是根据事物在数据层面表现的特征,对事物进行科学的分类。分类与回归的区别在于:回归可用于预测连续的目标变量,分类可用于预测离散的目标变量。在计算机语言中,分类你最容易想到的是什么逻辑语言,不错,答案就是:判断语句 这也是分类的底层思想,就像是决策树一样,一个条件下有很多的分支