数据分析师
目录
统计学
1.常见分布
正态分布:变量的频数或者频率呈现出中间最多,两端逐渐对称减少的一种分布规律。例如:一个班的成绩分布情况。
伯努利分布:一个事件有发生和不发生两种取值1,0。这两种取值对应的概率为p,1-p。期望为p,方差为p(1-p)。 例如:抛一次硬币,正面朝上的概率。
二项分布:在n次独立重复的伯努利实验中,事件A恰好发生K次的概率 期望np 方差np(1-p)。 例如:抛十次硬币,硬币有五次正面朝上的概率。
几何分布:在伯努利实验中,事件A进行实验X次才第一次成功的概率。例如:射击十次才命中一次靶的概率。
泊松分布:观察事物单位时间内平均发生次数λ,实际发生次数K次的概率 概率为P 期望和方差都是 λ。 例如:在一个医院中,假设每个病人来看病的概率都是随机且独立的,那么这个医院在一天内接受的病人呈泊松分布。
长尾分布:从需求角度来看,大量需求会集中在头部,而个性化、零散性需求形成了长长的尾巴。 例如:将曲目按照下载量排序,可近似地得到一条递减曲线。在曲线的头部,热门曲目被大量下载。接下来,随着流行程度的降低,尾部曲线并没有迅速坠落到零,而是极其缓慢地贴近于横轴,这说明很不热门的曲日仍然保持着一定的下载率。这种特殊的排序(即排名)与下载量之间的对应关系就是长尾分布。
2.中心极限定理&大数定理&极大似然估计
中心极限定理:样本量足够大的前提下,则变量均值的分布将近似于正态分布,而与该变量在总体中的分布无关。
大数定理:如果统计的数据足够大,在实验条件不变的情况下,重复多次,随机事件的频率近似于它的概率。
极大似然估计:通过若干次试验,观察其结果,利用试验结果得到某个参数值能够使样本出现的概率为最大。
最大似然估计的目的:利用已知的样本结果,反推最有可能(最大概率)导致这样结果的参数值。比如:有两个箱子,一个箱子99个黑球 1个白球,另一个箱子1个黑球99个白球,现在我取出一个球,结果是黑球,那么这个球最有可能是来自于哪个箱子?
极大似然估计提供了一种给定观察数据来评估模型参数的方法,即:“模型已定,参数未知”。
3.假设检验
假设检验的原理:对总体特征提出某种假设,通过抽样研究的统计推理,判断应该接受还是拒绝原假设。
假设检验的思想:小概率事件不会在一次实验中发生。
假设检验的目标:所测试的数据的均值等于目标均值的可能性。
假设检验过程:
1.提出检验假设H0 代表我们需要推翻的假设,提出备择假设H1 代表我们需要接受的假设。
2.选择显著性水平 0.05 。
3.选定统计方法 计算p值。
4.根据P值分析结果 若P值小于显著性水平 代表原假设不成立 备择假设成立。 P值的大小一般可通过查阅相应的界值表得到。
3.1 第一类错误&第二类错误&P值
第一类错误也叫做α错误,代表原假设为真,但各个统计量结果拒绝原假设,.这个错误的概率记作α,这个值也是显著性水平。简称‘弃真’。
第二类错误也叫做β错误,代表原假设为假,但各个统计量结果接受原假设,这个错误的概率记作β。简称‘取伪’。
P值是统计学中用于判断显著性的指标,统计量对应的概率值就是P值,也可以可以理解为原假设为真时,样本出现极端结果的概率,当P值小于α时,就代表原假设不成立,备择假设成立。
3.2 第一类错误α和第二类错误β的关系
样本量不变的情况下,α愈小,β愈大;反之,α愈大,β愈小。因而可通过选定α控制β大小。
如果要同时减小α和β,只有增加样本量。
第一类错误更严重,由于报告了本来不存在的现象,则因此现象而衍生出的后续研究、应用的危害将是不可估量的。
3.3 最小样本量
通过显著性水平,统计功效,均值差异,以及标准差计算得到结果。
显著性水平(α):显著性水平是估计总体参数落在某一区间内,可能犯错误的概率。显著性水平越低,对实验结果的要求也就越高,越需要更大的样本量来确保精度。
统计功效(1 – β):统计功效意味着避免犯二类错误的概率,这个值越大,需要的样本量也越大。也叫做power。
均值差异(μA-μB):如果两个版本的均值差别巨大,也不太需要多少样本,就能达到统计显著。
标准差(σ):标准差越小,代表两组差异的趋势越稳定。越容易观测到显著的统计结果。
以Z检验为例,n=2*(σ的平方)*(z(1-α/2)+z(1-β))的平方/(μA-μB)的平方。不同检验中,最小样本量公式不同。
3.4 置信区间和置信度
置信区间可以理解为样本统计量所构造的总体参数的估计区间。
置信度可以理解这个参数的真实值有多大把握落在这个区间内。
比如: 在中心极限定理中,我们知道从总体进行N次样本抽取,N次样本的均值会围绕总体均值上下波动。因此,置信区间就是为总体的均值提供了一个可波动的范围,置信区间与置信度是相对应的,例如,在95%的置信度下,置信区间为【a,b】,可以理解成抽取10000次样本,其中有9500次样本的均值能够落在【a,b】范围内。
4.方差&协方差&相关系数
方差是用来刻画一个样本中数据的离散程度,协方差是用来刻画两个变量的变化趋势,相关系数是协方差与方差的比值。 协方差公式cov(x,y)=E[xy]-E[x]E[y] 相关系数公式 r(x,y)=cov(x,y)/((x的标准差)*(y的标准差))
5.幸存者偏差
所统计的数据全都来源于幸存的人,因为失败出局者根本没机会给出回答。可以这样理解,在幸存者偏差这个问题中,我们所观察的样本是被筛选过的有偏样本,比如在火车上采访别人是否购票。
6.辛普森悖论
辛普森悖论是指,在某个条件下的两组数据,在分别讨论的时候会满足某种性质,一旦合并数据,可能会得到相反的结论。
举个例子:美国有两个学院A和B,这两个学院均是女生录取率大于男性,因此人们怀疑这两个学院有性别歧视。但合并之后统计总体女生的录取率却小于男性。
研究之后发现:A学院的录取率很低,但是B学院的录取率很高;女性录取者集中在A学院,男性录取者集中在B学院。也就是说并非是这两个学院有性别歧视,而是男女生在专业上的分布不同,男性更倾向于选择B学院,女性更倾向于选择A学院。
7.如何避免辛普森悖论
- 关注数据生成的过程,考虑因果模型,而不是只看重数据的结果。
- 谨慎设置个别分组权重,并以一定的系数去消除分组数据差异的影响,同时也需要了解是否还有其他因素的影响。
8.检验方法
8.1 T检验
用于两个样本平均值差异程度的检验方法,根据T分布理论来推断差异发生的概率,从而判定两个平均数差异是否显著。用于N小于三十的样本。
单样本T检验:比如:某学校某班级的平均身高和某学校整体的平均身高165是否有显著性差异。(一组样本)
独立样本T检验:例如:一组病人服药而另一组病人不服药。(两组样本)
配对T检验:例如:一组病人服药前和服药后的差异。(两组样本)
8.2 Z检验
用标准正态分布的理论来推断差异发生的概率,从而比较两个平均数的差异是否显著。在国内也被称作u检验。Z检验适用于大于30以上的样本。
8.3 卡方检验
卡方检验是检验两个变量之间有没有关系,基本思想是计算观察值和期望值之间的偏离程度。例如:男性或者女对线上购买生鲜食品有没有区别。
8.4 方差分析
方差分析是F检验的一种。
方差分析用于两样本或以上样本间的均数差别的显著性检验。
X数据类型 | X组别 | Y | 分析方法 | 例子 |
---|---|---|---|---|
定类 | 2组或以上 | 定量 | 方差 | 不同收入X群体的身高Y是否有差异 |
定类 | 仅仅2组 | 定量 | T检验 | 不同性别X群体的身高Y是否有差异 |
定类 | 2组或以上 | 定类 | 卡方 | 不同性别X人群是否抽烟Y的差异情况 |
定量:数字有比较意义,比如数字越大满意度越高。
定类:数字无比较意义,比如性别,1代表男,2代表女。
8.5参数检验和非参数检验
参数检验:假设总体分布已知,根据样本数据对总体分布的统计参数进行推断。
非参数检验:对总体无特殊要求,利用样本数据对总体分布形态进行推断。
联系:参数检验和非参数检验都是统计分析方法的重要组成部分,共同构成统计推断的基本内容。
区别:参数检验的前提是总体分布已知,非参数检验的前提是总体分布未知,一般来说参数检验的效果比非参数检验的效果好,但是实际情况中,我们很难了解清楚总体的分布。
9.贝叶斯定理和公式
贝叶斯定理 A条件下事件B发生的概率和B条件下事件A发生的概率是不同的。但是这两者是有明确关系的。 支持某项属性的事件发生得愈多,则该属性成立的可能性就愈大。
贝叶斯公式 已知先验概率求后验概率
B条件下发生A的概率=A条件下发生B的概率*A发生的概率/事件B发生的全概率
后验概率P(A|B)=先验概率P(A)*可能性函数P(B|A)/P(B)
应用 天气预报、吸毒者检测
10.AB实验
AB测试样本数量计算器 链接
AB测试结果分析工具 链接
AB实验
定义:对同一个问题,有多套解决方案,对同一组人群进行随机分组;在同一时间维度,进行实验组和对照组的实验,通过少量且相同的衡量指标,衡量哪套解决方案的结果表现更好,并采用。
作用:验证策略是否是可行有效的方法。
原理:通过运用假设检验对实验结果进行显著性分析。
步骤:提出假设→确定实验对象→确定实验条件→确定监测指标→开启实验→计算结果。
面试真题:在搜索引擎中,如何评估新排序算法相较于旧的排序算法更好?
第一步,根据实验的目的提出假设,在这里可以提出两个命题。H0是旧排序算法的转化率高。H1是新排序算法的转化率高。H0是我们希望被推翻的命题,H1是我们希望被证实的命题。
第二步,确定实验对象,因为排序算法最终应用在搜索结果页,所以实验对象就是进入搜索页面的人群,A组的用户会看见旧的排序算法,B组的用户会看见新的排序算法。
第三步,确定实验条件,确定显著性水平,并计算相应的最小样本量。
第四步,确定实验指标,我们以转化率作为目标指标。
第五步,借助AB平台实施实验,沟通业务、产品、开发、上线实验并持续观察几天到半月甚至更长时间。
第六步:计算实验结果并输出结论,默认显著性水平α=0.05,结合假设检验公式计算P值。若P值小于0.05则推翻了H0假设,证明在0.05的显著性水平下,新算法的转化率更高。
ab实验如何控制分流?
一般实验分为正交实验和互斥实验两类,另外精细化运营的时候还会被经常用到的是圈层实验,具体如下:
互斥实验:指的是实验与实验共用一层流量,互相不产生交叉,类似实验1中3个实验组,实验3和实验4,共用一层流量。
正交实验:实验与实验分别用不同层的流量,不产生互相的干扰,即便另一层也在做实验,但那一层流量到了这一层也是均匀分配的,不影响这一层实验变量的唯一性。
圈层实验:通常受众比较大的增长点做完了,更多的会去做用户的精细化运营,满足某些群体没有被很好满足到的需求,以带来业务的增长,圈层实验在这个时候就可以起到很好的帮助。
- 比如多日无播放行为的用户做一个圈层,做做引导或者Push;
- 比如下载页无内容的用户做一个圈层,做做冷启时优质内容的推荐;
- 比如某一兴趣标签的用户做一个圈层,提供更匹配的服务等等。
网页的流量是有限的,每天都会同时开展大量的AB实验,合理的分层分流能够保证实验对象在同一层中不会互相干扰,也能避免流量饥渴问题。总的来说,流量正交能够让关联度较小的实验同时进行,比如实验1是关于用户界面的实验,实验2是关于推荐算法的实验,关联度较弱,使用相同的流量不会对结果有太大影响;流量互斥能够让关联度较大的实验同时进行,比如实验1中实验组1测试颜色对按钮点击率的影响,实验1中实验组2想测试大小对按钮点击率的影响。
AB实验如何避免辛普森悖论
合理的进行正确的流量分割,保证试验组和对照组里的用户特征是一致的,并且都具有代表性,可以代表总体用户特征。
在试验设计上,如果我们觉得某两个变量对试验结果都有影响,那我们就应该把这两个变量放在同一层进行互斥试验,不要让一个变量的试验动态影响另一个变量的检验。如果我们觉得一个试验可能会对新老客户产生完全不同的影响,那么就应该对新客户和老客户分别展开定向试验,观察结论。
在试验实施上,对试验结果我们要积极的进行多维度的细分分析,除了总体对比,也看一看对细分受众群体的试验结果,不要以偏盖全,也不要以全盖偏。一个试验版本提升了总体活跃度,但是可能降低了年轻用户的活跃度,那么这个试验版本是不是更好呢?一个试验版本提升总营收0.1%,似乎不起眼,但是可能上海地区的年轻女性 iPhone 用户的购买率提升了20%,这个试验经验就很有价值了。
分层试验,交叉试验,定向试验是我们规避辛普森悖论的有力工具。
AB实验的特点
数据驱动创新,数据驱动增长,A/B测试是其中核心的工具和引擎。A/B测试是一切决策的前提和基础,用数据说话。
业务创新:通过持续的功能优化打磨,累积创新效果,逐步形成迄今最优的产品形态,同时可将优秀的功能模块抽象沉淀至通用化组件平台。
收益提升:在电商/金融等交易相关产品中,通过优化交易链路可直接带来可观的经济收益。
管理提效:通过A/B实验精准衡量新功能产出,为管理层提供准确的数据依据和科学度量。
AB测试的缺点
- 制作AB版本的开发、数据收集的工作量较大、以及后期维护成本增加,ROI低;
- AB测试受场景限制,产品版本发布后,无法增加或更改AB测试场景;
- 通常应用于短期即刻行为,不适用与需要很长时间才能验证的测试;
- 需要的用户人数多,要有足够的样本量。
AB测试的应用场景
1)产品UI
不同行业的产品需要不同的风格,同时还要与企业的品牌相得益彰。利用A/B 测试优化UI能给用户带来更好的交互体验和视觉感受。
2)文案内容
顾名思义是指用户阅读到的文字内容——小到图片配文和按钮文字,大到文章标题甚至版块主题;这些部分都可以尝试变换文案内容,测试不同方案的数据效果。
3)页面布局
有些时候,可能根本不需要对产品的UI或是文案内容作出调整,只是在布局排版上的改变,就可以出现增长的效果。
4)产品功能
想给产品增加一个新功能,可是很难确定是否能达到用户的预期,如果盲目上线,可能会造成一些损失;使用A/B 测试,对你的用户真正负责;例如,社交类产品在付费查看照片的新功能正式上线前,需要进行A/B 测试,以验证功能的使用情况和效果。
5)推荐算法
包括基于内容的推荐算法(根据用户的历史记录推荐相似内容)、基于协同过滤的推荐算法(根据有相似兴趣用户的行为推荐相关内容)、基于关联规则的推荐算法(根据商品/内容本身的相关性给用户推荐);算法优化迭代前,需要真实的数据进行测试。
统计学笔面试题
一个西瓜含水量99%,第二天含水量98%,问西瓜减重了多少?
首先需要确定的是西瓜中除水以外的质量不会减少,只有水的质量会减少。因此,假设西瓜的总质量为x,根据西瓜的含水量99%,即可得出除水以外的质量为(1-99%)x=0.01x,再根据第二天含水量98%可计算出第二天西瓜的总质量为0.01x/(1-98%)=0.5x,因此西瓜减重了1/2。
假设在一局王者荣耀对战中,30分钟之内见双方英雄出现在上路的概率是95%。那么,在10分钟内见到双方英雄出现在上路的概率是多少?
30分钟有三段10分钟,假设10分钟内的概率为P。则三十分钟内见双方英雄出现在上路的概率是1-(1-p)(1-p)(1-p)=0.95,得概率p约为0.63。
协方差和相关系数的区别
相关性是协方差的标准化格式,协方差很难做比较,比如我们可以通过协方差判断年龄和收入是否是正相关还是负相关,但不能反映相关性的程度,因为相协方差没有考虑两个变量的量纲影响,因此可以通过相关系数来反应具体的相关程度。
置信区间和置信度分别是什么?
机器学习
决策树
决策树及其优缺点
定义:决策树是一种自上而下对样本进行分类的树形结构,也能够进行回归预测。
决策树主要包含3种结点(根结点:初始结点;叶节点:最终分类结果结点;内结点:树内部进行判断的条件结点-即特征) 在决策树中,每个样本都只能被一条路径覆盖。
基本思想:以信息熵为度量构造一棵熵值下降最快的树。到叶子节点处的熵值为零,此时每个叶结点中的实例都属于同一类。
决策树的优点:①易于理解和解释、可以可视化分析,容易提取出规则。②速度快、计算量相对较小。③可以处理连续和种类字段
决策树的缺点:①数据集特征很多时,容易过拟合。②忽略了特征之间的相关性。
关于决策树可视化分析的实现方法:
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn import datasets
import matplotlib.pyplot as plt# 加载鸢尾花数据
iris=datasets.load_iris()
X=iris['data']
y=iris['target']# 查看鸢尾花类别的名字
feature_names=iris.feature_names# 将数据分为训练数据和测试数据,比例是4:1
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=1024)# 训练数据,预测鸢尾花的种类
clf=DecisionTreeClassifier(criterion=' gini')
clf.fit(X_train,y_train)
y_=clf.predict(X_test)
plt.figure(figsize=(18,12))# filled填充color
_=tree.plot_tree(clf,filled=True,feature_names=feature_names) #下图petal length(cm)为特征名称 gini为基尼指数 samples为样本数 value是各个类别的样本数(一共有三个类别,四个特征(sepal(萼片长度和宽度),petal(花瓣长度和宽度))
决策树停止分裂的条件
- 低于结点划分所需要的最小样本数,也就是超参数min_samples_split,还有一个比较相似的超参数是叶子结点所需的最小样本数min_sample_leaf。为什么它们可以作为停止分裂的条件,是因为当某个结点样本数已经很少了,如果再继续划分,就可能会使模型达到过拟合,也可能扩大噪声(错误)数据的影响。
- 达到树的最大深度,对应超参数max_depth。如果不设置这个超参数的话,那么决策树会默认不断地划分下去,直到达到叶子结点的基尼指数为0或者熵值为0停止分裂。很明显,会造成树的过拟合。
- 结点的基尼指数或者熵值小于所设定的阈值,对应超参数min_impurity_split,这个也很容易理解,因为基尼指数或者熵值越小,代表不确定越低,说明目前的纯度已经很高了,就没有必要再划分下去了。
- 所有的特征已经划分完毕了,自然就停止了。
决策树三种分类算法和优缺点
决策树学习算法包括3部分:特征选择、树的生成和树的剪枝。常用的算法有ID3、C4.5和CART决策树,分别基于信息增益、信息增益比、基尼指数划分的。
信息熵:可以衡量特征到底多不确定。信息熵越小,不确定性越低
公式如下:
其中,p(xi)代表代表随机事件x为xi的概率。P(xi)可以通俗地理解就是,某列特征中某个取值所占的比例。
举个例子,有个数据集含有‘性别’这个特征,其中性别为男的样本有3个,性别是女的样本有2个,求特征是‘性别’这列的信息熵。
男性样本所占比例为P(男)=3/5,女性样本所占比例P(女)=2/5,因此结合信息熵公式可得
H(x)= - ( 0.6 * log2(0.6) + 0.4 * log2(0.4)) = 0.97
信息熵的特点:
1.状态取值越多,信息熵越大
2.每个状态取值的概率越平均,信息熵越大,反之各状态的概率越是相差悬殊,信息熵就越小。
3.信息熵实际上衡量随机事件的不确定程度,越是不确定,信息熵就越大,那用来表达清楚这条信息所需要的比特数就越多。
信息增益:得知特征x的信息而使y的信息的不确定性减少的程度。使用划分前后集合熵的差值来衡量使用当前特征对于样本集合划分效果的好坏。 信息增益=使用该特征分类前的信息熵– 使用该特征分类后的信息熵。
信息增益率: 信息增益率=信息增益/特征熵
Gini指数:表示在样本集合中一个随机选中的样本被分错的概率。基尼指数(基尼不纯度)= 样本被选中的概率 * 样本被分错的概率。假设一共有k个类别,pk代表被选中的样本属于第k类别的概率,基尼指数越小代表纯度越高,当类别只有1个的时候,基尼指数为0。
ID3算法:使用信息增益进行特征选择。当特征的取值较多时,根据此特征划分更容易得到纯度更高的子集,因此划分之后的熵更低,由于划分前的熵是一定的,因此信息增益比较 偏向取值较多的特征。
优点:①处理离散型数据②倾向于选择取值较多的属性,因为信息增益反映的给定一个条件以后不确定性减少的程度,必然是分得越细的数据集确定性更高,也就是条件熵越小,信息增益越大。
缺点:①不能处理连续型数据和带有缺失值的数据集。②如果出现各属性值取值数分布偏差大的情况, 分类精度大幅度降低。③没有考虑过拟合问题。
C4.5算法:使用信息增益率进行特征选择,克服了信息增益选择特征的时候偏向于特征取值个数较多的不足。并且可以处理连续性数据和缺失值 ,可以调用机器学习库weka实现C4.5算法。(sklearn不存在C4.5算法,只有ID3和CART算法)
优点:①克服了信息增益选择特征的时候偏向于特征取值个数较多的不足②可以处理连续性数据和缺失值③加入了树的后剪枝,有效解决决策树过拟合问题。
缺点:①C4.5和ID3一样,使用的模型算法含有大量的对数计算,增加了模型的时间复杂度。②相比于ID3,加入了树的后剪枝,因此,需要对数据进行多次扫描,算法效率低。③不能处理回归问题。④和ID3一样采用的是多叉树运算,相比于二叉树运算效率低。
CART算法:分类回归树,既可以用于分类,也可以用于回归。分类模型使用基尼系数进行特征选择,回归模型采用和方差划分特征,度量目标是对于划分特征A,对应划分点s两边的数据集D1和D2,求出使D1和D2各自集合的均方差最小,同时D1和D2的均方差之和最小。表达式为:
预测方式上,CART分类树采用叶子节点里概率最大的类别作为当前节点的预测类别。回归树输出不是类别,采用叶子节点的均值或者中位数来预测输出结果。(cart是可以自动处理缺失值的,但是sklearn中的cart不能自动处理缺失值)
优点:①既适用于回归,也可以用于分类。②采用基尼指数选择特征,相比于信息增益,计算速度更快,因为它不用计算log值。③CART 构建回归树用到树的剪枝技术,用于防止树的过拟合。
缺点:①每次用最优特征进行划分,这种贪心算法很容易陷入局部最优,事实上分类决策不应该由某一特征决定,而是一组特征决定的。有一种多变量决策树可以解决,它会选择一个最优的特征线性组合做决策。代表算法OC1。②样本一点点改动,树结构剧烈改变,可以通过集成算法解决。
决策树如何防止过拟合
剪枝:给决策树瘦身,也就是不需要太多判断就可以得到好的结果.防止过拟合发生。
决策树通过剪枝防止过拟合,处理由于数据中的噪声和离群点导致的过分拟合问题。包括预剪枝和后剪枝。
预剪枝——在构造过程中,当某个节点满足剪枝条件,则直接停止此分支的构造。比如:建模时指定树的深度。
后剪枝——先构造完成完整的决策树,然后自底向上的对非叶结点进行考察,若将该结点对应的子树换为叶结点能够带来泛化性能的提升,则把该子树替换为叶结点。部分算法自带。
随机森林
定义:随机森林由很多决策树构成,当我们输入一个要预测分类的数据时,每个决策树都会接收数据并产生一个分类结果,然后采用投票机制,认为哪个结果出现的次数最多就归为哪一类,做回归时采用平均值计算作为预测结果。
原理:随机森林是bagging类的集成学习算法,可以利用多个弱学习器投票得到最终答案,其中每个弱学习器的构建方法是从全部样本和全部特征中,有放回的抽取部分样本和特征进行训练。
构造过程:随机样本的选取→ 随机选取特征→ 构建决策树→ 随机森林投票
优势:有效解决决策树的过拟合问题,能够处理特征维度很多的数据,并且不需要做特征选择,可以解决回归或者分类问题。容易理解和解释,树可以被可视化。不需要进行数据归一化。
劣势:不适合小样本,只适合大样本。 会在某些噪声较大的分类或回归问题上会过拟合(噪声意思是错误的数据)。
应用场景:可以用来预测贷款风险,银行和证券使用较多,调参简单。
线性回归
线性回归是利用多个输入变量来预测一个输出变量,并且这些输入变量与输出变量之间呈线性关系。
线性回归的四大前提条件:线性、独立性、正态性、方差齐性
- 各个自变量x与因变量y呈线性关系。
- 样本之间相互独立以及各个自变量x之间相互独立。
- 随机误差项(残差)ϵ 服从均值为0的正态分布也就是假设因变量服从正态分布。
- 对于任意自变量取值,残差的方差为常数σ的平方。
线性回归的损失函数是均方误差MSE。
如果所拟合模型的误差项(残差)不满足正态或者方差齐性时,可以考虑对模型进行改进,例如:对因变量采用log对数转化再进行回归。
如果模型存在多重共线性(即存在一个自变量随着另一个自变量变化而变化)会降低估计参数的精度以及模型效果。可以通过以下方法解决:
- 采用ridge回归(岭回归),在损失函数的基础上加上对参数θ的L2惩罚项,使最小二乘法求解参数θ时有解。同时将θ尽量压缩到0。
- 采用逐步回归法筛选特征变量。原理是对每个解释变量依次引入模型进行F检验,同时对已引入的解释变量逐个进行T检验,当原来引入变量由于后面加入的变量的引入而不再显著变化时,则剔除此变量,确保每次引入新的变量之前回归方程中只包含显著性变量,直到既没有显著的解释变量选入回归方程,也没有不显著的解释变量从回归方程中剔除为止,最终得到一个最优的变量集合。
- 可以考虑做PCA降维提取新的解释变量。所提取的变量间的组内差异小而组间差异大,起到了消除共线性的问题。
- 删除不重要的解释变量x。自变量之间存在共线性,说明自变量所提供的信息是重叠的,可以删除不重要的自变量减少重复信息。
逻辑回归
介绍:逻辑回归是线性回归通过S函数将结果映射到0,1区间内,做分类判断时,设定一个分类的阈值,大于阈值则样本预测值为1,小于阈值则样本预测为0。
原理:假设数据服从伯努利分布,通过极大化似然函数的方法,运用梯度下降来求解参数,从而实现数据二分类。
优点:①模型输出即为样本的概率分布;②能够输出表达式并且分析各个特征的权重;③在SPSS,Python中有许多现成的包能够调用,并且构建的模型可解释性高。
缺点:①预测结果呈S型分布,两端的概率变化非常小,中间的概率变化十分剧烈,难以找到阈值;②不引入其他方法的情况下,只能处理线性可分的数据;③拟合能力差。④很难处理数据不平衡问题。
常用的场景包括:广告点击行为预测;借款人评估;信用评分卡等等。
逻辑回归面试题
牛顿法和梯度下降法的区别?
牛顿法是一种在实数域和复数域上近似求解方程的方法。方法使用函数f (x)的二阶泰勒展开来寻找方程f (x) = 0的根。牛顿法最大的特点就在于它的收敛速度很快,但牛顿法需要计算海森矩阵(多元函数的二阶导数构成的矩阵)的逆,计算复杂,可以起到减小步长的效果。不过现在,一般采用拟牛顿法解决牛顿法复杂计算的问题,拟牛顿法只需要用到一阶导数,不需要计算海森矩阵的逆,而采用正定矩阵来近似Hessian矩阵的逆,简化运算的复杂度。
梯度下降通过搜索方向和步长来对参数进行更新。其中搜索方向是目标函数在当前位置的负梯度方向。因为这个方向是最快的下降方向。步长确定了沿着这个搜索方向下降的大小。梯度下降法中的步长是一定的,因此越接近最优值时,步长应该不断减小,否则会在最优值附近来回震荡。
逻辑回归的损失函数是?
采用的是交叉熵损失,如下图
其中y^是预测值,y是真实值
逻辑回归的正则化项怎么构造的?
逻辑回归的正则化项一般分为两种分别是L1和L2正则,都是对参数θ的惩罚,默认的是L2正则。θ是特征系数也就是模型的coef_。L1是参数绝对值的和,容易得到稀疏解,起到类似降维的作用,L2是参数绝对值的平方和,得到的解比较平滑,但是同样能够保证解中接近于0。这两种方法都能够降低模型的复杂度。
逻辑回归和线性回归的区别和联系?
区别:
- 线性回归假设因变量服从正态分布,逻辑回归假设因变量服从伯努利分布。
- 线性回归的目标函数是均方误差,逻辑回归的目标函数是交叉熵。
- 线性回归要求自变量与因变量呈线性关系,逻辑回归无要求。
- 线性回归是处理回归问题,逻辑回归是处理分类问题。
联系:
- 两个模型都是线性模型,线性回归是普通线性模型,逻辑回归是广义线性模型。
- 逻辑回归是线性回归通过sigmod函数将结果映射到[0,1]区间内,并设定一个阈值,大于这个阈值则被预测为1,小于阈值则被预测为0。
二分类线性判别分析LDA
线性判别分析是一种线性的分类模型(可以多分类),它的目标是建立一条直线,让全体训练样本投影到这条直线上,使得同类样本的方差尽可能小,异类样本的中心尽可能远,从而实现分类的目的。同时它也可以做有监督的数据降维。这个算法主要是用于降维比较多一点。
前提假设:
- 数据集服从正态分布。
- 特征之间相互独立。
- 每个类的协方差矩阵相同。
LDA投影到w后的损失函数又叫做Fisher准则函数:
分子代表两个类别中心点距离的平方,分母每个类别内的方差之和。因为分类的目标是,建立一个直线,将所有样本映射上去之后,使得类别内的点距离越近越好(集中),类别间的点越远越好。因此最大化这个损失函数就可以求得目标直线的最优参数w,可以采用拉格朗日乘子法进行求解。
优点:
- 在降维过程中可以使用类别的先验知识经验,而像PCA这样的无监督学习则无法使用类别先验知识。
- LDA在样本分类依赖的是均值而不是方差时,比PCA之类的算法较优。
缺点:
- LDA不适合对非高斯分布的样本降维。
- LDA降维最多降到类别数k-1的维数,如果我们降维的维度大于k-1,则不能使用LDA。目前也有一些LDA改进的方法可以解决这个问题。
- LDA在样本分类信息依赖方差而不是均值的时候,降维效果不好。
- LDA可能过度拟合数据。
PCA和LDA区别:
PCA(主成分分析)和LDA(线性判别分析)有很多的相似点,其本质是要将初始样本映射到维度更低的样本空间中,但是PCA和LDA的映射目标不一样:PCA是为了让映射后的样本具有最大的发散性;而LDA是为了让映射后的样本有最好的分类性能。所以说PCA是一种无监督的降维方法,而LDA是一种有监督的降维方法。
KNN
定义:K近邻算法是一种基本的回归和分类算法。K近邻算法多用于对数据集合中每一个样本进行分类,虽然K近邻是一个经典的有监督学习方法,但是他压根没有学习过程。
思想:如果有一个样本,附近有K个样本,这K个样本中大多数属于某个类别,那么这个样本就属于这个类别,和随机森林的多数投票类似。
过程:
- 计算已知类别数据集中的点与当前点之间的距离。
- 按距离递增次序排序。
- 选取与当前点距离最小的k个点。
- 统计前k个点所在的类别出现的频率。
- 返回前k个点出现频率最高的类别作为当前点的预测分类。
优点:既可以用来做分类也可以用来做回归、适用于样本容量大的自动分类、对异常值不敏感
缺点:预测速度相较于逻辑回归慢、输出可解释性不强、样本不平衡时效果不好、计算量较大
应用场景:文本自动分类
k近邻模型的三个基本要素:
k值的选择:k值的选择会对结果产生重大影响。较小的k值可以减少近似误差,但是会增加估计误差;较大的k值可以减小估计误差,但是会增加近似误差。说白一点就是说K值过小容易过拟合,K值过大容易欠拟合,一般而言,通常采用交叉验证法来选取最优的k值,k一般为奇数。
距离度量:距离反映了特征空间中两个实例的相似程度。可以采用欧氏距离、曼哈顿距离等。
决策规则:在分类模型中,主要使用多数表决法或者加权多数表决法;在回归模型中,主要使用平均值法或者加权平均值法。
多数表决:邻近的K个样本,每个样本权重一样,也就是说最终预测的结果为出现类别最多的那个类。
加权多数表决:邻近的K个样本中,距离近的样本相较与远的样本权重高。
朴素贝叶斯
定义:朴素贝叶斯是贝叶斯分类算法中的一种,以贝叶斯定理为基础,对数据进行分类。
思想:根据贝叶斯公式,计算实例属于各个类的后验概率,并将实例分类到概率最大的类中。
过程:
1.训练分类器,计算输入的训练样本中,每个不同的分类类别在训练样本中出现的频率以及每个类别下各个特征属性出现的条件概率值。
2.对于待分类的样本,计算在该样本出现的条件下,各个分类类别出现的概率,哪个概率最大,待分类的样本就属于哪个类别。
优点:结果可解释性高、对缺失值不敏感、有稳定的分类效率、小规模数据表现良好
缺点:特征之间相关性高的时候效果不好、分类决策存在错误率、对输入数据的表达形式很敏感
应用场景:文本分类、情感检测、拼写检测(比如在网站输入julw,网站会猜测你想搜索july)
支持向量机
介绍
支持向量机(SVM)是一类有监督地进行二元分类的广义线性分类器,它的决策边界是学习样本求解的最大边距超平面。线性可分时,在原空间寻找两类样本的最优超平面,在线性不可分时,加入松弛变量并通过使用非线性映射将低维度输入空间的样本映射到高维度空间使其变为线性可分,这样就可以在该特征空间中寻找最优分类超平面。
SVM使用准则: n为特征数, m为训练样本数。
- 如果n>>m,即训练集数据量不够支持我们训练一个复杂的非线性模型,我们选用逻辑回归模型或者不带核函数的支持向量机。
- 如果n较小,而且m大小中等,例如n在 1-1000 之间,而m在10-10000之间,使用高斯核函数的支持向量机。
- 如果n较小,而m较大,例如n在1-1000之间,而𝑚大于50000,则使用支持向量机会非常慢,解决方案是创造、增加更多的特征,然后使用逻辑回归或不带核函数的支持向量机。
核函数
为了处理非线性可分问题,非线性指的是在二维平面不可分,因此需要通过一个函数将原始数据映射到高维空间,从而使得数据在高维空间很容易可分,这样就达到数据分类或回归的目的。
松弛变量
线性不可分的样本经过映射到高维空间后,找到分类超平面的几率大大增加。仍然有可能有一些情况很难处理,比如样本数据的结构本身不是非线性的,但是由于噪声带来一些偏离正常位置较远的点,为了处理这种情况,SVM加入了松弛变量,允许数据点在一定程度上偏离超平面。
SVM优缺点
优点:
- 当特征维度大于样本数时,SVM依然能够有很好的效果。
- 核函数的存在让SVM更加灵活地处理非线性可分问题。
- 仅仅使用支持向量来做超平面的决定,无需使用全部数据。
缺点:
- 很难应用在海量数据集上,会耗费大量内存以及运算时间。
- 对缺失值敏感。
- 多分类时效果不好。
GBDT
GBDT介绍
GBDT全名是梯度提升决策树,它利用boosting集成算法的思想,按顺序生成多个弱学习器,每次都是通过拟合上一次误差函数对预测值的残差建立一个新的学习器,所有弱学习器的结果相加等于最终的预测值。虽然GBDT可以做回归也可以做分类,但是它用到的所有树都是cart回归树,而不是cart分类树,因为分类树的结果是没办法累加的。在特征选择上,回归树在分枝时会穷举每一个特征的每个阈值以找到最好的分割点,衡量标准是最小化均方误差。
GBDT正则化主要体现在三个方面。
①定义步长(learning rate),也就是给每一颗树的预测结果乘以一个步长,减少之前树的影响,有利于后续创建的树有更大的学习机会。
②子采样比例(subsample),和随机森林的子采样不同,gbdt的子采样是对样本进行无放回抽样。将采样比例设置在0.5-1之间可以起到减少方差,减低过拟合的作用。
③对弱学习器cart回归树进行剪枝,如控制树的最大深度、节点的最少样本数、最大叶子节点数、节点分支的最小样本数等。
GBDT的优缺点
优点:①能够很好地处理线性及非线性数据②在相对少的调参时间情况下,预测的准确率也可以比较高。这个是相对SVM来说的。③使用一些健壮的损失函数,对异常值的鲁棒性非常强。比如 Huber损失函数和Quantile损失函数。
缺点:①由于弱学习器之间存在依赖关系,难以并行训练数据。②对异常值敏感。
应用场景
在回归、分类以及多分类问题上,都很适用。
XGBoost
XGBoost介绍
基本思想
xgb的算法思想就是不断地添加树,然后进行特征分裂,每次添加一个树,就是学习一个新函数,拟合上一次预测的残差。当训练完成得到k棵树,我们要预测一个样本的分数,其实就是根据这个样本的特征,在每棵树中会落到对应的一个叶子节点,每个叶子节点就对应一个分数,最后只需要将每棵树对应的分数加起来就是该样本的预测值。
如下图所示,第一棵树对年龄和性别进行特征划分,第二棵树对特征‘日常是否使用电脑’进行划分,然后到叶子结点的时候会给出一个分数。最后将样本对应的两颗树叶子结点的分数相加就是该样本的预测值了。
优缺点
优点:
- XGBoost支持线性分类器,相当于引入L1和L2正则化项的逻辑回归(分类问题)和线性回归(回归问题)。
- XGBoost对代价函数做了二阶泰勒展开,引入了一阶导数和二阶导数。
- 当样本存在缺失值时,xgBoosting能自动学习分裂方向。
- XGBoost借鉴随机森林的做法,支持列抽样,这样不仅能防止过拟合,还能降低计算。
- XGBoost的代价函数引入正则化项,控制了模型的复杂度,正则化项包含全部叶子节点的个数,每个叶子节点输出的score的L2模的平方和。从贝叶斯方差角度考虑,正则项降低了模型的方差,防止模型过拟合。
- XGBoost在每次迭代之后,为叶子结点分配学习速率,降低每棵树的权重,减少每棵树的影响,为后面提供更好的学习空间。
- XGBoost工具支持并行,但并不是树粒度上的,而是特征粒度,决策树最耗时的步骤是对特征的值排序,XGBoost在迭代之前,先进行预排序,存为block结构,每次迭代,重复使用该结构,降低了模型的计算;block结构也为模型提供了并行可能,在进行结点的分裂时,计算每个特征的增益,选增益最大的特征进行下一步分裂,那么各个特征的增益可以开多线程进行。
- 可并行的近似直方图算法,树结点在进行分裂时,需要计算每个节点的增益,若数据量较大,对所有节点的特征进行排序,遍历的得到最优分割点,这种贪心法异常耗时,这时引进近似直方图算法,用于生成高效的分割点,即用分裂后的某种值减去分裂前的某种值,获得增益,为了限制树的增长,引入阈值,当增益大于阈值时,进行分裂。
缺点:
- XGBoost采用预排序,在迭代之前,对结点的特征做预排序,遍历选择最优分割点,数据量大时,贪心法耗时。
- XGBoost采用level-wise生成决策树,同时分裂同一层的叶子,从而进行多线程优化,不容易过拟合,但很多叶子节点的分裂增益较低,没必要进行跟进一步的分裂,这就带来了不必要的开销。
优缺点(简化版)
优点:
- 精度更高:采用了二阶泰勒展开,保留了目标函数更多的信息。
- 正则化:引入L1L2正则化,降低模型过拟合。
- 灵活性强:不仅支持cart作为基分类器还支持线性分类器。
- Shrinkage(学习率缩减):每次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。
- 支持列抽样:降低过拟合,还能减少计算。
- 自动处理缺失值:采用的稀疏感知算法可以自动学习出它的分裂方向。
- 支持特征并行:减少计算量,降低耗时。
- 近似直方图算法处理结点分裂:更加高效地划分特征。
缺点:
- 结点分裂过程中需要遍历所有数据集,耗时长。
- 预排序过程的空间复杂度过高,导致消耗的内存多。
- 只能够处理连续型的数值。
- 需要调整的超参数比较多。
预排序算法详解
对所有特征按照特征的数值进行排序,然后遍历每个特征上的所有分裂点,计算该分裂点分裂后的全部样本的目标函数增益,找到最大增益对应的特征和候选分裂点位,从而进行分裂,一层一层的完成建树过程。xgb 因为每次分裂之前先根据特征对样本进行预排序,之后会计算所有特征对应的所有分裂点的目标函数增益,所以导致不但需要额外空间存储预排序的结果,还会造成时间上很大的开销,每遍历一个分割点都需要计算分裂增益,并且在选择最大增益的时候需要对比所有样本的增益情况。
应用场景
可以用于分类和回归问题。在数据挖掘等相关竞赛以及实际工业中都有应用。
XGBoost调参
常用调参方式有网格搜索、随机搜索、贝叶斯优化等。超参数调优顺序如下:
取值范围是可以根据平时经验或者调参时交叉验证的结果,再次调整取值范围。
- 确定学习速率(学习率刚开始通常设置一个比较大的数便于提升模型训练速度)和确定参数调优的初始值以及评估指标,回归可以以R2作为评估指标,分类可以使用F1或者AUC作为评估指标。(初始取值是自己决定的,和算法自带的默认取值不完全相同)
超参数 | 初始取值(根据平时经验确定的) |
---|---|
learning_rate | 0.1 |
n_estimators | 500 |
max_depth | 5 |
min_child_weight | 1 |
subsample | 0.8 |
colsample_bytree | 0.8 |
gamma | 0 |
reg_alpha | 0 |
reg_lambda | 1 |
1.调整n_estimators(树的数量),取值范围可以是[400, 500, 600, 700, 800],树的数量越多越容易过拟合
2.调整min_child_weight(最小叶子节点样本权重和)和max_depth(最大深度),max_depth取值范围[3, 4, 5, 6, 7, 8, 9, 10], min_child_weight取值范围[1, 2, 3, 4, 5, 6]。min_child_weight越大容易欠拟合,max_depth越大容易过拟合。
3.调整gamma(惩罚系数:节点分裂所需的最小损失函数下降值),取值范围是[0.1, 0.2, 0.3, 0.4, 0.5, 0.6],gamma越大越不容易过拟合。但性能就不一定能保证,需要平衡。
4.调整subsample(随机选样本的比例)以及colsample_bytree(随机选取特征的比例),'subsample'取值范围是 [0.6, 0.7, 0.8, 0.9], 'colsample_bytree'取值范围是 [0.6, 0.7, 0.8, 0.9]都是越大越容易过拟合,
5.调整reg_alpha(L1正则)以及reg_lambda(L2正则),取值范围均为 [0.05, 0.1, 1, 2, 3]都是越大越容易欠拟合。L1会趋向于产生少量的特征,而其他的特征都是0,而L2会选择更多的特征,这些特征都会接近于0,实践中L2正则化通常优于L1正则化。
6.调整学习率learning_rate[0.01, 0.05, 0.07, 0.1, 0.2],学习率过大越容易过拟合。
XGBoost面试题
XGB与GBDT的区别?
回答参考上面XGB介绍中提到的优点。
xgb为什么要把全部样本特征值算出来,放到内存中去?
因为XGB关于最优特征以及最优切分点的选取采用的是一种贪心算法,是基于某种标准(GINI系数/均方误差/信息增益比等),需要依次遍历所有特征和所有特征的取值,通过线性扫描来找到最优分割点,这是需要将所有数据同时读入内存。当数据量过大时,这就不适用了。于是xgb也提供了另一种近似直方图算法,相比于贪心算法需要线性扫描特征的每个分裂点,而近似直方图算法只考察分位点,将连续的特征映射到对应的桶中,然后遍历桶之间的间隙来找最佳的分裂分位点,这样可以有效的减少计算量。
看你的简历上写了熟悉xgb算法,可以介绍一下吗?
回答模板:
1.原理/基本思想
2.优缺点(可以结合XGB相比于GBDT的改进进行论述)
3.应用场景
xgb的正则化项是如何构造的?
xgb的正则化项也是树的复杂度函数,包含两个部分:树里面叶子结点的个数T、树里面叶子结点权重ω的L2正则。
T: 是对叶子的个数加了限制,从而限制了模型的复杂度
叶子结点权重ω:通过L2正则是不希望有太大的权重ω出现
γ:是gamma(结点分裂所需的最小损失函数下降值)
λ:是L2正则化系数reg_lambda
这里出现了γ和λ,这是xgboost自己定义的,在使用xgboost时,可以设定它们的值,显然,γ越大,表示越希望获得结构简单的树,因为此时对较多叶子节点的树的惩罚越大。λ越大也是越希望获得结构简单的树。
XGB怎么给特征评分?
XGB的特征重要性计算,有5个评价指标。
weight(默认):在所有树中,特征用作分裂点的总次数。
total_gain:在所有树中,该特征用作分裂节点带来的gain值之和。
total_cover:在所有树中,该特征用作分裂节点时,对于样本的覆盖程度之和。简单一点来说,覆盖是指一个特征作为分裂结点参与了某个样本的划分,那么就相当于是这个特征覆盖了这个样本,total_cover指的就是某个特征覆盖了的样本数量。
gain:计算公式为gain=total_gain/weight,在所有树中,该特征用作分裂节点带来的平均gain值。
cover:计算公式为,在所有树中cover=total_cover/weight,该特征用作分裂节点时,对于样本的平均覆盖程度。
LGBM
介绍
LightGBM是基于XGBoost的改进版,在处理样本量大、特征纬度高的数据时,XGBoost效率和可扩展性也不够理想,因为其在对树节点分裂时,需要扫描每一个特征的每一个特征值来寻找最优切分点,耗时较大。而LightGBM则提出了GOSS(Gradient-based One-Side Sampling,基于梯度的单边采样)和EFB(Exclusive Feature Bundling,互斥特征捆绑)来分别进行样本采样和降低特征维度。同时,使用Histogram来加速寻找切分点。因此可以简单点说,LightGBM = XGBoost + Histogram + GOSS + EFB。
(1)Histogram直方图算法
直方图算法的基本思想是:先把连续的浮点特征值离散化成K个整数,同时构造一个宽度为K的直方图。在遍历数据的时候,根据离散化后的值作为索引在直方图中累积统计量,当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点。
简单理解为:首先确定对于每一个特征需要多少个箱子(bin)并为每一个箱子分配一个整数;然后将浮点数的范围均分成若干区间,区间个数与箱子个数相等,将属于该箱子的样本数据更新为箱子的值;最后用直方图(#bins)表示,将大规模的数据放在了直方图中。
直方图算法相比于预排序最直接的优点是很大程度上减少了内存占用和计算代价。虽然直方图算法找到的分割点并不算是最优的分割点,毕竟相比 xgb 算法来说通过 bins 分箱之后分裂点少了很多。但是正因为这个导致加上了一个正则化的效果,使得生成的弱分类器的有效的防止过拟合。
特征被离散化后,找到的并不是很精确的分割点,所以会对结果产生影响。但在不同的数据集上的结果表明,离散化的分割点对最终的精度影响并不是很大,甚至有时候会更好一点。原因是决策树本来就是弱模型,分割点是不是精确并不是太重要;较粗的分割点也有正则化的效果,可以有效地防止过拟合;即使单棵树的训练误差比精确分割的算法稍大,但在梯度提升(Gradient Boosting)的框架下没有太大的影响。
预排序算法中,根据特征的不同取值进行分割,在直方图算法不考虑特征的取值,直接根据样本的在每个 bin 中的数量,并且在新的 bin 中存储的是特征取值的个数。
这样在遍历该特征的时候,只需要根据直方图的离散值,遍历寻找最优的分割点即可。并且由于 bins 的数量是远远小于特征不同取值的数量,所有分桶之后要遍历的分裂点个数会少很多,进一步减少计算量。
(2)直方图做差加速
LightGBM另一个优化是Histogram(直方图)做差加速。一个叶子的直方图可以由它的父亲节点的直方图与它兄弟的直方图做差得到,在速度上可以提升一倍。通常构造直方图时,需要遍历该叶子上的所有数据,但直方图做差仅需遍历直方图的k个桶。在实际构建树的过程中,LightGBM还可以先计算直方图小的叶子节点,然后利用直方图做差来获得直方图大的叶子节点,这样就可以用非常微小的代价得到它兄弟叶子的直方图。
(3)带有深度限制的按叶子生长 (leaf-wise) 算法
XGBoost 采用 Level-wise 的增长策略,该策略遍历一次数据可以同时分裂同一层的叶子,容易进行多线程优化,也好控制模型复杂度,不容易过拟合。但实际上Level-wise是一种低效的算法,因为它不加区分的对待同一层的叶子,实际上很多叶子的分裂增益较低,没必要进行搜索和分裂,因此带来了很多没必要的计算开销。
LightGBM采用Leaf-wise的增长策略,该策略每次从当前所有叶子中,找到分裂增益最大的一个叶子,然后分裂,如此循环。因此同Level-wise相比,Leaf-wise的优点是:在分裂次数相同的情况下,Leaf-wise可以降低更多的误差,得到更好的精度;Leaf-wise的缺点是:可能会长出比较深的决策树,产生过拟合。因此LightGBM会在Leaf-wise之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合。
(4)单边梯度采样算法GOSS
GOSS算法从减少样本的角度出发,排除大部分小梯度的样本,仅用剩下的样本计算信息增益,它是一种在减少数据量和保证精度上平衡的算法。根据计算信息增益的定义,梯度大的样本对信息增益有更大的影响。但是如果直接将所有梯度较小的数据都丢弃掉势必会影响数据的总体分布。所以GOSS在选择梯度较大数据的同时随机选择了部分梯度较小的数据,这样算法就会更关注训练不足的样本,而不会过多改变原数据集的分布。
(5)互斥特征捆绑算法EFB
高维数据往往是稀疏的,因此可以考虑捆绑一部分特征来减少特征的维度。通常被捆绑的特征都是互斥的,因为这样才能不会丢失信息。可以用一个指标对特征不互斥程度进行衡量,称之为冲突比率,当这个值较小时,EFB算法选择把不完全互斥的两个特征捆绑,而不影响最后的精度。 这样不仅能够降低特征数量,也能够很好地降低构建直方图时的时间复杂度。
(6)支持类别型特征处理(不包括字符串类型)
LightGBM采用 many-vs-many 的切分方式将类别特征分为两个子集,实现类别特征的最优切分。算法流程如下图所示,在枚举分割点之前,先把直方图按照每个类别对应的label均值进行排序;然后按照排序的结果依次枚举最优分割点。这个方法很容易过拟合,所以LightGBM里面还增加了很多对于这个方法的约束和正则化。
相比one-hot编码展开的方法,使用LightGBM支持的类别特征可以使训练速度加速8倍,并且精度一致。更重要的是,LightGBM是第一个直接支持类别特征的GBDT工具。
(7) 支持特征并行、数据并行、投票并行,应用于海量数据集。
LGBM优缺点
优点
- 采用直方图算法遍历样本,降低了时间复杂度以及内存消耗。
- 训练过程中采用单边梯度算法过滤掉部分梯度小的样本,减少了大量的计算。
- 采用了基于 Leaf-wise 算法的增长策略构建树,减少了很多不必要的计算量同时也减低了偏差。
- 采用优化后的特征并行、数据并行方法加速计算,当数据量非常大的时候还可以采用投票并行的策略。
- 采用互斥特征捆绑算法减少了特征数量,降低了内存消耗。
缺点
- 可能会长出比较深的决策树,产生过拟合。因此LightGBM在Leaf-wise之上增加了一个最大深度限制,在保证高效率的同时防止过拟合。
- Boosting族是迭代算法,每一次迭代都根据上一次迭代的预测结果对样本进行权重调整,所以随着迭代不断进行,误差会越来越小,模型的偏差(bias)会不断降低。由于LightGBM是基于偏差的算法,所以会对噪点较为敏感。
- 在寻找最优解时,依据的是最优切分变量,没有将最优解是全部特征的综合这一理念考虑进去。
CatBoost
介绍
CatBoost是俄罗斯的搜索巨头Yandex在2017年开源的机器学习库,是Boosting族算法的一种。CatBoost和XGBoost、LightGBM并称为GBDT的三大主流神器,都是在GBDT算法框架下的一种改进实现。XGBoost被广泛的应用于工业界,LightGBM有效的提升了GBDT的计算效率,而Yandex的CatBoost号称是比XGBoost和LightGBM在算法准确率等方面表现更为优秀的算法。
CatBoost是一种基于对称决策树(oblivious trees)为基学习器实现的参数较少、支持类别型变量和高准确性的GBDT框架,主要解决的痛点是高效合理地处理类别型特征,CatBoost是由Categorical和Boosting组成。此外,CatBoost还解决了梯度偏差(Gradient Bias)及预测偏移(Prediction shift)的问题,从而减少过拟合的发生,进而提高算法的准确性和泛化能力。
创新点
- catboost非常擅长处理分类型特征(包括字符串类型)。lgbm也能够处理分类型特征但不包括字符串类型。对于低基数列(特征的所有值去重后构成的集合元素个数比较少),catboost算法在训练过程会自动采用独热编码的形式进行处理(这种方式相比于在数据预处理部分手动进行独热编码的方式更加高效)。对于高基数列,最简单的方式是采用的是类别型特征对应标签的平均值进行替换(Greedy TS 方法),这种方法有一个显而易见的缺陷,就是通常特征比标签包含更多的信息,如果强行用标签的平均值来表示特征的话,当训练数据集和测试数据集数据结构和分布不一样的时候会出条件偏移问题。当然也有改进其他方式,例如:Holdout TS、Leave-one-out TS、Ordered TS,不具体说明了。
- Catboost还使用了组合类别特征,可以利用到特征之间的联系,这极大的丰富了特征维度。
- 采用ordered boost排序提升的方法避免梯度估计的偏差,进而解决预测偏移的问题。
- 采用了完全对称树作为基模型,同时计算叶子结点值方式和传统的boosting算法也不一样,传统的boosting算法计算的是平均数,而catboost在这方面做了优化采用了其他的算法,这些改进都能防止模型过拟合。对称树的优点:减弱过拟合、加速预测。
优点
- 性能卓越: 在性能方面可以匹敌任何先进的机器学习算法;
- 鲁棒性/强健性: 无需调参即可获得较高的模型质量,采用默认参数就可以获得非常好的结果,减少在调参上面花的时间,减少了对很多超参数调优的需求
- 易于使用: 提供与scikit集成的Python接口,以及R和命令行界面;
- 实用: 可以处理类别型、数值型特征,支持类别型变量,无需对非数值型特征进行预处理
- 可扩展: 支持自定义损失函数;
- 快速、可扩展的GPU版本,可以用基于GPU的梯度提升算法实现来训练你的模型,支持多卡并行提高准确性,
- 快速预测:即便应对延时非常苛刻的任务也能够快速高效部署模型
缺点
- 对于类别型特征的处理需要大量的内存和时间;
- 不同随机数的设定对于模型预测结果有一定的影响;
K-means
定义:一种典型的无监督学习算法,对未标记的数据(即没有定义类别或组的数据)进行分类。
思想:定义多个簇,把相似的对象归到同个簇中,簇内对象之间的相似度最大,保持各个簇之间的相似度最小。
过程:
1.选择初始化K个样本作为初始聚类中心。
2.针对每个样本 计算它到K个聚类中心的距离,并把它们分到距离最小的簇中。
3.针对每个簇,重新计算它的聚类中心。
4.重复二三步,直到达到某个终止条件比如:迭代次数。
评估效果:轮廓系数[-1,1],为0时表示有簇重叠,效果越接近1越好,代表簇内对象越相似,各个簇之间距离越远。
优点:原理简单、收敛速度快,聚类效果较优、算法解释度比较强。
缺点:K值的选取不好把握、非凸数据集难以收敛、采用迭代方法容易得到局部最优结果、对噪声、异常值比较敏感。
应用场景:用户价值分层(比如可以做个RFM模型,这样RFM模型的阈值可以根据聚类中心来确定)、欺诈地点识别
PCA
介绍
主成分分析(PCA),是一种比较基础的对数据降维的无监督学习算法,目的是用较少的变量来代替原来较多的变量,并且可以反映原来变量的大部分信息。相当于是从原数据集中选择最重要的数据来代替原始数据,也是一种数据预处理的方法。
核心思想
通过计算数据矩阵的协方差矩阵,然后得到协方差矩阵的特征值特征向量,选择特征值最大(即方差最大)的K个特征所对应的特征向量组成的矩阵。这样就可以将矩阵转换到新的空间当中,实现数据特征的降维。本质是将方差最大的方向作为主要特征,并且在各个方向上将数据“离相关”,也就是让他们在不同正交方向上没有相关性。
实现步骤
假定一个数据集有n个特征,m个样本。现需要将n维数据降到k维,步骤如下:
- 去平均值(即去中心化),即每一列特征减去各自的平均值。
- 计算协方差矩阵。
- 求解协方差矩阵的特征值与特征向量。
- 对特征值从大到小排序,选择其中最大的k个。然后将其对应的k个特征向量分别作为行向量组成特征向量矩阵P。
- 将数据转换到k个特征向量构建的新空间中,即Y=PX。
方差大概就是一些点在一个维度的偏差,越分散的话方差越大。而协方差是衡量一个维度是否会对另一个维度有所影响,从而查看这两个维度之间是否有关系。
去中心化的目的就是:让每个特征下的均值都为0,后续计算特征之间协方差的时候就可以简化计算。
PCA优缺点
优点:
- 通过PCA降维之后的各个主成分之间是正交的,可以消除原始数据之间相互影响的因素。
- 计算过程简单,易于实现。
- 仅仅需要以方差衡量信息量,不受数据集以外的因素影响。
缺点:
- 主成分各个特征维度的含义具有一定的模糊性,不如原始样本特征的解释性强。
- 方差小的非主成分也可能含有对样本差异的重要信息,因降维丢弃可能对后续数据处理有影响。
- PCA原理主要是为了消除变量之间的相关性,并且假设这种相关性是线性的,对于非线性的依赖关系则不能得到很好的结果。
应用场景
高维数据集的探索与可视化、图像分析、数据压缩、在数据预处理取出数据的冗余和噪声
集成算法(Bagging、Boosting、stacking、voting)
Bagging算法:对样本进行有放回抽样,产生多个booststrap数据集。为每一个数据集拟合一个弱学习器,最终得到一个较低方差的集成模型,做回归任务的时候,采用平均法;做分类任务的时候,采用多数投票的方式输出最终结果,例如随机森林。
Boosting算法:对样本进行无放回抽样,通过迭代地训练一系列的分类器,每个分类器采用的样本分布都和上一轮的学习结果有关,最终对各个基模型加权得到最终结果。代表算法有两种,分别是gbdt和adaboost,gbdt是在每轮中拟合损失函数的负梯度,adaboost则是在每轮中对误分类的样本提高权重,建立新的分类器。
stacking算法:训练一个模型用于组合其他各个基模型。对各个基模型进行交叉验证,将预测结果作为新的数据集,最后通过简单的模型(例如:逻辑回归,是为了防止过拟合)拟合预测。stacking要求第一层基模型之间需要体现差异化,要么在算法上、要么在特征和样本上。并且每个基模型基模型效果要好,stacking应用在样本量大、特征维度较多的场景中,主要用于组合强学习器(例如 xgb/lgbm/catboost三者集成,生成更强的学习器),提高模型性能。
voting算法:voting是整个数据集上,训练多个学习器进行预测,每一个弱学习器的预测结果被看作是投票。做回归任务时,对所有弱学习器的结果求平均作为最终的预测结果。做分类任务时,可以分为硬投票和软投票,硬投票:选择投票数最高的预测作为最终结果,软投票:选择平均概率值最大的类别作为预测结果,软投票用的是基模型的分类概率,也就是需要设置probability=True。
区别:bagging和boosting采用的基模型是同质学习器,stacking和voting采用的基模型是异质学习器(各个基模型生成算法不同)。
各类算法比较
bagging和boosting的区别
在样本选择上,bagging方法是有放回的选择样本,所有样本的权重保持不变;boosting方法是每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。
在预测函数上,bagging方法所有弱分类器权重相等;boosting方法中每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。
在计算方式上,bagging采用并行计算的方式,同时生成所有弱分类器;boosting采用顺序计算的方式,各分类器只能按顺序生成,后一个分类器的参数会用到前一个分类器的结果。
随机森林和gbdt区别
- 都是由多棵树组成,随机森林是bagging算法,通过减少模型方差提高性能。gbdt是boosting算法,通过减少模型偏差提高性能。
- bagging算法采取均匀有放回抽样,boosting采用无放回来取样。
- 对于最终的输出结果而言, 随机森林采用多数投票等; 而 GBDT 则是将所有结果加权累加起来。
- 随机森林的树可以并行生成,gbdt只能串行生成。
- gbdt对异常值敏感,随机森林对异常值不敏感。
bagging和随机森林的区别
bagging方法的的随机性仅仅来自样本扰动,随机森林模型中引入了属性扰动,这样使得最终模型的泛化性能可以通过个体学习器之间的差异度的增加而进一步提升。
和bagging相比,随机森林的起始性能往往比较差,然而随着个体学习器数目的增加,随机森林会收敛到更小的误差。
随机森林的训练效率优于bagging,因为bagging中的每棵树是对所有特征进行考察,而随机森林仅仅考虑一个特征子集。
XGBoost和GBDT的区别
- XGB是GBDT的改进,GBDT将目标函数展开式到一阶 XGB将目标函数泰勒展开到了二阶。保留了更多有关目标函数的信息,对提升效果有帮助。
- 传统GBDT以CART作为基分类器,XGB还支持线性分类器。
- xgboost对叶子结点数量与叶子结点权重分别加入了L1和L2正则化,因而有利于模型获得更低的方差。
- xgboost增加了自动处理缺失值特征的策略,在结点分裂时如果遇到缺失值,则将缺失值分别放在左边和右边,取信息增益大的那边。如果训练时特征无空值,预测时空值样本默认分裂到左侧子节点。
- xgb支持特征并行,对每个特征进行block分块,并排序,将排序后的结果保存在内存中,这样后续分裂时不再需要对特征进行排序然后计算最佳分割点了,在结点分裂时,各个特征的增益计算可以开启多线程并行。
- xgb借鉴随机森林的做法加入了列采样,减低过拟合。
- 当数据量无法一次性加入内存中,xgb加入了近似直方图优化算法,采用分位数的思想寻找分割点。
随机森林和XGBoost的区别
- 随机森林采用的是bagging算法同时生成多个弱分类器。 xgb使用的是boosting算法,按顺序生成各分类器。
- XGB会根据特征的重要性进行排序 随机森林是随机选取特征。
- 随机森林不能处理缺失值 , XGB可以处理缺失值。
- 对于最终的输出结果而言,随机森林采用多数投票等;而xgboost则是将所有结果累加起来,或者加权累加起来。
- 随机森林计算量少 计算速度也更快 并且需要的参数也少,XGB需要的参数多,运行速度较慢。
LGBM和XGBoost的区别
- xgb采用了预排序方法处理节点分裂,lgbm采用的是直方图优化算法,减少了内存消耗和计算代价。
- 决策树生长策略,XGBoost 采用的是 Level-wise(按层生长) 的树生长策略,LightGBM 采用的是 leaf-wise (按叶子生长)的生长策略, 以最大信息增益为导向。后者进度更高,容易过拟合,所以要控制最大深度。
- 并行策略对比,XGBoost 的并行主要集中在特征并行上,而 LightGBM 的并行策略分特征并行,数据并行以及投票并行。
- 处理分类型特征上,xgb不能够直接处理分类特征,必须先经过各种编码方式进行处理。lgbm支持对分类型特征的处理(不包括字符串类型), 使用了一个特殊的算法来确定属性特征的分割值,并且这种方法优于独热编码的效率。
KNN与K-means区别
有监督学习和无监督学习的区别
- 有标签就是有监督学习,无标签就是无监督学习。
- 有监督学习方法必须要有训练集与测试样本。在训练集中找规律,而对测试样本使用这种规律。而非监督学习没有训练集,只有一组数据,在该组数据集内寻找规律。
- 有监督学习的目标是根据输入的x预测y,无监督学习的目标是根据输入的x发现什么。
分类和聚类的区别
①分类属于监督学习方法,样本数据都带有标签。聚类属于无监督学习方法,样本数据不带有标签。
②分类是根据已知的规则将数据进行分类,聚类是不知道已知规则,而通过学习数据集,发现规则,将相似的数据聚成一类,从而聚成多个类别。
网格搜索、随机搜索、贝叶斯优化的区别
①网格搜索是遍历式搜索方法,将所有超参数组合遍历一遍。随机搜索是随机选取部分超参数组合。贝叶斯优化是首先对目标函数的分布进行初始化,不断采集样本,根据结果更新参数组合,每次更新参数组合时都会考虑之前的参数信息。
②网格搜索和随机搜索都没有考虑前面搜索的先验知识,都是独立并行的。贝叶斯优化采用高斯过程,考虑之前的参数信息,不断地更新先验。(满足正态分布变量和时间组合一起形成的过程叫高斯过程)
③贝叶斯调参针对非凸问题依然稳健,因为贝叶斯优化的工作方式是通过对目标函数形状的学习,并找到使结果向全局最大提升的参数;网格搜索针对非凸问题易得到局部最优。
④贝叶斯优化迭代次数少,速度快,当特征较多时,需要较多的样本量,样本量不够会导致调参效果不好;网格搜索速度慢,适用于参数组合较少的情况,效果稳定。随机搜索适用于参数较多的情况,速度快,但效果可能会不稳定。
参数模型和非参数模型
参数模型
在机器学习中,对于一组数据,通常会先提出一个假设H,通过训练这个假设H,让它接近数据的真实函数f。说通俗地就是会假定数据服从某种分布,并且知道这种分布的参数(比如假定一组数据服从正态分布),在这个基础上构建的模型叫做参数模型。
优缺点
优点:易于理解和解释,学习快,适合小数据集。
缺点:复杂度低,会受到函数约束(参数模型可以用数学表达式表示出来),不适合处理复杂问题。
例如:逻辑回归(假设数据服从伯努利分布)、线性回归(假设数据服从正态分布)、朴素贝叶斯(假设各特征直接相互独立)
非参数模型
非参数模型不需要提出假设,而是直接对映射函数f学习。因为不做假设,它可以自由地从数据中学习任何函数形式。非参数方法寻求对训练数据的最佳拟合,同时保持对未知数据的泛化能力。因此,它们能够适应大量的函数形式。它不需要对总体分布做出假设,也不知道分布的相关参数,只有在给定一些样本的条件下,能够依据非参数统计的方法进行推断。
优缺点
优点:灵活,能够适应大量的函数形式(非参数模型不可以用数学表达式表示出来)。对于底层函数没有假设,可以产生更高性能的预测模型。
缺点:需要较多的数据集训练,训练速度较慢,容易过拟合。维度较高时,也很难对某些特定的结果做出预测。
例如:K近邻、决策树、支持向量机
参数模型与非参数模型的区别:是否对数据分布做出假设
判别式模型和生式成模型
判别式模型介绍
由数据直接学习决策函数Y=f(X)或者条件概率分布P(Y|X)作为预测的模型。判别模型关心的是对于给定的输入X,应该预测什么样的输出Y。基本思想是有限样本条件下建立判别函数,不考虑样本的产生模型,直接研究预测模型。典型的判别模型包括逻辑回归(在x条件下,两个分类的的概率),k近邻,感知机,决策树,支持向量机等。
生成式模型介绍
由数据学习联合概率密度分布P(X,Y),然后由P(Y|X)=P(X,Y)/P(X)求出条件概率分布P(Y|X)作为预测的模型,即生成模型。基本思想是首先建立样本的联合概率概率密度模型P(X,Y),然后再得到后验概率P(Y|X),再利用它进行分类。例如:朴素贝叶斯、隐马尔科夫等。
生成式模型的特点
- 可以还原出联合概率分布 P(X,Y)。
- 学习收敛速更快,当样本容量增加时,学到的模型可以更快地收敛于真实模型。
- 对联合概率建模,学习所有分类数据的分布。
- 相比于判别式模型,往往模型效果差一些。
- 学习到的数据本身信息更多,能反应数据本身特性。
- 学习成本较高,需要更多的计算资源。
- 需要的样本数更多,样本较少时学习效果较差。
- 一定条件下可以转化为判别模型。
判别式模型的特点
- 不能还原出联合概率分布P(X,Y)。
- 对条件概率建模,学习不同类别之间最优边界。
- 由于直接学习的是条件概率 P(Y|X) 或者决策函数 f(X) ,往往学习的准确率更高。
- 由于直接学习的是 P(Y|X或 f(X) ,可以对数据进行各种程度上的抽象、定义特征并使用特征,可以简化学习问题。
- 对条件概率建模,学习不同类别之间的最优边界捕捉不同类别特征的差异信息,不学习本身分布信息,无法反应数据本身特性。
- 学习成本较低,需要的计算资源较少。
- 需要的样本数可以较少,少样本也能很好学习。
- 不能转化为生成式模型。
举个通俗的例子,假如我们要识别一只羊是山羊还是绵羊。
判别模型是这样做的,通过训练山羊和绵羊的特征,得到一个模型,然后提取这只羊的特征进行预测,就能够预测出来这只羊是山羊或者绵羊的概率。生成模型是这样做的,它会通过训练山羊的特征得到一个山羊模型,然后再训练绵羊的特征得到一个绵羊模型,最后提取这只羊的特征分别放入这两个模型中,看看放入山羊模型的概率是多少,放入绵羊模型的概率是多少。
特征选择
为什么要做特征选择?
特征的选择的好处在于减少数据量、加速模型计算、降低模型复杂度、使模型易于理解、提高模型的准确率
特征选择方法分为三类,分别是过滤法(Filter)、包裹法(Wrapper)、嵌入法(Embedded)。
过滤法
选择特征的时候不考虑模型,仅从特征的角度上去选择表现好的特征。
优点:计算量小、有效降低过拟合程度
缺点:没有考虑从后续要使用的学习器上去选择特征、可能会降低模型的拟合能力
单变量过滤法有:删除缺失比例较高的列、删除方差接近0的特征、删除取值分布严重失衡的类别型特征,多变量过滤法有:相关系数法(用于两个连续性变量)、卡方检验(用于两个类别型变量)、方差分析(用于一个变量是连续性另一个变量是类别型)。
包裹法
包裹法采用的是特征搜索的办法。它的基本思路是,从初始特征集合中不断的选择子集合,根据学习器的性能来对子集进行评价,直到选择出最佳的子集。在搜索过程中,我们会对每个子集做建模和训练。递归特征消除、前向搜索、后向搜索、双向搜索都属于包裹法。
优点:更具有针对性
缺点:计算开销大、样本量较小时容易过拟合
RFECV(递归特征消除+交叉验证法):流程是这样的,RFE是使用一个基模型进行多轮训练,每轮训练后,删除权重低的特征,然后再用剩下的特征集进行训练,最后会得到每个特征的等级(排名)。然后再基于REF的结果选择不同数量的特征分成多个特征子集,训练模型并交叉验证,最后选择平均分最高模型的特征子集。这种方法不仅考虑了特征权重也考虑到了模型表现,效果不错。除此之外还有前向搜索、后向搜索、双向搜索、启发式搜索、随机搜索、完全搜索等方法,
前向搜索法:开始时,按照特征数来划分子集,每个子集只有一个特征,对每个子集进行评价。然后在最优的子集上逐步增加特征,使模型性能提升最大,直到增加特征并不能使模型性能提升为止。
后向搜索法:在开始时,将特征集合分别减去一个特征作为子集,每个子集有(N-1)个特征,对每个子集进行评价。然后在最优的子集上逐步减少特征,使得模型性能提升最大,直到减少特征并不能使模型性能提升为止。
双向搜索:将前向搜索和后向搜索相结合。
启发式搜索是利用启发式信息不断缩小搜索空间的方法。在特征选择中,模型分数或特征权重可作为启发式信息。
嵌入法
特征选择被嵌入进学习器训练过程中。不像包裹法,特性选择与学习器训练过程有明显的区分。
优点:比包裹法省力
缺点:会增加模型的训练负担
常用方法有带L1正则的逻辑回归、基于树模型的特征选择方法、随机森林构建子树时会选择特征子集,可以直接调用模型,让模型自己进行特征的筛选。
总的来说,做特征选择的时候可以把过滤法、包裹法、嵌入法都尝试一遍,除此之外,特征选择最优的方法是基于业务角度选择和衍生特征,这需要业务知识的不断积累。因此当我们进行特征选择之后需要多去思考为什么这个特征对模型有帮助,我们是否还可以合成一些新的高价值特征进入模型中呢?
参考资料:
知乎 特征选择(Feature Selection)方法汇总
标准化和归一化
标准化是(X-E(X))/σ,将数据分布变成均值为0标准差为1的分布 不一定是正态分布
标准化保留了数据之间的距离,没有保留数据的权重大小
适用于分类 聚类算法和大数据
归一化是(X-MIN(X))/(max(X)-min(X)) 将数据规约到0,1 或者-1,1区间
丢失了数据之间的距离,保留了数据的权重大小
适用于小数据以及不涉及距离度量的时候
为什么要做标准化/归一化?
①加快梯度下降法的求解速度(适用于梯度下降法求解的算法)
下面左图是代表两个特征形成的等高线,这两个特征的取值范围差别非常大,当使用梯度下降法求解最优解时,很有可能走“之字型”路线,从而导致需要迭代很多次才能够收敛。右图经过归一化之后,等高线就变圆了许多,在梯度下降的时候就能够更快达到收敛的状态。因此在大部分情况下,如果模型涉及到梯度下降法时,是非常有必要在建模前对数据进行归一化处理,如果不做处理,可能会导致模型很难收敛甚至无法收敛。
②可能提高算法的精度
比如一些机器学习算法需要计算样本点之间的距离(K近邻、K-means),如果某个特征取值范围特别大,那么距离的计算就可能更倾向于这个特征,导致其他特征的影响比较小,如果取值范围小的其他特征更重要,那么模型的精度就会变差,因此在这种情况下,可以考虑采用标准化来提升精度。
参考资料:CSDN用户Dream-YH
AUC
定义
①用分类器对样本进行分类和预测,正样本得分大于负样本得分的概率,就是AUC。
②横坐标是假阳率 纵坐标是召回率 roc曲线所为成的面积就是AUC的值。
计算
样本:y=1,y = 1, y=1, y = -1, y = -1, y = -1
模型1的预测:0.8,0.7,0.3,0.5,0.6,0.9
模型2的预测:0.1, 0.8, 0.9, 0.5, 0.85, 0.2
总共有9组正负样本组合
模型1:正样本score大于负样本score的样本组合有(y1,y4)(y1,y5)(y2,y4)(y2,y5)。AUC值为4/9
模型2:正样本score大于负样本score的样本组合有(y2,y4)(y2,y6)(y3,y4)(y3,y5)(y3,y6)。AUC的值为5/9
所以模型2要比模型1好
优缺点
优点:
①样本不平衡的情况下,不会影响观察模型的效果。
②AUC 继承了 ROC 曲线评估指标无需手动设定阈值的优良特性,直接从整体上(离线排序)方面衡量算法的表现。
缺点:
①只反映了排序能力,关注的是概率值的相对大小,没有反映预测精度。
②无法体现召回率、精确率等在实际业务中经常关心的指标。
训练集&验证集&测试集
训练集:模型拟合所需的数据样本,用于模型训练。
验证集:模型训练过程中单独留出的样本集,用于模型超参数调优以及评估模型效果(比如:是否过拟合,以及验证当前模型的准确率、召回率怎么样)。
测试集:评估模型最终的泛化能力(预测能力)。
过拟合&欠拟合
过拟合定义:模型在训练集或验证集上的效果优越,但在测试集上的效果不佳。
过拟合原因:数据存在噪声、样本数量较少、训练模型过度导致模型复杂。
过拟合解决:增大样本量、减少特征数量、设置最大迭代次数、交叉验证、模型融合(Bagging&Boosting)、正则化
欠拟合定义:模型拟合程度不高,数据距离拟合曲线较远,或指模型没有很好地捕捉到数据特征,不能够很好地拟合数据。
欠拟合原因:模型复杂度低、特征少
欠拟合解决:增加新特征(加入特征组合或者高次特征)、添加多项式特征(将线性模型通过添加二次项或者三次项使模型泛化能力更强)、减少正则化参数、采用非线性模型拟合(SVM或深度学习)、调整模型容量(采用bagging算法对多个弱学习器集成)
正则化
定义:对某一问题加以先验的限制或约束以达到某种特定目的的一种手段或操作。
原理:对损失函数加上某种约束,减少模型的非线性程度,从而减少模型的方差提高泛化能力。 损失函数(loss function)是用来估量你模型的预测值f(x)与真实值Y的不一致程度。
正则化分为两种,L1正则是权重参数的绝对值的和(和L1范数区别不大),L2正则是权重参数的平方和(也就是L2范数的平方,L2范数是平方和开根号)。(权重参数是指x前面的参数)
L1会产生一个稀疏矩阵,用于特征选择,L2更倾向于产生更小更分散的权重向量,让模型做决策时考虑更多的特征,这两种正则化本质都是防止过拟合。
稀疏矩阵和特征选择的关系
在预测或分类时,那么多特征显然难以选择,但是如果代入这些特征得到的模型是一个稀疏模型,表示只有少数特征对这个模型有贡献,绝大部分特征是没有贡献的,或者贡献微小(因为它们前面的系数是0或者是很小的值,即使去掉对模型也没有什么影响),此时我们就可以只关注系数是非零值的特征。这就是稀疏模型与特征选择的关系。
smote过采样
SMOTE(Synthetic Minority Oversampling Technique),合成少数类过采样技术。主要用于解决正负样本不平衡问题。
它是基于随机过采样算法的一种改进方案,由于随机过采样采取简单复制样本的策略来增加少数类样本,这样容易产生模型过拟合的问题, 即使得模型学习到的信息过于特别(Specific)而不够泛化(General),SMOTE算法的基本思想是对少数类样本进行分析并根据少数类样本人工合成新样本添加到数据集中。
算法流程如下:
1.计算出每个少数类样本的K个近邻;
2.从K个近邻中随机挑选N个样本进行随机线性插值,构造新的少数类样本;
(随机线性插值:在特征空间中,每个少数类样本与它们的每个近邻样本连成一条直线,随机在直线上选取一点(每条直线只取一次),则为新构成的样本)
3.将新样本与原数据合成,产生新的训练集;
算法思想:随机选取n个少数的样本,找出初始扩展的少类样本,再找出最靠近它的m个少类样本,在任选最临近的m个少数类样本中的任意一点,从这两点上任选一点,这点就是新增的数据样本。
缺陷:一是在近邻选择时,存在一定的盲目性,而是无法克服非平衡数据集的数据分布,容易产生分布边缘化的问题。也就是说正负样本的边界可能会越来越模糊,虽然使数据集平衡性得到改善,但加大了分类算法进行分类的难度。
apriori关联分析
apriori算法主要应用于购物篮分析。购物篮分析是关联分析的一种重要应用:通过发现顾客在一次购买行为中放入购物篮的不同商品之间的关联,研究客户的购买习惯,为运营决策提供支持建议。比如:经常同时购买的商品可以摆得近一点,以便刺激这些商品一起销售。
事务:每条交易可以称为一个事务。
项:在关联分析中被研究的数据称为项。例如:用户每条订单中每件商品都可以称为1个项。
项集:0个或多个项的组合。
关联规则:项集与项集之间所存在的关联关系。书写格式为{X}→{Y}
支持度:项集在事务中出现的概率。支持度=项集在事务中出现的次数/事务的总量。
Support(X)={X}出现的次数/事务总数
置信度:前项集出现的情况下,后项集出现的概率。置信度=所有项组成项集的支持度/前项集的支持度。Confidence(X→Y)=Support(X,Y)/Support(X)
提升度:可用于判断前项与后项的关系是促进、抑制、无影响。提升度=关联规则的置信度/后项集的支持度。Lift(X→Y)=Confidence(X→Y)/Support(Y)
频繁项集:支持度大于等于最小支持度的项集。1个频繁项集可以产生(2的K次方)-2条关联规则。(K为一个频繁项集中包含的项的个数)
强关联规则:频繁项集所组成的关联规则中,满足置信度大于等于最小置信度的关联规则成为强关联规则。
原理:
Apriori算法使用一种称为逐层搜索的迭代方法,其中k项集用于探索(k+1)项集。首先,通过扫描数据库,计算每个项的支持度,保留大于等于最小支持度的项,找出频繁1项集的集合。该集合记为L1。然后,使用L1找出频繁2项集的集合L2,使用L2找出L3,如此下去,直到不能再找到频繁k项集。
核心思想: 通过连接产生候选项及其支持度,然后通过剪枝生成频繁项集。
步骤:
1.找到支持度大于等于最小支持度的频繁项集。
2.根据频繁项集所组成的关联规则中,筛选大于等于最小置信度的强关联规则。
算法缺点:
当商品数据量大时,效率很低
机器学习模型的评价指标
回归模型评价指标
1.MAE(平均绝对误差)用于评估预测结果和真实数据集的接近程度的程度,其值越小说明拟合效果越好。
优点是易于理解,它通过将每一个数据点的真实值与预测值计算残差,并且只取每个残差的绝对值,最后取一个平均值作为回归模型的评价值,缺点就是并不能知道这个评价值代表模型的拟合是优还是劣,只能通过对比才能达到效果。
2.MSE(均方误差)该指标计算的是拟合数据和原始数据对应样本点的误差的平方和的均值,其值越小说明拟合效果越好。
3.RMSE(均方根误差) 也称为标准误差,它是观测值与真值偏差的平方与观测次数比值的平方根。也就是MSE开个根号,可以更好地保留量纲的一致性(量纲可以理解为数值和单位有关)。相比于MSE,RMSE对异常值比较敏感,因此该指标能够很好的反映出误差的精密度,这也就使其鲁棒性较差。
4.R^2(R方、决定系数)含义是解释回归模型的方差得分。其值取值范围是[0,1],越接近于1说明自变量越能解释因变量的方差变化,值越小则说明效果越差。比如:决定系数是0.86,这就意味着y的86%的变化可以通过x解释
分类模型评价指标
1.混淆矩阵
混淆矩阵有四个基础指标,分别为以下四个。
- 真正例TP: 正类数据中被正确分类的数据,即 1 被正确预测,预测值为 1
- 真负例TN: 负类数据中被正确分类的数据,即 0被正确预测,预测值为 0
- 假正例FP: 负类数据中被错误分类的数据,即 0被错误预测,预测值为 1
- 假负例FN: 正类数据中被错误分类的数据,即 1 被错误预测,预测值为 0
由混淆矩阵又能衍生出其他指标,例如:精度、查准率、查全率、假阳率等
精度(准确率)accuracy = (TP+TN)/(TP+TN+FP+FN),可以理解为预测正确的样本数占总样本数的比例。
精确率(查准率)precision = TP/(TP+FP),可以理解为被预测为正的样本中,预测为正确的样本比例。
召回率(查全率)recall = TP/(TP+FN),可以理解为正样本中,预测正确的样本比例。
真阳率、灵敏度TPR(True Positive Rate)与召回率计算公式一样。
假阳率(False Positive Rate) FPR=FP/(FP+TN),可以理解为负样本中,预测为正样本的比例。
特异度(true negative rate) TNR= TN / (FP + TN),可以理解负样本中,预测正确的比例。
2.F1 Score
F1 结合了精确率和召回率。F1=2*precision *recall/(precision+recall),取值范围为[0,1],F1值越大说明模型在判断正类数据上越成功。但仍然需要结合假正例来判断模型在对负类数据上的效率。
3.roc曲线和AUC
roc(receiver operating characteristic)曲线,中文名称为接收者操作特征,是以假阳率为横坐标,召回率为纵坐标所绘制而成的曲线,曲线上每个点反映着对同一信号刺激的感受性。
具体定义如下,对于样本数据,我们使用分类器对其进行分类,分类器会给出每个数据为正例的概率,我们可以针对此来设定一个阈值,当某个sample被判断为正例的概率大于这个阈值时,认为该sample为正例,小于则为负例,然后通过计算我们就可以得到一个(TPR , FPR)对,即图像上的一个点,我们通过不断调整这个阈值,就得到若干个点,从而画出一条曲线。
AUC的定义是roc曲线所围成的面积,当roc曲线越靠近左上方的时候代表曲线所围成的面积越大,说明模型分类效果越好,它的取值范围为[0.5,1],可以直观地评价分类器的好坏,越接近1代表分类器效果越好。
聚类模型评价指标
聚类模型的评价指标可以分为两类,一类是外部指标,也就是数据集是有标签或者有人工给定的参考标准,相当于是有监督的条件下,评估聚类模型的效果。第二类是内部指标,是无监督的,无需基准数据集,不需要借助于外部参考模型,利用样本数据集中样本点与聚类中心之间的距离来衡量聚类结果的优劣。
(1)外部指标
- 兰德系数RI,取值范围为[0,1],值越大意味着聚类结果与真实情况越吻合。
- 调整兰德系数ARI,取值范围为[-1,1],值越大意味着聚类结果与真实情况越吻合。是为了实现“在聚类结果随机产生的情况下,指标应该接近零”而提出的。ARI衡量的是两个数据分布的吻合程度。优点:对任意数量的聚类中心和样本数,随机聚类的ARI都非常接近于0; 取值在[-1,1]之间,负数代表结果不好,越接近于1越好; 可用于聚类算法之间的比较。缺点:需要真实标签。
- 互信息评分MI,与RI类似,只是公式不同,取值范围相同,越接近于1越好。
- 调整互信息评分AMI,与ARI类似,公式不同,取值范围相同,越接近于1越好。
- 纯度(Purity),用聚类正确的样本数除以总的样本数,和分类模型中的准确率ACC差不多。
- F值(F-measure),和分类模型中的评估指标F值差不多。
(2)内部指标
- 紧密度(Compactness):每个聚类簇中的样本点到聚类中心的平均距离。对应聚类结果,需要使用所有簇的紧密度的平均值来衡量聚类算法和聚类各参数选取的优劣。紧密度越小,表示簇内的样本点越集中,样本点之间聚类越短,也就是说簇内相似度越高。
- 分割度(Seperation):是各簇的簇心之间的平均距离。分割度值越大说明簇间间隔越远,分类效果越好,即簇间相似度越低。
- 戴维森堡丁指数DBI:该指标用来衡量任意两个簇的簇内距离之后与簇间距离之比。该指标越小表示簇内距离越小,簇内相似度越高,簇间距离越大,簇间相似度低。
- 邓恩指数DVI:任意两个簇的样本点的最短距离与任意簇中样本点的最大距离之商。该值越大,聚类效果越好。
- 轮廓系数SC:对于一个样本集合,它的轮廓系数是所有样本轮廓系数的平均值。轮廓系数的取值范围是[-1,1],同类别样本距离越相近,不同类别样本距离越远,分数越高。优点:轮廓系数为-1时表示聚类结果不好,为+1时表示簇内实例之间紧凑,为0时表示有簇重叠。轮廓系数越大,表示簇内实例之间紧凑,簇间距离大,这正是聚类的标准概念。缺点:对于簇结构为凸的数据轮廓系数值高,而对于簇结构非凸需要使用DBSCAN进行聚类的数据,轮廓系数值低,因此,轮廓系数不应该用来评估不同聚类算法之间的优劣,比如Kmeans聚类结果与DBSCAN聚类结果之间的比较。
机器学习笔面试题
数据预处理包含哪些步骤?
①数据清洗,处理脏数据,包括填写缺失值、重复值、清除噪声数据(降噪)、纠正不一致数据、识别或删除离群点等,比如:K近邻填充缺失值、箱型图寻找离群点等方法。
②数据规约,可以通过如聚集、删除冗余特征或聚类来降低数据规模,提高运行速度。一般分为维规约和数值规约两种,维规约指的是,合并属性或者选择最佳属性,方法有PCA降维等。数值规约是指减少数据量,选择少量且具有代表性的数据,比如随机抽样、分层抽样等方法。
③数据变换,将数据压缩到较小的区间,消除数据之间的单位问题,比如:标准化、归一化。
④数据集成,解决数据之间的不一致和冗余问题,提高模型运行速度、以及可解释性。比如:合并异名同义的字段、皮卡尔逊相关系数法删除相关性高的特征。
你的项目里数据预处理中,从代码的角度,用了哪些方法或者函数?
缺失值处理方面:使用了pandas中的isnull(),sum(),sort_values等方法,计算各特征缺失值占比,然后通过matplotlib里库中的plot方法绘制这些特征缺失值占比分布的这些图,找出阈值之后,用drop方法删除部分缺失比例高的特征,最后使用sklearn.impute库中的KNNImputer方法对缺失数据进行K近邻填充。因为我认为用户与用户之间存在一定的相似性,而K近邻填充就是根据缺失样本附近的K个样本加权平均来估计该样本的缺失数据的,所以效果比较好。
异常值处理方法:通过numpy库里的percentile方法,计算各特征的四分位数,绘制箱型图,找到异常值,再基于业务角度,思考异常值出现的原因,再删除或修改部分异常值。
数据采样方面:使用imblearn.over_sampling库中的smote过采样方法解决样本不平衡问题,因为原数据集中正负样本比例严重不均衡,通过smote过采样之后,少数类样本的数量会和多数类样本的数量持平。smote过采样方法里也使用到了k近邻算法,它通过一个少数类样本,找到附近K个少数类样本,对其中m(m<k)个样本进行连线,在线上随机选一点,生成一个样本即为新样本。相比于随机过采样简单复制的方法,smote过采样的采样效果更好。
特征工程是什么?
数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限。特征工程本质是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用。特征工程主要包含数据预处理,特征选择,降维等步骤。
为什么说信息熵越小,不确定性越低?
举个简单的例子,比如我有两个骰子,分别是六个面的和12个面的骰子,根据信息熵公式可以知道,六个面的骰子信息熵比12个面的骰子信息熵小,假如我想要得到点数为1,很明显六个面的骰子更容易得到点数为1的结果,因此它的不确定性比12个面的骰子的不确定性低,这也就证明了信息熵越小,不确定性越低。
决策树如何做预测的?
首先树的生长是选择最优划分属性不断地对数据集划分下去,达到某个截止条件后停止生长,比如:到达指定深度或者所有特征划分完毕。如果是做回归预测,那么是根据叶子结点的平均值或者中位数作为预测值,如果是做分类预测,那么是根据叶子结点中概率(占比)最大的类别作为预测值。
机器学习中,你用的比较多的分类模型有哪些?(回答此类问题,用于引导面试官对你的答案提问)
随机森林、逻辑回归、xgb、lgbm、catboost。打比赛的时候经常会使用到他们,比较一下哪个算法效果更好,也会做一些模型融合之类的。
决策树和xgb之间有什么联系吗?
xgb是采用boosting集成学习算法按顺序生成多个cart回归决策树,后一棵树会用到前一棵树的结果,拟合上一次预测的残差,最后采用加权累加的方式输出预测值。
机器学习模型如何调优?
机器学习模型调优有三种方式,分别是比较不同的算法,调优模型超参数,改进数据。
比较不同的算法:不同的算法适合不同类型的数据集,我们可以一起训练它们,找到表现最好的那个。比如说对于分类问题,可以采用逻辑回归、支持向量机、随机森林、xgb、神经网络,也可以考虑做模型融合比如stacking集成或者voting集成,将多个强学习器集成更强的学习器(有过拟合风险)。
调整模型参数:一般是采用交叉验证的方式进行调优,如果是xgb,那么调整的超参数可以是树的数量、树的深度、正则化、采样比例、学习率等,也可以调整模型的做分类的阈值,根据问题的不同,优化召回率或精度中的一个。
改进数据:扩大样本量、特征工程(衍生新特征、删除数据泄露的特征、降维、采样等)
机器学习模型什么时候应该停止调优?
- 首先应该满足最低要求:模型性能至少应优于基线指标。
- 尝试所有改进模型的策略。
- 将模型性能与必须验证的其他一些指标进行比较,以验证模型是否有意义。
- 在进行了几轮模型调整后,评估一下继续修改和性能提升百分点之间的性价比。
- 如果模型表现良好,并且在尝试了一些想法后几乎没有继续改进,请将模型部署到生产过程中并测量实际性能。
- 如果真实条件下的性能和测试环境中类似,那你的模型就算可以用了。如果生产性能比训练中的性能差,则说明训练中存在一些问题,这可能是因为过拟合或者数据泄露。这意味着还需要重新调整模型。
你认为业务和机器学习建模之间有什么区别或者联系吗?
我认为理解业务场景是机器学习的第一步,也就是确定目标。将实际业务抽象为机器学习能处理的数学问题,也就是能够从现有的数据中学的某种规律,从而解决实际问题。因为机器学习的特征工程和模型训练通常都是一件非常耗费精力和时间的过程,为了避免走许多弯路,所以一开始就需要对业务有深刻的理解,考虑清楚如何将它们转化为机器学习模型,比如:要输入什么样的数据、想要预测什么、是要做一个分类还是回归或者是聚类。理解这些问题可以帮助我们更好地利用数据,引导我们选择模型框架、损失函数等。
XGB中的近似直方图算法和LGBM的直方图算法的区别是什么?
XGB在每一层都需要动态的构建直方图,所有特征共享一个直方图,而且每一层都要重新构建直方图。而 lgb 针对每个特征都有一个直方图,构建一次就可以,并且在分裂的时候还可以通过直方图进行做差加速。也就是说LGBM的直方图算法的效率更高。
LR(逻辑回归)与SVM的相同点和不同点是什么?
相同点:
- 他们都可以处理二分类问题,改进之后可以处理多分类问题。
- 都可以增加不同的正则化项,如L1、L2等等。所以在很多实验中,两种算法的结果比较接近。
不同点:
- LR是参数模型,SVM是非参数模型。
- 从目标函数来看,区别在于逻辑回归采用的是Logistical Loss,SVM采用的是hinge loss.这两个损失函数的目的都是增加对分类影响较大的数据点的权重,减少与分类关系较小的数据点的权重。
- 逻辑回归模型比较简单、易于理解,在大规模线性分类时比较方便。SVM优化和理解相对复杂一点,并且不太适合处理大规模数据集。
- LR能做的SVM也能做,但可能在准确率上有问题,SVM能做的LR有的做不了。
在K-means和KNN中通常使用欧氏距离来计算邻居之间的距离,为什么不使用曼哈顿距离呢?
欧式距离更关注于点在空间的相对距离,而曼哈顿距离则关注于点如何通过坐标轴上的方向到达另一点。在使用K-means或KNN时,我们更加关注样本的相似性,而不考虑样本之间的投影差异,所以大部分情况采用欧氏距离比较多。在国际象棋中,象或车所做的移动是由曼哈顿距离计算的,因为我们更关注象棋的移动方式。
L1和L2正则先验分别服从什么分布?
L1是拉普拉斯分布,L2是高斯分布。
为什么L1会产生稀疏解,L2会产生稠密解?
假设参数只有两个:w1,w2 上图中,左图是对应L2范式,右图对应L1范式,w*是对应最优解,蓝色圆圈代表损失函数的等高线,到达中间的小圆点时,损失为0,从小圆点向外,损失越来越大。
目标是把参数的解限制在黄色的区域内,同时使得损失尽可能小。
从图中可以看到,L2正则化相当于为参数定义了一个圆形的解空间,倾向于为各个分量均分一些权重,因而更稠密;L1正则化相当于为参数定义了一个菱形的解空间,倾向于将部分分量设置为0,因而更稀疏。
随机森林如何选择特征?
随机森林中进行特征重要性的评估思想为判断每个特征在随机森林中的每颗树上做了多大的贡献,然后取平均值,最后比较特征之间的贡献大小。其中关于贡献的计算方式可以是基尼指数或袋外数据错误率。
对每一个决策树选择对应的袋外数据OOB,计算它的袋外数据误差,记为errOOB1,袋外数据是指由于决策树是有放回抽样,所以会有36.8%(一条数据n轮没选到的概率为(1-1/n)的n次方,当n趋向于无穷大时,约等于1/e也就是36.8%)左右的数据没有参与训练,因此这部分数据被称为袋外数据。随机地对袋外数据OOB所有样本的特征X加入噪声干扰(就可以随机的改变样本在特征X处的值),再次计算它的袋外数据误差,记为errOOB2。
假设森林中有N棵树,则特征X的重要性=∑(errOOB2-errOOB1)/N。这个数值之所以能够说明特征的重要性是因为,如果加入随机噪声后,袋外数据准确率大幅度下降(即errOOB2上升),说明这个特征对于样本的预测结果有很大影响,进而说明重要程度比较高。
袋外数据是无偏估计的,所以在随机森林算法中不需要再进行交叉验证或者单独的测试集来获取测试集误差,袋外数据可以直接充当测试集的作用。
袋外错误率计算方式:
1)对每个样本,计算它作为oob样本的树对它的分类情况(约1/3的树);
2)然后以简单多数投票作为该样本的分类结果;
3)最后用误分个数占样本总数的比率作为随机森林的oob误分率。
在特征重要性的基础上,特征选择的步骤如下:
计算每个特征的重要性,并按降序排序
确定要剔除的比例,依据特征重要性剔除相应比例的特征,得到一个新的特征集
用新的特征集重复上述过程,直到剩下m个特征(m为提前设定的值)
根据上述过程中得到的各个特征集和特征集对应的袋外误差率,选择袋外误差率最低的特征集
训练完后的模型应该如何保存?
常用保存模型的包有pickle/joblib
pickle库(不需要安装)实现模型保存
import pickle
#保存模型,我们想要导入的是模型本身,所以用“wb”方式写入,即是二进制方式,DT是模型名字
pickle.dump(DT,open("dtr.dat","wb")) # open("dtr.dat","wb")意思是打开叫"dtr.dat"的文件,操作方式是写入二进制数据
loaded_model = pickle.load(open("dtr.dat","rb"))#加载模型
loaded_model.predict(xtest)
joblib库(需要安装)实现模型保存
import joblib
joblib.dump(DT,'DT.dat') # 第二个参数是文件名字
loaded_model2 = joblib.load('DT.dat')
loaded_model2.predict(xtest)
XGB自带的保存模型方法
#这里假设模型名字xgboost
xgboost.save_model('train.model')
loaded_model3 = xgb.Booster(model_file='train.model')
loeded_model3.predict(xtest)
逐步回归法有了解吗?
逐步回归法是一种筛选特征的方法,它属于特征选择方法中的包裹法。原理是对每个解释变量依次引入模型进行F检验,同时对已引入的解释变量逐个进行T检验,当原来引入变量由于后面加入的变量的引入而不再显著变化时,则剔除此变量,确保每次引入新的变量之前回归方程中只包含显著性变量,直到既没有显著的解释变量选入回归方程,也没有不显著的解释变量从回归方程中剔除为止,最终得到一个最优的变量集合。
K-means优化有了解吗?
针对初始簇心比较敏感的问题,可以考虑采用k-means++算法,它的基本思想是逐个选取k个簇中心,且离其它簇中心越远(但不是最远的点,因为需要防止异常值的影响)的样本点越有可能被选为下一个簇中心。这个也很符合K-means原理:保持簇内对象相似度越大,保持簇与簇之间相似度越小。还有一种方法是二分K-means,将所有点作为一个簇,然后根据传统Kmeans算法将该簇一分为二,计算所有簇的和方差SSE,将和方差SSE最大的簇再次划分,依次进行以上步骤,直到达到簇的数量等于初始给定的数量为止。
针对于初始簇的数量设定问题,可以考虑采用ISODATA(迭代自组织数据分析方法)算法,这个算法是在k-means基础上增加对聚类结果的“合并”和“分裂”两个操作,当两个簇内中心距离小于阈值时则会将两个聚类中心合并为同一个,当某个簇的最大方差大于某个阈值且簇内样本数大于某个阈值则进行分裂,因此最终的聚类结果可能会和初始设定的K值不同,从而改善簇数量的设定问题。
针对聚类效果问题,可以考虑采用Kernel K-means算法,它参考了支持向量机中的核函数思想,将每个样本投射到高维空间进行聚类,因为在高维空间内可能可以起到改善聚类效果的作用。
针对海量数据集,执行速度慢的问题,可以采用Mini Batch K-means,采用小规模数据子集进行聚类,从而减少K-means算法的收敛时间。
还有另一种基于密度的聚类方法DBSCAN,可以很好的处理不同形状和不同大小的簇问题,并且不受异常值影响,可以自动确定簇的个数,但它的时间复杂度O(m^2)相比于Kmeans时间复杂度O(m)更高,也不能够很好地处理稀疏的高维度数据。
机器学习小项目
kaggle房价预测项目(入门小项目)
赛题背景:根据爱荷华州埃姆斯住宅的79个特征变量,预测每栋房屋的最终价格。评估指标是RMSE平方根误差。
这是我去年参与的一个竞赛,排名达到了前2.4%左右(总共50000+队伍参与),做这个比赛的目的是打基础。
在这个比赛中主要用到的方法有:
数据处理方面:删除一些缺失比例比较高的特征、对(特征取值有大小关系的)字符串型特征有进行顺序编码OrdinalEncoder和对(特征取值较多的)字符串特征进行哑变量编码。
特征选择:通过LGBM回归拟合输出各特征重要性并逆序排序,取出前55个重要的特征。
填充缺失值:采用K近邻填充,并使用随机森林进行拟合预测以rmse作为评价指标,从而确定最优的K近邻填充的K值。
模型训练:采用贝叶斯优化进行超参数调优,以xgb回归器预测测试集样本。
感兴趣的小伙伴可以看一下具体的代码(有一点乱) 开源地址
以上方案不足的地方:
①数据处理方面:没有分析一下数据集各个特征的分布情况,仅仅只是了解了一下是否缺失和重复。一般来说,需要特征做一下数据可视化。 对类别型特征的处理不是很恰当。
②特征筛选方面:使用的方法较少,还可以再使用一些方法例如:过滤法、包裹法、嵌入法等,具体特征选择的方法在这篇博客中也都有提到。除此之外,还可以基于自己对特征的理解,衍生一部分其他特征,例如:可以把地下室面积特征和地上活动区面积特征相加得到一个新的特征。
③模型方面:没有比较多个模型的效果(集成模型可以考虑都尝试一遍)、也没有进行交叉验证(贝叶斯优化虽然用到了交叉验证,但并没有产生很好的效果,可能是我没有使用好,可以尝试传统一点的网格搜索)、没有模型融合(stacking模型融合,传统机器学习比赛中的大杀器)、模型调优的超参数数量较少(当时对模型算法理解较浅)、没有进行模型诊断评估模型的方差和偏差关系。这些也都是需要优化的地方。
百面机器学习
本章节的内容参考于书籍《百面机器学习》,这本书包含一百道以上算法工程师的面试题和解答,有非常高的学习价值。
在进行数据预处理时,如何处理类别型特征?
常用的方法有三种分别是序号编码、独热编码、二进制编码。还有一种方法是不做处理,然后使用LGBM(只能处理数值类型的类别型特征)或者CatBoost(可以处理字符串和数值类型的类别型特征)模型并在建模时指定哪些特征是类别型特征,之后模型就可以自动处理它们。下面介绍一下序号编码、独热编码、二进制编码。
序号编码:序号编码主要用于处理类别间有大小关系的数据。例如:成绩可以分为高、中、低三个档次,并且存在‘高>中>低’的排序关系。然后序号编码会根据大小关系对类别型特征赋予一个数字ID,例如3表示高、2表示中、1表示低。转化后依旧保留了大小关系。
独热编码:通常用于处理类别间不存在大小关系的特征。例如:血型一共有四个取值(A型、B型、AB型、O型),独热编码会把血型变成一个四维稀疏四维向量,说通俗一点就是,把一个特征变成四个特征。例如A型血表示为(1,0,0,0)、B型血表示为(0,1,0,0)、AB型血表示为(0,0,1,0)、O型血表示为(0,0,0,1)。当类别型特征取值较多时,使用独热编码后需要注意搭配一些特征选择的方法降低维度,这样可以有效避免过拟合问题。
二进制编码:二进制编码主要分为两步,先用序号编码给每个类别赋予一个类别ID,然后将类别ID对应的二进制编码作为结果。以血型为例,A血型的ID为1,二进制表示为001;B血型的ID为2,二进制表示为010;AB型血型的ID为3,二进制表示为011,以此类推可以得到O型血的表示方式。二进制编码本质上利用二进制ID进行哈希映射,最终得到0/1特征向量,且维度数量少于独热编码,节省了存储空间。
除了以上编码形式还有其他编码方法,比如Helmert Contrast、Sum Contrast、Polynomial Contrast、Backward Difference Contrast等。不再具体介绍了。
roc曲线如何绘制?
roc曲线绘制有两种方法。
第一种是比较常用的方法,在二分类问题中,模型的输出一般是预测样本为正例概率,将样本按照预测概率从高到低排序。此时,我们需要指定一个阈值,当预测概率大于该阈值的样本会被判断为正例,小于该阈值的样本会被判断为负例,然后动态地调整这个阈值,从最高得分(实际上是从正无穷开始调整,对应roc曲线的(0,0)点坐标)开始调整,逐渐调整到最低得分,每个阈值都会对应着一个FPR(假阳率)和TPR(召回率),在roc图上绘制每个阈值所对应的位置,再连接所有点就得到了最终的roc曲线。
第二种是更直观地绘制roc曲线的方法。首先根据样本标签统计出正负样本的数量,假设正样本数量为p,负样本数量为n;接下来,把横轴的刻度间隔设置为1/n,把纵轴的刻度设置为1/p;再根据模型输出的预测概率对样本进行从高到低的排序;依次遍历所有样本,同时从零点开始绘制roc曲线,每遇到一个正样本就沿着纵轴方向绘制一个刻度间隔的曲线,每遇到一个负样本就沿着横轴方向绘制一个刻度的曲线,直到遍历完所有样本,曲线最终停止在(1,1)坐标点,整个roc曲线绘制完成。
如何对决策树进行剪枝?
决策树剪枝通常有两种方法,分别是预剪枝和后剪枝,预剪枝是在生成决策树的过程中提前停止树的生长。而后剪枝是在已经生成过拟合决策树之后进行剪枝,得到简化版决策树。
预剪枝的核心思想是:在树中的结点进行扩展之前,先计算当前的划分是否能带来模型泛化能力的提升,如果不能,则不再继续生长子树。此时,可能存在不同类别样本存在于结点当中,按照多数投票的原则判断该结点。预剪枝的方法有以下几种。
- 当树达到一定深度的时候,停止树的生长。
- 当到达当前结点的样本数量小于某个阈值的时候,停止树的生长。
- 计算每次分裂对测试集的准确度提升,当小于某个阈值时,不再继续拓展。
预剪枝具有思想简单、算法简单、效率高的特点,适合解决大规模问题。但如何准确地估计何时停止,针对不同问题会有很大区别,需要一定的经验判断。同时预剪枝存在局限性,有欠拟合风险,虽然当前的划分会导致测试集的准确率降低,但在之后的划分后,准确率可能会显著性提高。
后剪枝的核心思想是让算法生成一棵完全生长的决策树,然后自底向上计算是否剪枝。剪枝过程将子树删除,用一个叶子结点替代,该叶子结点中的类别按照多数投票的原则进行判断。同样地,后剪枝也可以通过在测试集上的准确率进行判断,如果剪枝过后,准确率有泛化性能的提升,则进行剪枝。相比于预剪枝,后剪枝通常可以得到泛化性能更高的决策树,但时间开销会更大。
后剪枝方法有很多例如错误率降低剪枝REP、悲观剪枝PEP、代价复杂度剪枝CCP、最小误差剪枝MEP等。这里具体介绍一下cart决策树中的剪枝方法CCP。
代价复杂度剪枝CCP主要包含两个步骤:
(1)从完整决策树T0开始,生成一个子树序列{T0,T1,T2,...,Tn},其中Ti+1由Ti生成,Tn为树的根结点。具体来说就是首先计算T0所有内结点(包括根结点)的误差增加率,选择误差增加率最小的内结点进行剪枝(将内结点替换为叶子结点),此时就生成了一个子树T1。然后用T1重复以上的步骤,直到生成Tn为根结点为止。最后就得到了子树序列{T0,T1,T2,...,Tn}。
误差增加率α=(R(t)−R(T))/(|L(T)|-1),分子代表剪枝后该结点的误差减去未剪枝前子树的误差,分母代表子树的叶子结点个数减一。
(2)在子树序列中,根据真实误差选择最佳的决策树。有两种方法选择最佳的决策树,一种是基于独立剪枝数据集,另一种是基于k折交叉验证。
对于二分类问题,当训练集中正负样本非常不均匀时,如何处理数据以更好地训练分类模型?
首先要知道,为什么很多分类模型在训练不均衡数据时会出现问题?本质原因是模型在训练时优化的目标函数和人们在测试集时使用的评价指标不一致。这种‘不一致’可能是由于训练时和测试时期望的样本分布不一致;也可能是由于训练阶段不同类别的权重(重要性)与测试阶段不一致
根据上述分析,一般可以从两个角度来处理样本不均衡问题。
- 基于数据的方法
最简单处理不均衡数据集的方法是随机采样。采样一般分为过采样和欠采样。随机过采样是从少数类样本集随机有放回抽取样本以得到更多的样本;随机欠采样则相反,从多数类样本集随机抽取较少的样本(有放回或无放回)。
直接的随机采样虽然可以使样本集变得均衡,但会带来一些问题,比如,随机过采样对少数类样本进行了多次复制,扩大了数据规模,增加了模型复杂度,同时也容易造成过拟合;而随机欠采样会丢弃一部分样本,这样会导致可能损失一些有价值的信息,造成模型只学习到了整体模式的一部分。
为了解决上述问题,通常在过采样时并不是简单地复制样本,而是采用一些其他方法生成新的样本。例如:SMOTE过采样方法对少数类样本中每个样本,从它在少数类样本的k近邻中随机选择一个样本,然后将这个样本与原样本进行连线,在线上随机选择一点即为新生成的样本(根据需要过采样的倍率重复上述过程若干次)。这种过采样方法相比于随机过采样可以降低过拟合的风险。
但smote过采样为每个少数类样本合成相同数量的新样本,这可能会增大类间重叠度,并且会生成一些不能提供有效信息的样本。为此还出现了一些改进算法,例如:Borderline-SMOTE只给处在分类边界的少数类样本合成新样本、ADASYNZ则给不同的少数类样本合成不同个数的新样本。此外,还可以使用一些数据清理的方法(基于Tomek Lines)来进一步降低合成样本带来的类间重叠,以得到清晰的类簇,从而更好地训练分类器。
对于欠采样方法,可以采用Informed Undersampling来解决由于随机欠采样带来的数据丢失问题。常见的Informed Undersampling方法有:
①Easy Ensemble算法。每次从多数类样本中随机抽取一个子集(子集中的样本个数≈少数类样本个数),然后使用这个子集+少数类样本训练一个分类器;重复上述过程若干次,得到多个分类器,最终的分类器结果是这多个分类器结果的融合。
②Balance Cascade算法。级联结构,每一级中从多数类样本中随机抽取子集,用子集+少数类样本训练该级的分类器;然后将多数类样本中能够被当前分类器正确判别的样本剔除掉,继续下一级的操作,重复若干次得到级联结构;最终的输出结果也是各分类器结果的融合。
③其他诸如NearMiss(利用K近邻信息挑选具有代表性的样本)、One-sided Selection(采用数据清理技术)等算法。
在实际应用中,具体的采样操作可能并不总是如上述几个算法一样,但基本思路很多时候还是一致的。例如,基于聚类的采样方法,利用数据的类簇信息来指导过采样/欠采样操作;经常用到的数据扩充方法也是一种过采样,对少数类样本进行一些噪声扰动或变换(如图像数据集中对图片进行裁剪、翻转、旋转、加光照等)以构造出新的样本;而Hard Negative Mining则是一种欠采样,把比较难的样本抽出来用于迭代分类器。
- 基于算法的方法
在样本不均衡时,也可以通过改变模型训练时的目标函数(如代价敏感学习中不同类别有不同的权重)来矫正这种不平衡性。当样本数目极其不均衡时,也可以将问题转化为单类学习(one-class learning)、异常检测(anomaly detection)。
常用的基分类器是什么?
最常用的基分类器是决策树,主要有以下三个原因:
①决策树可以比较方便地讲样本权重整合到模型训练中,而不需要使用过采样的方法调整样本权重。
②决策树的表达能力和泛化能力,可以通过调节树的层数来做折中。
③数据样本对决策树的扰动对于决策树的影响较大,因此不同子样本集合生成的决策树基分类器随机性较大,这样‘不稳定的学习器’更适合做基分类器。此外决策树在节点分裂的时候,随机地选择一个特征子集,从中找出最优分裂属性,很好地引入了随机性。
除了决策树外,神经网络模型也适合作为基分类器,主要由于神经网络模型也比较“不稳定”,而且还可以通过调整神经元数量、连接方式、网络层数、初始权值等方式引入随机性。
梯度上升和梯度下降的区别和联系是什么?
下面这幅图就是梯度上升和梯度下降的比较,可以发现它们共同的特点都是在每轮迭代中,利用损失函数相对于模型的负梯度方向的信息来对当前模型进行更新,只不过在梯度下降中,模型是以参数化形式表示,从而模型的更新等价于参数的更新。而在梯度提升中,模型并不需要进行参数化表示,而是直接定义在函数空间中,从而大大扩展了可以使用的模型种类。
数据分析
1.指标&指标体系
1.1 定义
指标是用来评估业务目标表现或效果的量化参数,最直观的作用就是将业务量化。
指标体系是指不同指标按照一定的顺序及内部联系而组成的整体。
1.2 常见指标
GMV:总成交金额。GMV=销售额+取消单金额+拒收单金额+退货单金额。
CPM:展现成本,或者叫千人展现成本。(比较适用于网络广告中 视频贴片,门户横幅等非常优质的广告位)
CPC:每次点击广告所花费的成本(比如搜索引擎的竞价排名)。
CPA:每产生一次行为(注册、咨询、放入购物车)的成本。
UV:独立访客数量,记录访问了某个网页的用户数量,需要对用户进行去重处理。
PV:页面访问量,与UV的区别是不进行去重。
CTR:点击率=网站点击数/被用户看见的次数,可以用于商品,广告链接等。
CR:转化率:比如商品的CR=商品购买人数/商品浏览人数。
ROI:投资回报率:投资回报率=利论/成本,ROI越高,代表项目的价值越高。
ARPU:平均每用户收入,用户收入/用户总数。
ARPPU:平均每个付费用户收入,用户收入/付费用户总人数。
LT:用户总留存时间/总用户数=1+第一天留存率+第二天留存率+第三天留存率+...第n天留存率。
CAC:用户获取成本,某一周期内产品投入成本/产品有效用户数。
CPT:按时长收费的广告。
DAU:日活跃用户数量。
SKU:库存量单位 纺织品中的一个SKU 表示为颜色、规格、款式之类的。
APA:活跃付费用户数。
DAOT:日均使用时长。
KOL:关键意见领袖,被定义为拥有更多更准确的产品信息,且为相关群体所接受或信任,并对该群体的购买行为有较大影响力的人。
PBP:回收期,即花出去的用户获取成本可以在多长时间内回本。
LTV:代表用户在整个生命周期内的贡献价值,可以记为ARPU*用户以月度计算平均生命周期。
LTV计算: 用户生命周期为 横坐标为天数 纵坐标为留存率(1,2,3,4,5,6,7,14,30)所围成的图形面积,在Excel中添加趋势线可得LT函数。再根据定积分求出一个月内的LT平均生命周期(单位:天数)。 再计算ARPU=总收入/总活跃用户 (以一个月为单位) 最后结果为LTV=ARPU*LT/31
SEO:指搜索引擎优化。全称为(Search Engine Optimization),是一种利用搜索引擎的规则提高网站在有关搜索引擎内自然排名的方式。
目的是让其在行业内占据领先地位,获得品牌收益。很大程度上是网站经营者的一种商业行为,将自己或自己公司的排名前移。
客单价:每个用户的付费。
1.2.1 客单价与ARPU的区别
- 客单价只计算付费的用户,ARPU包含未付费的用户。
- ARPU具有时间属性,客单价关注产品每个客户的平均消费水平。
- ARPU应用场景主要是游戏 APP 针对的更多是卖流量为主的产品,这类产品的收入并不一定是用户直接产生的。关注的是用户长期的行为带来的收入。
- 客单价应用电商,针对的是更多以卖产品为主的传统型产品,收入由用户直接消费而来。
1.2.2 同比和环比的区别
同比的意思是年的变化,2021年9月和2020年9月的对比叫做同比。
环比的意思是相邻两个数据(包括月和日)的变化,例如:2021年9月和2021年8月的对比叫做月环比,2021年8月12日和2021年8月13日的对比叫做日环比。
环比增长率=(本期数-上期数)/上期数*100% 反映本期比上期增长了多少。
同比增长率=(本期数-同期数)/同期数*100% 指和去年同期相比较的增长率。
同比发展速度,一般指是指本期发展水平与上年同期发展水平对比,而达到的相对发展速度。
环比发展速度,一般指是指报告期水平与前一时期水平之比,表明现象逐期的发展速度。
1.3 搭建指标体系的原因
总结起来主要是两点——目标管理和目标经营,即通过目标体系,可以把每个业务环节量化和透明化,方便了解目标与现状之间的差距,以及如何通过该这些信息。驱动业务的发展,达成目标组织。
1.4 搭建指标体系的作用
具体来说,主要作用有四点:
第一,统一公司口径。同一个指标在不同部门的口径定义是不一样的,如果每个部门各说各话,会产生误差从而影响效率。统一口径可以避免定义模糊和逻辑混乱,从而影响业务开展和数据质量。
第二,提升组织效率。指标体系可以帮助策略落地执行,及时反馈并评估策略和动作执行情况,还可以明确组织和部门的经营目标,让整体组织朝着同一个方向前进。
第三,了解业务现状。指标可以量化业务情况,清楚了解业务现状,定位问题及改善方向。
第四,科学决策业务。一个相对全面的数据指标体系,可以让管理层从数据层面对公司的发展有一个比较客观的认识,让每一次决策都有足够的数据支撑。
1.5 什么是一个好的指标体系
我们一般把好的指标体系分为四个层次:
第一层最简单,即可以描述现状,如果连现状都无法描述的话,它就不算一个指标体系。
第二层分析现状,即知道现状指标或业务因素哪里出了问题,帮助业务变化归因以及定位。
第三层预测未来,即能够帮助我们对业务未来做一些假设分析,制定策略,比如如何做才能让不好的指标变好,可以提出一些假设去预测未来。
第四层是改善未来,即能够帮助业务调整战略、策略,改善执行动作。比如基于过往的洞察,发展原来的策略在实际表现还不错,未来就可以朝着这个方向发展和努力。
1.6 指标体系的搭建
①首先找到第一指标。明确企业的第一目标,可以从三个维度进行考虑:
第一个是产品定位和核心价值:即解决用户的核心需求是什么?解决方法和核心转化路径是什么?盈利模式及当前痛点是什么?
第二是行业目前发展阶段,大致分为新兴期、成熟期、饱和期,不同时期的重要指标也不同。
第三是产品阶段,主要分为需求验证期、快速发展期、稳定期、没落期等。
②将第一指标拆解到各个部门,得到第二指标。
比如:GMV=购买人数 * 客单价= 访问人数 * 购买转化 * 笔单价 * 复购率=(新增用户 + 活跃老用户)* 商品详情页触达率 * 购买转化 * 笔单价 * 复购率。
③梳理业务流程,找到三级指标。
例如用户-用户-搜索商品-点击详情页-加入购物车-下单-支付,三级指标有人均访问次数、平均访问时长、新用户访问量、商品点击人数、商品支付人数、人均购买次数、人均购买单价等。
④通过报表监控指标,不断更新指标体系。
当业务运营中有新的场景产生、当发现指标落地后与实际场景不适配、当使用过程中指标数据出现偏差时,都需要进行调整和迭代。
1.7 指标异动分析
第一步:确认数据准确性。 首先确定数据是环比下降还是同比下降?下降了多少?标准是什么?数据是否存在SQL逻辑性错误?如果数据下降超过了这个标准并且没有SQL逻辑性错误,则进行下一步分析。
第二步:对比历史数据,计算同环比,判断数据是否是周期性、季节性变化。
第三步:拆分指标。
例如: GMV=订单均价*订单量
订单均价=下单商品单价*下单商品数量
订单量=订单量商品详情页的流量*购买转化率
第四步:拆分维度。
内部因素:新老用户、不同地区、不同渠道来源、商品类目、用户行为路径分析、产品方面(APP自身特点、功能变动)、技术方面(版本更迭)、运营方面(活动)
外部因素:pest(政治、社会、经济、科技)、竞品
面试真题: 假如某一天使用飞书视频的用户极剧下降,你应该如何分析?
第一步,向业务方确认数据的统计口径,极剧下降是下降百分之多少?是同比下降还是环比下降?数据是否存在SQL的取数逻辑错误?并且寻找一个标准来判断,这个标准可以是历史数据的标准,也可以是同行业的标准,根据标准来判断用户数量下降是否是一个问题,因为现状≠问题,现状+标准=问题。如果它是一个问题,那么进行下一步。
第二步,分析用户数量的历史数据,并计算同环比,确认数据是否存在周期性、季节性变化。
第三步,从用户维度分析。将用户分为新用户和老用户,如果是新用户数量下降了,那么是不是渠道引流做的不好,需要考虑是来自哪个渠道的新用户下降了?可以通过计算各个渠道新用户来源的影响系数,或者使用归因分析中的末次归因模型来分析渠道出现的问题。如果是老用户的数量下降了,那么可以根据用户最近一次登录时间、使用飞书视频的次数、性别、年龄、职业、地域,使用K-means聚类模型对用户分层分析,确定是哪一部分用户群体数量下降了。
第四步, 从产品方面分析,飞书这类办公软件主要是面向于TOB用户,也就是商业机构的用户,而TOC用户的数量比较少,所以一般来说飞书视频的用户数量大量减少的话,一般是因为一些规模较大的企业放弃使用飞书而转向于其他办公平台比如:teams或者钉钉。可以进行竞品分析,来比较飞书视频和其他办公软件的区别,当用户使用一次飞书视频时候,也可以向用户发放调查问卷,来深挖TOB用户流失的原因。
从运营角度分析,上个月是否举行过相关推广活动?或者本月是否开展过推广活动,假如推广效果不好,导致用户大量流失。竞品是否开展了推广活动?
从技术方面分析,最近是否发生过版本更迭,或者用户打开APP出现秒退或者卡顿?导致用户体验不佳造成流失。
第五步,pest宏观环境分析:
政治上,最近国家是否出台了不利于本产品相关政策?
社会上,疫情得到控制,线上办公的需求是否会减少?
科技上,自身产品的科技含量和质量水平,是否长时间没有提高?
指标异动分析是面试的常考的题目,答案都是有套路可言的。但是也需要形成自己的方法论,分析的时候,一定要将指标拆解正确并结合APP自身特点进行分析。
2.数据分析的流程
- 和业务方沟通,明确分析目标。
- 对目标进行拆解,明确可能在哪几个链路出现问题。
- 收集相关数据并处理加工,整合成我们需要的数据。
- 对数据进行分析和可视化,输出分析报告。
- 最终把分析报告呈现给业务方,沟通商讨解决方案。
3.对数据分析的理解
数据分析是通过数据发现业务的痛点,分析数据背后的原因并提出相应的策略,最终推动策略落地提升业务质量的过程。
4.为什么想做数据分析
①、对数据分析十分感兴趣,对自己未来的职业规划也是在数据分析这条路深耕,非常希望能够进入该行业。
②、有一定的专业水平,虽然专业并非与数据分析相关,但是为了走数据分析这条路也做了许多努力,自学了很多统计学和机器学习相关的理论知识,并且在实践实习中将在公众号和知乎等文章上学到的数据分析方法学以致用,并且对数据分析的工具掌握非常熟练,认为自己非常适合数据分析。
③、认为该行业十分有前景,未来是大数据时代,而数据分析能够让企业更明确未来的方向,是非常有发展前景的行业。
5.数据分析常用软件
取数和数据处理方面的工具:Python、MySQL、Hive、Excel、SPSS、R
数据可视化方面的工具:Tableau、FineBI、Echarts
6.常见分析方法和模型
SWOT 模型
优势(strength)劣势(weakness) 机会(opportunities) 威胁(threats)。
用来考量企业的内外部环境与自身战略是否匹配,帮助企业定位自己的优劣势,设计战略测量。
人货场模型
人货场,是指影响销售的三个重要因素
从人的角度来看,来自销售人员、顾客的因素,可以细致划分为内部员工和外部客户,分析各自的特征行为;
例如(员工的销售额 目标达成率 平均接待时间 投诉率) (新增会员 日活跃人数 点击转化率)
从货的角度,商品方面的因素。可以根据供应链的流程划分不同阶段,例如(订单量 退货率 收益率等)
从场的角度,可以考虑活卖场、门店、销售渠道的因素。(门店数量、渠道类型和数量等)
AARRR模型
AARRR模型是基于用户生命周期提出的模型,认为在用户增长中,最重要的五个指标是Acquisition(获取)、Activation(激活)、Retention(留存)、Revenue(收入)、Referral(自传播),这种增长模式也称为海盗模型。
第一阶段:用户获取。用户的获取的重点在于‘精准引流’,因此,在关注各个渠道推广引流数量的同时,更要关注流量的质量,用户是否为产品的目标用户。因此,可以考虑在公司内外部同时进行引流活动,内部引流包括提高 公司其他产品对本产品的资源位支持,提升相关推荐概率等等;外部引流比如粉丝流量池引流,应用市场广告推广引流等等。
第二阶段:用户激活。用户激活的重点在于‘让用户更快上手产品,产生重复使用的动力。‘常见的做法包括提供新人使用指南——比如为中老年人提供购物指导;采用水军策略——在产品前期投入虚拟用户,比如在游戏场景中投入机器人;
第三阶段:用户留存。为了防止用户来得快走得也快,提高用户粘性,关注留存非常重要。一般来说,内容/弹窗推荐是最常用的手段,如头条,优酷等APP时常出现在手机推荐栏;许多电商软件会通过每日签到送VIP或红包的形式激励用户登录。
第四阶段:用户变现。现阶段,互联网的变现方式集中在电商,广告,会员,周边等形式上。例如,广告变现是包括头条,微博在内的许多内容产品的主要盈利方式之一,广告竞价也是包括淘宝,拼多多在内的许多电商产品营收来源;不论是内容产品、 电商产品或游戏产品,都会推出VIP会员服务收取一定费用,也是一笔收益。
第五阶段:用户传播。要想用户主动传播产品,一方面需要保证产品本身的质量,另一方面要有快捷的传播手段。如今自传播的力量十分强大,但是错误的传播设计可能会弄巧成拙,包括捆绑下载,强制推广解锁功能等;16-17年的拼多多在微信的分享传播就是比较成功的案例,通过低价的产品链接迅速占领的三四线城市的微信群,获取了一大批用户。
pest分析
PEST分析是指宏观环境的分析,P是政治(politics),E是经济(economy),S是社会(society),T是技术(technology)。在分析一个企业集团所处的背景的时候,通常是通过这四个因素来进行分析企业集团所面临的状况。
5W2H法
(1) WHAT——是什么?目的是什么?做什么工作?
(2)WHY——为什么要做?可不可以不做?有没有替代方案?
(3)WHO——谁?由谁来做?
(4)WHEN——何时?什么时间做?什么时机最适宜?
(5) WHERE——何处?在哪里做?
(6)HOW ——怎么做?如何提高效率?如何实施?方法是什么?
(7) HOW MUCH——多少?做到什么程度?数量如何?质量水平如何?费用产出如何?
波特五力模型
波特五力模型,这五种力量综合起来影响着产业的吸引力以及现有企业的竞争战略决策。
- 同行业内现有竞争者的竞争力量
- 潜在竞争者进入的能力
- 替代品的威胁
- 供应商能力
- 购买者讨价还价能力
RFM模型
RFM模型通过一个客户的近期购买行为间隔(R)、购买的频率(F)以及购买金额(M)3项指标来描述该客户的价值状况。
最近消费时间间隔R | 购买频率F | 购买金额M | 客户类型 |
---|---|---|---|
1 | 1 | 1 | 重要价值用户 |
0 | 1 | 1 | 重要保持用户 |
1 | 0 | 1 | 重要发展用户 |
0 | 0 | 1 | 重要挽留用户 |
1 | 0 | 1 | 一般价值用户 |
0 | 1 | 0 | 一般保持用户 |
1 | 0 | 0 | 一般发展用户 |
0 | 0 | 0 | 一般挽留用户 |
注:以上表格消费时间间隔越小R越大,购买金额和购买频率均是数字越大F或M越大,1代表高,0代表低,不同RFM模型的区别在于阈值的划分,或者维度的划分。这些都是需要人为手动确定的。比如:阈值达到多少,超过这个阈值的时候为高?维度也可以不只是三维,二维也可以,比如只计算R和F,分四类用户。
PLC模型
PLC模型,指产品的市场寿命,即一种产品从开始进入市场到被市场淘汰的整个过程。产品的生命周期有探索期、成长期、成熟期、衰退期(迭代期)。
OSM模型
OSM 模型,是指标体系建设过程中辅助确定核心的重要方法,包含objective业务目标、stragegy业务策略、measurement业务度量,是指标内容横向的思考。
漏斗分析
漏斗分析是一套流程式数据分析,它能够科学反映用户行为状态以及从起点到终点各阶段用户转化率情况的重要分析模型。
例如: 在一款产品服务平台中,直播用户从激活APP开始到花费,一般的用户购物路径为激活APP、注册账号、进入直播间、互动行为、礼物花费五大阶段,漏斗能够展现出各个阶段的转化率,通过漏斗各环节相关数据的比较,能够直观地发现和说明问题所在,从而找到优化方向。
归因分析
归因分析是针对当前场景和目标,怎么把“贡献”合理分配到每一个坑位上。作用就是提升运营转化与收入增长,主要用于广告投放的效果评估上。 常见的归因模型
末次归因模型:将功劳100%分配给转化前的最后一个渠道。
优点:他是最容易测量的归因模型,在分析方面不容易发生错误。大部分追踪的cookie存活期只有30-90天,对于顾客的行为路径、周期比较长的场景,做归因分析时可能就会发生数据丢失,而对于末次归因模型,这个数据跟着周期就不是特别重要了。
缺点:比如客户从收藏夹进入商品详细页然后成交,按照模型就会100%的功劳归功于收藏夹。但真实的用户行为路径更接近于产生兴趣、购买意向等环节,这都是其他渠道的功劳。无法从这个模型中统计出来。末次渠道的功劳会大幅度被高估。
适用场景:短期的投放,转化路径少、周期性短的业务快速提升效果,按照末次归因模型,能比较好了解到底是哪个渠道对于最终的转化有比较好的效果。
首次归因模型:将功劳100%分配给第一个触达的渠道。
优点:是一种比较容易实施的单触点模型,初次点击的归因会你明确潜在消费者是怎样找到你的,且和最后点击一样,不需要大量数据。
缺点:受限于数据跟踪周期,对于用户路径长、周期长的用户行为可能无法采集真正的首次行为,且初次点击归因并不能够解释所有后续所发生的用户行为,对后续的用户行为没有关注。
适用场景:一般是需要拉新的时候,公司处于市场开拓的时候,这个时候我们关系把更多的用户先圈过来,那么用首次互动模型可以看出来哪些渠道对于业务拉新最高效。所以首次归因模型对于没什么品牌知名度、且重点在市场拓展,渠道优化的公司,比较适用。
线性归因模型,他将功劳平均分配给用户路径中的每一个触点。
优点:它是一个多触点归因模型,可以将功劳划分给业务路径中每个不同阶段的营销渠道,不用考虑不同渠道的价值权重。计算方法比较简单。
缺点:很明显,线性平均划分的方法不适用于某些渠道价值特别突出的业务,因为这种渠道是靠质量而不是数量赢得结果的。比如一个客户,从线下某处看到了广告,回家后使用百度搜索,连续三天都通过百度进入了官网,并在第四天成交。那么按照线性归因模型,百度会分配到75%的权重,而线下某处的广告得到了25%的权重,显然并没有给到线下广告足够的权重。
适用场景:根据线性归因模型的特点,它更适用于企业期望在整个销售周期内保持与客户的关系,并维持品牌认知度的公司。在这种情况下,各个渠道在客户的考虑过程中,都起到相同的促进作用。
时间衰减归因模型:对于路径上的渠道,距离转化的时间越短的渠道,可以获得越多的功劳权重。
优点:这个模型考虑了时间的作用,因为一般情况下也是时间越久对于用户的转化作用越弱。相比线性归因模型的平均权重的方式,时间衰减模型让不同的渠道有不同的权重分配。在“触点离转化越近,对转化影响力越大”的前提是准确的情况下,这种模型是相对比较合理的。
缺点:如果有的渠道天然处于转化链路的起点,那么对于这些渠道是不公正的,因为他们总是距离转化最远的那个,永远不会得到一个公平的权重。
使用场景:和末次归因比较类似,适用于客户决策周期短、销售周期短、引导用户完成转化的场景的情况。比如,做短期的促销,就打了两天的广告,那么这两天的广告理应获得更高的权重。
位置归因模型:它综合了首次归因、末次归因、线性归因他将第一次和最后一次触点各贡献40%,中间的所有触点平均剩下的20%贡献。
优点:非常适合那些十分重视线索来源和促成销售渠道的公司。
缺点:它不会考虑线索转化之后的触点的营销效果,这也使得它成为销售线索报告或者只有销售线索阶段目标的营销组织的理想归因模型。
7.游戏类数据分析
游戏类别缩写以及中文名
简称 | 全称 | 中文名 |
---|---|---|
RPG | Role Playing Game | 角色扮演游戏 |
RPSG | Role Playing Simulation Game | 角色扮演模拟游戏 |
SRPG | Strategy Role Playing Game | 策略角色扮演游戏 |
ARPG | Action Role Playing Game | 动作角色扮演游戏 |
AVG | Adventure Game | 冒险游戏 |
SLG | Simulation Game | 策略游戏 |
RTS | Real-Time Strategy Game | 即时战略游戏 |
FTG | Fighting Game | 格斗游戏 |
STG | Shooting Game | 射击类游戏 |
FPS | First Personal Shooting Game | 第一人称视角射击游戏 |
PZL | Puzzle Game | 益智类游戏 |
MMORPG | Massive Multiplayer Online Role Playing Game | 大型多人在线角色扮演游戏 |
SIM | Simulation Game | 模拟经营类游戏 |
CAG | Card Game | 卡牌类游戏 |
游戏类面笔试真题
我们将一款游戏的生命周期分为成长期、成熟期(稳定期)、衰退期。
1)分别阐述一下这三个时期新增账号数、活跃账号数、收入这三类指标的特征分别是什么(不限这3个指标,也可补充其他指标)。
2)选取你熟悉的一款游戏,分别阐述一下,这三个时期,产品分析的关注点有什么不同(即每个时期应重点关注的内容,每个时期至少列举2个,如果可以,请在每个关注点后配置对应的关注指标)。
(1)
成长期 新增账号数、活跃账号数、收入迅速增长
成熟期 新增账号数增速放缓、活跃账号数与收入稳定增长
衰退期 新增账号数、活跃账号数、收入持续减少
(2)
穿越火线
成长期:需要多关注用户反馈情况,及时改善游戏版本问题,提高用户体验;关注新用户的来源渠道的质量,便于后期计算ROI的时候统计获客成本。
成熟期:关注用户留存率以及活跃用户数量dau、mau,反应产品的用户粘性;关注各类用户消费情况ARPU,为不同类型用户,个性化推荐游戏道具。
衰退期:注重游戏内容质量以及拉新活动,挽留老用户;关注竞品和市场情况,考虑是否需要转型或者开发新游戏(开发新游戏穿越火线HD)。
8.风控类数据分析
风控
风控是指通过各种方法及措施来控制风险,减少损失发生的可能性,提升交易成功率。
风控主要分为2大方向: 信用风控(打分,芝麻分之类)比如银行评分卡;
反舞弊风控(很多黑产活跃在互联网上,你就要通过风控和坏人做对抗;这个对抗不能只停留在防御上,更多的要站在坏人的角度去思索他们是怎么欺诈的,怎么获取利益的)比如识别薅羊毛用户
风险行为的定义:
账户安全问题:盗卡,盗余额支付
商家刷单:刷排名,刷销量,刷好评
用户作弊:”薅羊毛“,也就是获取一些优惠卷(通过反复注册新用户等行为)
评分卡模型
评分卡的定义(信贷场景中)
- 以分数的形式来衡量风险几率的一种手段
- 对未来一段时间内违约/逾期/失联概率的预测
- 通常评分越高越安全
- 根据使用场景分为申请评分卡 A卡、行为评分卡 B卡、催收评分卡 C卡、反欺诈评分卡 F卡(F卡不常用)
评分卡的目的和意义
目的:通过对借款人信用历史记录和业务活动记录的深度数据挖掘、分析和提炼,发现蕴藏在纷繁复杂数据中、反映消费者风险特征和预期信贷表现的知识和规律,并通过评分的方式总结出来,作为管理决策的科学依据。
意义:相比于人工审批更加的客观、一致、准确,同时能够量化用户的风险程度,并且很大程度地提高审批效率(评分卡是在系统中自动实施的)。
评分卡模型主要包括:申请评分卡(A卡)、行为评分卡(B卡)、催收评分卡(C卡)和反欺诈评分卡(F卡)。
申请评分卡(A卡)和反欺诈评分卡(F卡)在贷款审批阶段也就是贷前阶段;行为评分卡(B卡)属于贷后管理阶段;催收评分卡(C卡)属于催款阶段。四类卡存在于贷前、贷中、贷后三个不同阶段。
A卡(Application score card)。目的在于预测申请时(申请信用卡、申请贷款)对申请人进行量化评估。
B卡(Behavior score card)。目的在于预测使用时点(获得贷款、信用卡的使用期间)未来一定时间内逾期的概率。
C卡(Collection score card)。用于催收管理,在借款人当前状态为逾期的情况下,预测未来该笔贷款变为坏账的概率。
F卡 (Anti fraud Score Card) 。用于对业务中的新用户可能存在的欺诈行为进行预测。所谓“欺诈行为”,指的是该用户申请借款,就没想着还钱,就是奔着占便宜来的,这部分用户往往伴随着“多头共债”的现象,即该用户在多个平台都有借款逾期不还的记录。所以这部分低信用人群应该是首先要拒绝的,因为放款给这些人意味着直接损失、没有任何回报。
评分卡的构建过程:
- 数据分析:基于实际业务场景理解数据内容,发现数据与研究问题的关系。
- 数据处理:对原始数据进行处理,包括不同数据源间的数据合并、数据规整化处理、缺失值处理等环节。
- 特征选择:利用特征选择方法,筛选出预测能力强的有效特征,合理降低特征总维度。
- 特征分箱:对特征自变量进行离散化分箱处理。
- WOE转换:特征分箱处理后,将变量进行WOE编码转换。
- 模型建立:结合样本数据建立模型及模型参数输出过程。
- 模型评估:利用评估指标对模型效果进行评价。
- 评分转换:将模型概率转换为直观评分以及生成评分卡。
- 验证上线:验证评分卡效果,并上线持续监测。
评分卡的优点:
易于使用。业务人员在操作时,只需要按照评分卡每样打分然后算个总分就能操作,不需要接受太多专业训练。
直观透明。客户和审核人员都能知道看到结果,以及结果是如何产生的。
应用范围广。我们最熟悉的,莫过于支付宝的芝麻信用分,又或者知乎盐值(虽然知乎盐值不是评估金融风险的,但也算是评分卡的应用之一)
评分卡的缺点:
简单是优点,但在日益增长的数据前,就变成缺点。有着大量数据资源却使用有限,造成数据资源的浪费。
当信息维度高时,评分卡建模会变得非常困难。
某些特征在不同时期的重要性不同,而评分卡并没有关注到这些。例如在疫情期间,和收入相关的特征重要度会上升。
为什么要用逻辑回归做评分卡,而不用XGBOOST或者神经网络呢?
- 模型直观,可解释性强,易于理解,变量系数可以与业内知识做交叉验证,更容易让人信服。
- 易于发现问题。当模型效果衰减的时候,logistic模型能更好的查找原因。
分箱
分箱是对特征变量进行区间划分或者对不同枚举值进行合并的过程,它可以降低特征的复杂度,提升变量可解释性。
分箱有两个功能,第一个是拆分,对 “连续变量” 进行分段离散化,使它变成 “离散变量”。比如:年龄、月收入。拆分分为等频拆分、等距拆分、信息熵分箱。举个例子,将年龄分为20岁以下,20岁至30岁,30岁以上三个区间。第二个是合并,合并的目的是减少离散变量的状态数,对 “离散变量” 进行合并。比如:城市、学历。举个例子:全国的城市有很多个,可以大致合并为一线城市、二线城市、三线城市...十八线城市。
每个变量的分箱数,控制在十个以下,通常 5个左右是最佳的;每个箱子里的样本数至少为总样本数的5%以上,每个箱子里都要有正负样本,同时坏样本率与箱子呈单调关系。分箱越多,模型过拟合的风险越高,模型的稳定性也会变差,在金融场景,风险可控与稳定至关重要。
分箱的优缺点:
优点:比如连续变量分箱、离散变量合并,会 “降低特征变量的复杂度,降低模型过拟合的风险”(因为特征中值的数量变少了,每个取值的样本量增多,也就是说方差会相比于分箱前变小,而偏差会变大);可以 “增强模型的稳定性”,对特征变量的异常波动不会反应太大,也利于适应更广泛的客群;将特征变量划分为有限的分箱,可以 “增强模型的可解释性”;可以更自然地将 “缺失值作为单独的分箱”。
缺点:分箱后丢失了数据的细节信息,使模型对好坏样本的判别能力变弱了,模型的KS和AUC相比于分箱会下降。
卡方分箱
原理
它以卡方分布和卡方值为基础,判断某个因素是否会影响目标变量。例如,在检验性别是否会影响违约概率时,可以用卡方检验来判断。
卡方检验的无效假设H0是:观察频数与期望频数没有差别,即该因素不会影响到目标变量。基于该假设计算出χ2值,它表示观察值与理论值之间的偏离程度。根据χ2分布及自由度可以确定在H0假设成立的情况下获得当前统计量及更极端情况的概率P。如果P值很小,说明观察值与理论值偏离程度太大,应当拒绝无效假设,表示比较资料之间有显著差异;否则就不能拒绝无效假设,尚不能认为样本所代表的实际情况和理论假设有差别。
步骤
- 将数值变量A排序后分成区间较多的若干组,设为A_1,A_2,…,A_n(如果变量取值超过一百种可以采用等距的方法划分100箱)
- 计算A_1 与A_2合并后的卡方值,A_2 与A_3合并后的卡方值,直至A_(n-1) 与A_n合并后的卡方值
- 找出上一步所有合并后的卡方值中最小的一个,假设为A_(i-1) 与A_i,将其合并形成新的A_(i-1)
- 不断重复2和3,直至满足终止条件
终止条件
- 某次合并后,最小的卡方值的p值超过0.9(或0.95,0.99等)[卡方值越大,P值越小,相关性越强,对Y的解释性越好]
- 某侧合并后,总的未合并的区间数达到指定的数目(例如5,10,15等)
KS值
KS指标倾向于从概率角度衡量正负样本分布之间的差异。正是因为正负样本之间的模糊性和连续性,所以KS也是一条连续曲线。但最终为什么取一个最大值,主要原因是提取KS曲线中的一个显著特征,从而便于相互比较。召回率与假阳率的差值的最大值为特征的KS值,也就是累计正样本率大于累计负样本率的最大值,因为我们想抓到更多的坏人,也就是提高召回率,减少抓错的好人,减低假阳率。
KS值范围为(0-1),一般选取0.2-0.75的特征,>0.75说明特征可能不可靠或者有误。KS值不仅能够评价模型的区分能力,也能够评价单个特征的区分能力,前提是特征是有序且是线性的。
KS值计算步骤
- 计算每个评分区间的好坏账户数。
- 计算每个评分区间的累计好账户数占总好账户数比率(good%)和累计坏账户数占总坏账户数比率(bad%)。
- 计算每个评分区间累计坏账户占比与累计好账户占比差的绝对值(累计good%-累计bad%),然后对这些绝对值取最大值即得此评分卡的KS值。
KS曲线横坐标是评分区间或者是数据集百分比,纵坐标是假阳率和召回率,特征的ks=max|TPR-FPR|,对应下图红色曲线的最高点。其中召回率曲线(绿色曲线)在假阳率曲线(紫色曲线)上方。
PSI值
PSI (Population Stability Index)称为群体稳定性指标,用来 “对比2个数据集的分布,是否发生比较大的偏差”,对比一定要有参照物,对评分卡模型来说,参照物是模型训练时的 “训练样本” (期望分布),而评估对象称为 “验证样本”(实际分布)。
psi = sum((实际占比-预期占比)* ln(实际占比/预期占比) )
PSI 可从两个计算维度来看,即评分 PSI和特征变量 PSI。PSI越小代表模型越稳定,一般认为PSI小于0.1时候模型稳定性很高,0.1-0.25代表模型良好,需要检测变化的原因,大于0.25代表模型稳定性差,需要进一步分析特征变量,或者迭代模型。
应用场景
可以对 “入模的每个特征变量” 进行分箱,在验证集与训练集上做PSI对比,判断样本是否发生大的变化。PSI也可以做跨期验证。确保 “评分值、每个特征变量”,在近N个月的验证集上,对比训练集计算出的PSI,在可接受的范围内。
WOE与IV值
WOE= ln [( 坏样本 / 总坏样本 )/( 好样本 / 总好样本 )]= ln [( 坏样本 / 好样本 )/( 总坏样本 / 总好样本 )]
组内坏样本数量与总坏样本数量的比值与组内好样本数数量与总好样本数量的比值的差异,这个差异是两个比值的比值。
IVi=[( 坏样本 / 总坏样本 )-( 好样本 / 总好样本 )]*WOE
IV=所有IVi的求和IV值是woe值的加权求和。主要是消除各分组中数量差异带来的误差(消除分组样本分布不均匀带来的影响)。
组内响应比例越高(负样本占组内样本比例)WOE越大,所以要消除分组数量差异带来的影响。
当组内无负样本的时候,woe=负无穷、iv对应正无穷。当组内无正样本数是woe对应正无穷、iv对应负无穷,不管iv等于正无穷还是负无穷都是无意义的。这也是IV的一个缺点,不能自动处理变量的分组中出现响应比例为0或者100%的情况,IV值小于0.02代表无预测能力 一般0.02-0.1低,0.1-0.3中,0.3-0.5高,大于等于0.5代表可疑 一般我们选取0.2到0.5的特征,也就是预测能力中到预测能力高的特征。
为什么要进行WOE编码?
因为WOE表示的是当前分箱中好坏客户的比例与总体好坏客户比例的差异,WOE的绝对值越大,这种差异就越明显,契合风控场景。
优点:
- 通过WOE编码可以对自变量X进行转换,使编码后的变量与因变量Y呈单调关系(是因为WOE编码后再通过逻辑回归拟合可以很好地契合评分卡公式)。
- 对于稀疏变量,可以通过分箱将稀疏的值聚集到较大的组别,并最终可以使用 WOE 来表示整个组别的信息。提高模型的解释性。
- 编码后特征的取值变少,在训练模型时能更快的收敛,提高了训练速度。
- woe化之后可以计算每个特征的IV值,用来筛选特征。
缺点:
由于最终分箱数量较少,会导致一定的信息丢失。
未考虑自变量之间的相关性,即没有特征交互。
计算过程利用了Y标签信息,因此存在特征穿越风险。
特征穿越:也可以叫做数据泄露,由于样本划分的策略,导致测试集中的信息引入到了训练集中,导致评估结果会更偏爱过拟合的模型,从而导致评估结果不够准确。
黑产
黑色产业链,简称黑产,是指利用互联网技术实施网络攻击、窃取信息、勒索诈骗、***钱财、推广黄赌毒等网络违法行为,以及为这些行为提供工具、资源、平台等准备和非法获利变现的渠道与环节。
网络账号恶意注册
不以正当使用为目的,使用虚假或者非法使用的身份信息以人工和自动工具结合方式绕过企业风控实施网络账号批量注册。黑产团伙利用这些网络账号开展网络诈骗、抢票屯号、刷单、恶意抢券、虚假流量营销等活动。
在线***平台
当前,地下赌场已经迅速完成互联网“转型”,制作团队专门负责快速开发赌博游戏APP;运维团队大量租用境外服务器保证赌博游戏持续在线;资金团队在境内开设大量空壳公司和金融账户收取并转移赌资;营销团队雇佣黑客入侵正规网站植入赌博暗链。
违规广告
为色情、***、***等违法网站提供广告投放服务,一旦用户点击广告,就会跳转到这些违法网站上,如果用户继续使用这些网站或从网站下载软件,可能会遭遇植入木马、网络诈骗等侵害行为。
移动应用APP
一些移动应用(APP)伪装成正常的工具、游戏等,甚至冒充其他知名App,但其中却潜藏恶意程序模块,能够在用户不知情的情况下进行恶意扣费、窃取个人敏感信息、破坏手机系统等行为。
DDOS攻击
黑客通过控制大量感染木马的电脑主机向特定网站或服务发起访问,从而导致网站或服务因超负荷运转而崩溃停机,给网站或服务所有者带来损失,原本常见于同行之间的恶性竞争,但目前在互联网上公然叫卖。
仿冒钓鱼诈骗
仿冒钓鱼网站和App冒充银行、金融机构、政府机关等。近年来,还出现钓鱼聊天软件的案例,向注册用户主动“搭讪”,诱骗用户进行充值、转账、送礼等行为。
非法网络金融平台
包括非法贷款网站、无牌照开展支付业务、非法虚拟货币平台等多种类型,无牌照支付平台主要为为网络黑色产业链提供支付服务,非法贷款网站和非法虚拟货币平台则直接以高收入回报为诱饵骗取用户资金。
数据非法售卖
通过黑客攻击、“内鬼” 泄露等方式获取用户个人信息等数据,并在“暗网”交易平台、黑产交流群组等渠道非法售卖,尤其受到恶意营销、网络欺诈、金融骗贷等违法违规业务的青睐。
风控类面笔试题
1.如何识别薅羊毛?
第一步,发现一个具有明显特征的一个人或者一个设备。比如:发现数据异常增高的无理由流量,或者在内容平台,重复发送垃圾广告,又或者收到其他用户的举报。
第二步,分析这个人或者这个设备的行为。比如:刷渠道量,播放量、阅读量这些指标,这种类型的人一般如果是在刷播放量,那么他就会一直在观看视频,很难产生其他行为,又或者是平台有新用户返现红包,可能会存在大量新用户来平台,直接进入套现流程,没有后续行为。
第三步,观察它的特征,识别是人还是机器在刷。如果是机器在刷的话,可以根据设备信息、所处的地理位置、手机传感器的数据,来识别是否是机器,如果是机器的话,它们一般会写好的一套程序——从哪进来、几秒钟后干什么等操作。如果是人在刷的话,一般来说,他们不会在一个平台上停留太多时间,一气呵成所有步骤,比如说:第一步首页,第二步某商品详情页,第三步直接购买,第四步购买成功。这种行为序列是高度一致的,可以通过观察这些用户的行为进行分析判断。
第四步,观察不同维度的特征。比如:根据新老用户划分,一个新主播突然多了成千上万个新用户关注、打赏,而老用户占比极少,而且都是用红包打赏的。分析发现,新用户注册后会得到一个红包,只能用来打赏主播或者购物,不能直接提现。因此就出现了这样一种情况,羊毛党让自己的一个同伙去直播,其他的同伙去打赏,把所有的新用户的红包打赏给这个同伙主播,然后再变现。又比如:我们发现新用户留存率存在异常,通过划分渠道,发现某个渠道的新用户相较于其他渠道留存率较低。就可能存在这种情况,这种类型的用户是来薅羊毛,薅了就跑的,他们基本上就是只使用核心业务流程(购买),而不使用非核心业务流程,比如(查看帮助页面,或者点进活动规则),这些用户就是有问题的群体。
第五步,解决薅羊毛问题。比如:直接封号,不让其买东西、发表内容或者提现,也可以定向屏蔽,让他看不出来自己被屏蔽了。也可以通过改变规则,提高成本,比如:新注册的用户过七天才能发帖,邀请新用户领现金改成领实物或者虚拟物品。当然也可以不做处理,如果投入处理的成本大于把他们处理后的收益,那就不处理了。
2.当一个人在注册和使用一款信用贷款产品的时候,如何识别这个人是他本人,而不是这个人冒用了其他人的身份呢?
一般来说当用户注册和使用一款贷款产品的时候,信用贷产品会采用以下几种方式识别用户的身份:
①人脸识别认证:用户通过摄像头在线验证自己的人脸,然后通过人脸识别技术,引导用户进行眨眼等动作来确定活体检测,再与身份证照片进行实时对比判断。
②OCR身份识别:用户上传身份证正反面图片,根据OCR识别信息进行身份验证,这种方式可以简化实名操作,并且可以进行一定的图像风险和质量检测。
③实名绑卡认证:用户输入银行卡号、姓名、身份证号等信息,然后调用第三方支付公司的接口进行银行卡鉴权认证。
3.假设一个人不在黑名单内,如何判断这个人与黑名单中某个用户存在关系?
在信贷行业中,判断某个用户与黑名单中某个用户存在关联,有三种方法,分别是名单库筛选、专家策略、机器学习等。
①名单库筛选是通过平台内部或合作机构获取的黑白名单,对申请贷款的用户进行过滤,避免重复欺诈行为的发生。如果一个人不在黑名单内,但是他的身份信息、联系方式、设备指纹等与黑名单中的用户有重合或者相似,那么就有可能存在关系。
②专家策略是基于策略人员的经验和欺诈者的行为心理制定的一系列规则,对申请贷款的用户进行欺诈识别。举一些例子:
客户的行为异常检测策略:通过分析客户的操作行为,如申请频率、申请时间、申请渠道等,判断客户与黑名单用户中的用户有重合或者相似。
设备异常策略:通过分析客户的设备指纹,如设备型号、设备ID、IP地址等,判断客户与黑名单用户中的用户有重合或者相似。
客户的身份异常检测策略:通过分析客户的身份信息,如手机号归属地、银行卡归属地、身份证信息、通讯录、通话记录等,判断客户与黑名单用户中的用户有重合或者相似。
③机器学习是通过收集客户各个维度的数据,结合当前用户特征,与欺诈建立起关联关系,实时识别用户欺诈行为。机器学习分为有监督和无监督两种,有监督机器学习是通过大量客户的历史数据进行标签化,并利用相关机器学习算法提取特征,发现欺诈行为的共同点。无监督机器学习是通过对用户的各维度数据特征进行聚类,找出与大多数用户和行为差异较大的用户和操作请求。如果一个人不在黑名单内,但是他的数据特征与欺诈群体或团伙欺诈有较高的相似度或关联度,那么就可能存在关系。
数据分析笔面试题
某电商平台针对合作商家提供了一个广告产品,商家购买该广告位后,其产品可以在平台优先展示,展示位平台可调整,用户每点击一次计费一次,为了防止用户恶意点击,会有一套复杂的反作弊机制,过滤无效点击,只对有效点击收费,另外,平台不定时会以优惠券或者折扣形式拉动广告售卖。最近一周,平台发现该广告产品收入出现了下降,请问可能的原因有哪些?用什么指标来衡量?
1.该电商平台用户访问下降,指标:平台访问用户数,查看商品次数;
2.平台调整了广告位,从热门位置调到了相对冷门的位置,指标:不同位置产生的计费涨跌幅对比;
3.平台升级了反作弊规则,导致过滤了更多点击,指标:过滤的无效点击占比;
4.购买广告的客户下降,指标:购买广告的客户,购买的广告位数;
5.平台发放了很多优惠券或做了折扣,抵消了收入,指标:优惠券/折扣抵消收入占比;
6.点击广告的用户下降。指标:点击广告的用户数、广告点击量、环比点击率。
常用的数据分析图表手段和适用场景有哪些?
- 柱状图,适用场景:适用场合是二维数据集,用于比较一段时间内的数据变化。
- 条形图,适用场景:显示各个项目之间的比较情况。
- 折线图,适用场景: 折线图适合二维的大数据集,还适合多个二维数据集的比较,反应出数据变化的趋势。
- 饼图/环图,适用场景:显示各项的大小与各项总和的比例,明确显示数据的比例情况。
- 雷达图,适用场景:雷达图适用于多维数据(四维以上),且每个维度必须可以排序,数据点一般6个左右,太多的话辨别起来有困难。主要用来了解公司各项数据指标的变动情形及其好坏趋向。
- 漏斗图,适用场景:漏斗图适用于业务流程多的流程分析,显示各流程的转化率。
- 词云图,适用场景: 显示词频,可以用来做一些用户画像、用户标签的工作。
- 散点图,适用场景:显示若干数据系列中各数值之间的关系,类似XY轴,判断两变量之间是否存在某种关联。
- 桑基图,适用场景:它是一种特定类型的流程图,图中延伸的分支的宽度对应数据流量的大小,比较适用于用户流量等数据的可视化分析。
- 行政地图,使用场景:适用于有空间位置的数据分析。
你认为一个数据分析师在分析一个新的业务数据时,应该注意哪些地方,或者重点关注哪些地方?
1.明确数据来源以及数据口径是否符合我们所希望的。公司可能会存在多种数据库存储数据,因此数据间可能会存在细微的差异,做分析前应该了解清楚数据具体的来源以及口径。
2.检查和清理异常数据,同时也需要注意数据的时效性。如果所拿到的数据是不正确或者‘过期’的数据,那么将会影响后期的分析结果。
3.注意样本的分布情况以及数据间的相关性,这样能够更好地帮助我们了解到数据中蕴藏的信息。
4.选择合适的工具进行分析建模。没有最好的工具,只有最合适的工具,常用的数据分析工具有Excel、python、tableau、finebi、spss、R等。
数据分析小项目
分享一下之前做过的一个小项目,虽然这项目有点‘烂大街’,但作为入门和学习还是挺有帮助的。
京东用户行为分析
项目介绍:本项目对京东用户行为数据展开分析,研究用户行为过程中的行为特点、购物偏好,为运营决策提供支持建议。数据来源京东数据挖掘竞赛,共750万条左右,特征有用户ID、事件编号、用户行为、商品ID、日期。
分析过程:
- 用户整体行为分析:使用Python进行数据处理,构建数据分析指标浏览量、访客数等,探索指标与时间之间的联系。
- 用户购买流程分析:对四种不同的转化方式绘制漏斗图,展现各个阶段的转化率,从而找到优化方向。
- 用户留存分析:计算用户次日、周、半月留存率并可视化,反应产品的用户粘性。
- 用户价值分析:基于RFM模型和K-means聚类算法对用户价值细分,对价值模型可视化,分析各类用户占比情况。
- 用户购物篮分析:使用apriori关联规则算法,挖掘组成强关联规则的商品,探究商品与商品之间的内在联系。
项目成果:汇总以上分析结果,并提供相应的策略支持,输出数据分析报告PPT。分析报告链接
数据库
1.SQL基础
左连接:返回包括左表中的所有记录和右表中联结字段相等的记录;
右连接:返回包括右表中的所有记录和左表中联结字段相等的记录;
全连接:返回两个连接表的所有记录;mysql没有全连接
内连接:返回两个连接表连接字段相同的记录;
union:对两个结果集进行并集,并去重,当交换两个select语句顺序后,最终结果与不交换时无区别;
union all:对两个结果集进行并集,不去重,当交换两个select语句顺序后,最终结果与不交换时有区别;
插入数据
语法:
insert into table_name(列名,列名,列名) values( , , ,) #向表中插入某些列数据
insert into table_name values( , , , )#向表中插入所有列数据
例子:
insert into Student values('15450134','3','男');
更新数据:
语法:
update 表名 set 字段名=值,字段名=值;
update 表名 set 字段名=值,字段名=值 where 条件;
例子:
update table1 set age=10 where id>2;
删除数据:
语法:
delete from 表名 [where 条件];
例子:
delete from t_user where id=1;
修改表名:
语法:
rename table 表名 to 新表名
例子:
rename table table1 to table2
修改表中的属性:
语法:
alter table 表名 modify 列名 类型(长度) 约束;
例子:
alter table S modify Sname varchar(50) not null;
给已有表添加列:
语法:
alter table 表名 add 列名 类型(长度) 约束;
例子:
alter table S add Sage smallint;
真题:如何通过左连接和右连接实现全连接和内连接?
(SELECT * from a left JOIN b on a.id=b.id) UNION (SELECT * from a RIGHT JOIN b on a.id=b.id );实现全连接
实现内连接有两种方式
select * from a left join b on a.id=b.id where b.id is not null
select * from a right join b on a.id=b.id where a.id is not null
真题:SQL的执行顺序是什么?on和join谁先执行,为什么?on和where的区别?
执行顺序:from→on→join→where→group by→having→select→distinct→order by→limit
为什么on在join前面执行?因为要先经过筛选,才能通过连接把外部行加进来。
on和where的区别:on筛选之后,可以通过外连接把移除的行再次添加进来,而where是最终过滤的作用。
举个例子 有一个学生表 班级 姓名 一个成绩表 姓名 成绩 我们需要返回X班的所有学生的成绩,但是班上有人缺考,也就是成绩表里没有姓名,我们先用on得到的就是有考试成绩的名字,通过外连接,我们就可以得到全班人的名字以及成绩。
真题:a表有80条记录,b表有100条记录。这两个表做内连接之后,记录会超过100条吗?
记录的数量取决于两个表中连接字段的匹配情况。如果a表和b表的连接字段都没有重复的情况下,记录不会超过80条。如果a表或b表的连接字段有重复的情况下,记录可能会超过100条,但最多不会超过8000条。
2.SQL窗口函数
窗口函数作用:将数据分成多个窗口,每个窗口包含多行数据,保持表中行数不变,对每个窗口进行排序或者聚合。就是不改变表中行的数量的前提下,对表进行局部排序、聚合等其他操作。
窗口函数可以大体分为两大类,第一类是能够作为窗口函数的聚合函数:SUM、AVG、COUNT、MAX、MIN,第二类是RANK、DENSE_RANK、ROW_NUMBER、lead、lag的序列函数。
window_function over (partition by 用于分区的字段名 order by 用于排序的字段名),注意:需要根据实际情况考虑是否需要加partition by。
第一类的例子:
SELECT 学生,科目,分数,
SUM(分数) OVER (PARTITION BY 学生) AS '总分'
FROM Marks;
第二类例子:
SELECT 学生,科目,分数
,ROW_NUMBER() OVER (PARTITION BY 科目 ORDER BY 分数 DESC) AS "Row_Number"
,RANK() OVER (PARTITION BY 科目 ORDER BY 分数 DESC) AS 'Rank'
,DENSE_RANK() OVER (PARTITION BY 科目 ORDER BY 分数 DESC) AS "Dense_Rank"
FROM Marks;
rank、dense_rank、row_number的区别
当第一名和第二名相同时:
rank 为跳跃排序 例如1,1,3
dense_rank为连续排序 例如1,1,2
row_number为直接排序,例如1,2,3
3.SQL笔、面试题
已知表user,字段id,date,求新用户的次日留存率
select a.date,count(distinct b.id)/count(distinct a.id) rate
from (select id,min(date) date from user group by id) a#求出用户的第一次登录时间
left join user b on a.id=b.id and datediff(b.date,a.date)=1
group by a.date
解析:首先需要找到每一个新用户的登录时间,与第二天进行对比,distinct是为了排除用户同一天多次登录的情况。(本题未考虑新增用户为0的情况,实际需不需要考虑由具体情况定)
已知表user,字段id,date,求每个日期新用户的次日留存率
select c.date,ifnull(d.rate,0) rate from
(select distinct(date) date from user) c
left join
(select a.date,count(distinct b.id)/count(distinct a.id) rate
from (select id,min(date) date from user group by id) a#求出用户的第一次登录时间
left join user b on a.id=b.id and datediff(b.date,a.date)=1
group by a.date) d
on c.date=d.date
解析:d表内容和上一题一样,但我们需要考虑某天新增用户为0的情况,并输出新增用户的次日留存率0以及日期。通过c表进行左连接之后,日期为连接条件,那么我们就获得了每个日期以及对应的新用户次日留存率。因为d表中不含新增用户为0的留存率情况,因此左连接之后,这种情况就会变成null值,所以通过ifnull函数转化成0,这样就输出了每个日期新用户的次日留存率情况了。
已知表a,字段id,log_date,求连续登录天数大于等于2的用户id
SELECT distinct id
FROM (select *,dense_rank() over (PARTITION by id ORDER BY log_date) dk from a) t
GROUP BY id,DATE_SUB(log_date,INTERVAL dk day)
HAVING count(DISTINCT(log_date))>=2
解析:首先需要给用户的登录日期排序,只能用dense_rank是因为用户同一天可能会登录多次。如果一个用户连续登录或者同一天多次登录,那么他的登录日期与序号的差值是相同的,所以可以根据id,差值分组,便可以求得用户的连续登录和同一天多次登录的累计天数。 having里面的distinct是为了排除用户同一天多次登录的情况,select里面的distinct是为了排除一个用户多次连续登录,比如:连续登录两天,第三天未登录,接着又连续登录两天。
已知表table,字段id,date,求连续三天或三天以上未登录的用户id
select distinct id
from (select *,lag(date) over(partition by id order by date) date1 from table)a
where datediff(date,date1)>=4
解析:lag函数是为了获得用户上一次登录的时间,利用where与本次登录时间进行比较。如果一个用户要连续三天没登录,因此他下一次登录就应该在第四天,所以是大于等于4。
订单表orders,字段有order_id,user_id,date。求22年1月每个用户单天订单最高次数和每个用户单天订单最高次数的日期。
select user_id,date,cnt
from
(select user_id,date,cnt,rank() over(partition by user_id order by cnt desc) rk
from
(select user_id,date,count(order_id) cnt
from orders where date_format(date,'%Y%m')=202201 group by user_id,date)a
)b
where rk=1
解析:每个用户每天可能下单多次,因此需要先统计每个用户每天的订单量也就是a表。然后利用窗口函数对用户id分组对订单量倒序排序,筛选出排名为1的数据就可以了。如果题目不要求求出每个用户单天订单最高次数的日期,那么可以直接对a表用户id分组,使用max函数再得出结果了。
已知:商品上下架时间表log,商品id,上下架类型type(online:上架,offline:下架),时间log_time,输出每个商品id,上架时间online_time,下架时间offline_time。
select a.id,a.log_time online_time,b.log_time offline_time
from (select id,log_time,row_number()over(partition by id order by log_time) rn1
from log where type='online')a
left join (select id,log_time,row_number()over(partition by id order by log_time) rn2
from log where type='offline')b
on a.id=b.id and a.rn1=b.rn2
解析:同一个商品有多个上下架时间,因此不能通过case when进行行转列。首先需要对同一个商品所有的上下架时间进行排序,根据序号让每一个上架时间匹配对应的下架时间。用left join是因为会存在商品有上架时间,没有下架时间这种情况。
已知用户行为日志表tb_user_log,uid用户id,artical_id文章id,in_time观看开始时间,out_time观看结束时间。统计每篇文章同一时刻最大在看人数,如果同一时刻有进入也有离开时,先记录用户数增加再记录减少。结果按最大人数降序。
select artical_id,max(uv) max_uv from
(select artical_id,sum(num) over(partition by artical_id order by dt,num desc) uv from
(select artical_id,in_time dt,1 num from tb_user_log
union all
select artical_id,out_time dt,-1 num from tb_user_log
) a
) b
group by artical_id
order by max_uv desc
解析:首先需要想到的是,做这种类似某一时刻最大在线人数的题目,都可以转化成当用户开始观看时用户数+1,当用户结束观看时用户数-1,然后通过sum窗口函数累计求和。如果能想到这一点,这题就很简单了。所以刚开始需要将用户观看开始、观看结束的时间表取出来,再合并变成表a。通过sum窗口函数对每个文章进行分组根据时间顺序排序、num倒序排序累计求和变成表b,用sum函数是因为需要求出每个时刻的累计在线人数。num倒序排序是因为同一时刻有进入也有离开时,先记录增加,再记录减少。最后对b表通过文章id分组,max函数就可以求到最大在看人数了,结果按降序排序,加个order by max_uv desc就行了。
有一张销量信息表table1,字段有类目cate,店铺id,销售额sales。求出每个类目销售额排名前40%的店铺信息。(输出字段cate,id,sales)
select cate,id,sales from
(
select cate,id,sales,row_number() over(partition by cate order by sales desc) rn,
count(id) over(partition by cate) ct from table1
) a
where rn/ct<=0.4
解析:首先先对每个类目的销售额进行倒序排序,也就是row_number()窗口函数。count(id) over(partition by cate)是求出每个类目中的店铺个数,然后从a表中查询设置where条件前40%就可以了。 a表结果如下:
with t as
select client_id,count(order_id) as cnt
from '揽收表'
where date(create_time) between '2022-05-01' and '2022-05-31'
group by client_id; #每个客户的单量数
select
case level
when 1 then '0-5'
when 2 then '6-10'
when 3 then '11-20'
else '20以上'
end as '单量区间',
count(client_id) as '客户数量'
from
(select
client_id,
case
when cnt<=5 then 1
when cnt<=10 then 2
when cnt<=20 then 3
else 4
end as level
from t) a
group by level
order by level;#解法1
---------------
select level as '单量区间',count(client_id) '客户数量'
from
(select
case
when cnt<=5 then '1-5'
when cnt<=10 then '6-10'
when cnt<=20 then '11-20'
else '20以上' end as level
,client_id
from t
) b
group by level
order by level;#解法2
解析:第一步获取每个用户ID以及这些用户在2022年产生了多少订单,也就是临时表t。然后再通过case when函数即可得到用户的单量区间分布。这里有一个踩坑的地方就是,为什么不能用解法2?因为解法2中的order by是对字符串排序如图所示
mysql中字符串排序,会根据字符串中的第一个字符比较,因为6>2所以'6-10'会被排序在‘20以上’的下面。这种排序结果不是我们想要的,因此考虑采用解法1,给每个用户的订单量所在区间通过casewhen函数分配一个数字进行标记便于后期排序,得到了a表,最后再从a表中通过casewhen将level列的数字转化成对应的单量区间,并根据level分组和排序,因为此时的level是各个区间所对应的数字,所以排序结果符合我们想要的。
4.MySQL和Hive的区别
5.HiveQL和SQL语法的区别
- HiveQL不支持等值连接,SQL支持。
- HiveQL加入了左半连接(LEFT SEMI JOIN),左半连接实现了类似IN/EXISTS的查询语义。
- 分号是SQL语句结束标记,在HiveQL中也是,但在HiveQL中,对分号的识别不智能。例如:select concat(key,concat(';',key)) from dual;会报错。需要将concat中的;改成\073。
- HiveQL不支持Insert into 表 Values(), UPDATA , DELETE 操作。
- HiveQL有着非常严格的类型匹配,不支持类型自动转换。
6.数据倾斜
数据倾斜症状:
- 任务长时间维持在99%(或100%);
- 查看任务监控页面,发现只有少量(1个或几个)reduce子任务未完成;
- 本地读写数据量很大。
数据倾斜原因:
- key分布不均匀(存在大量相同值或者异常值和空值)。
- 业务数据本身特点(某个分公司的订单量提升几十倍)。
- 建表时考虑不周。
- 某些SQL语句本身就有数据倾斜。比如:关联字段的数据类型不统一。
导致数据倾斜的操作:
join、count(distinct id)、group by
解决数据倾斜:
- 如果任务长时间卡在99%则基本可以认为是发生了数据倾斜,建议开发者调整参数以实现负载均衡:set hive.groupby.skewindata=true
- 小表关联大表操作,需要先看能否使用子查询,再看能否使用Mapjoin。 map-side join 是一种优化方式 hive> set hive.optimize.bucketmapjoin=true 如果没开启,一般的join方式会有reduce过程。但是开启之后进行map side join ,当所有表中只有一张小表时,则会将小表直接放进内存里,直接map段连接,无需reduce过程。提升了很大效率。
- Join操作注意关联字段不能出现大量的重复值或者空值。
- Count(distinct id ) 去重统计要慎用,可以转化为count(id) from 子查询。
7.python连接MySQL
import pymysql
import pandas as pd
#打开数据库连接
db = pymysql.Connect(
host ="localhost", #服务器地址
# port = 10501,#服务器端口 连接本地的服务器地址不需要端口号
user = "root",#用户名
password = "123456",#密码
db = "lyf",#数据库名称
charset = "utf8"#连接编码
)
## 使用cursor()方法获取操作游标对象
cursor = db.cursor()
#数据提取模块#
sql ='''
select * from t
'''
cursor.execute(sql)#运行SQL
results = cursor.fetchall()#获取查询结果
cursor.close()#先关闭游标
db.close()#再关闭数据库连接
fileds = [filed[0] for filed in cursor.description]#获取列名
data=pd.DataFrame(results,columns =fileds )#获取数据转DataFrame
data
以上左图为jupyter notebook中python连接MySQL的执行结果,右图为MySQL执行结果。
作用:python连接MySQL多用于自动化测试中,经常需要向数据库添加或删除数据,也需要验证测试数据和数据库的数据是否一致。
8.数据库四种语言
DDL(Data Definition Language)数据定义语言:用来定义数据库的对象,如数据表、视图、索引等
DDL不需要commit. eg. CREATE ALTER DROP TRUNCATE COMMENT RENAME
DML(Data Manipulation Language)数据操纵语言:在数据库表中更新,增加和删除记录
DML需要commit. eg. INSERT UPDATE DELETE
DCL(Data Control Language)数据库控制语言:用于设置用户权限和控制事务语句
GRANT 授权, REVOKE 取消授权,if…else,while,begin transaction
DQL(Data Query Language)数据查询语言
SELECT子句,FROM子句,WHERE子句组成的查询块
9.OLAP和OLTP
OLAP的定义:
OLAP即联机分析处理,是数据仓库的核心部心,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。典型的应用就是复杂的动态报表系统。 联机分析处理OLAP具有共享多维信息的快速分析的特征(即FASMI)。
OLAP的特点有:
1.快速性(Fast),指系统能在数秒内对用户的多数分析要求做出反应。
2.可分析性(Analysis),指用户可以定义新的专门计算,将其作为分析的一部分。
3.共享性(Shared),它定义了哪些系统工具可以满足所有安全性要求, 如果需要多个写连接, 则可以在适当的级别上并发更新位置, 不是所有功能都需要客户回写数据, 但是对于越来越多的功能, 系统应该能够及时, 安全地管理多个更新。
4.多维性(Multi—dimensional),指提供对数据分析的多维视图和分析。
5.信息性(Information),指能及时获得信息,并且管理大容量信息。
OLTP的定义:
OLTP即联机事务处理,是传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,记录即时的增、删、改,比如在银行存取一笔款,就是一个事务交易。
OLTP的特点:
1.实时性要求高。比如:很久以前银行异地汇款,要隔天才能到账,而现在是分分钟到账的节奏,说明现在银行的实时处理能力大大增强。
2.数据量不是很大,生产库上的数据量一般不会太大,而且会及时做相应的数据处理与转移。
3.交易一般是确定的,比如银行存取款的金额肯定是确定的,所以OLTP是对确定性的数据进行存取。
4.高并发,并且要求满足ACID原则。比如两人同时操作一个银行卡账户,比如大型的购物网站秒杀活动时上万的QPS请求。
OLAP和OLTP的区别:
1、基本含义不同:OLTP是传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,记录即时的增、删、改,比如在银行存取一笔款,就是一个事务交易。OLAP即联机分析处理,是数据仓库的核心部心,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。典型的应用就是复杂的动态报表系统。
2、实时性要求不同:OLTP实时性要求高,OLTP 数据库旨在使事务应用程序仅写入所需的数据,以便尽快处理单个事务。OLAP的实时性要求不是很高,很多应用顶多是每天更新一下数据。
3、数据量不同:OLTP数据量不是很大,一般只读/写数十条记录,处理简单的事务。OLAP数据量大,因为OLAP支持的是动态查询,所以用户也许要通过将很多数据的统计后才能得到想要知道的信息,例如时间序列分析等等,所以处理的数据量很大。
4、用户和系统的面向性不同:OLTP是面向顾客的,用于事务和查询处理。OLAP是面向市场的,用于数据分析。
5、数据库设计不同:OLTP采用实体-联系ER模型和面向应用的数据库设计。OLAP采用星型或雪花模型和面向主题的数据库设计。
10.关系型数据库和非关系型数据库
关系型数据库是指采用了关系模型来组织数据的数据库。简单来说,关系模式就是二维表格模型。
主要有SQL Server,Oracle,Mysql,PostgreSQL。
优点:
(1)容易理解,二维表的结构非常贴近现实世界,它的逻辑类似常见的表格。
(2)使用方便,通用的sql语句使得操作关系型数据库非常方便。
(3)易于维护,数据库的ACID属性,大大降低了数据冗余和数据不一致的概率。
缺点:
(1)不能很好的满足并发需求,特别是海量数据爆发,读写能力会显得不足。
(2)可扩展性不好。
NoSQL非关系型数据库,主要指那些非关系型的、分布式的,且一般不保证ACID的数据存储系统。
主要代表MongoDB,Redis、CouchDB。
优点:
(1)易扩展,数据之间没有关系。
(2)大数据量,高性能。高性能读写非常灵活。
(3)灵活的数据模型。不需要事先对存储数据建立字段。
(4)高可用性。
缺点:
(1)数据和数据没有关系,他们之间就是单独存在的。
(2)非关系数据库没有关系,没有强大的事务关系,没有保证数据的完整性和安全性。
Nosql数据库四大分类:
(1)键值对存储(key-value):Redis键值对存储,优势:快速查询,缺点:存储数据缺少结构化。
(2)列存储:Hbase,优势:快速查询,扩展性强。缺点:功能相对于局限。
(3)文档数据库存储:MongoDB,早起应用多。优势:要求不特别的严格。缺点:查询性不高,缺少统一查询语法。
(4)图形数据库存储:应用于社交网络,优势:利用图结构相关算法。缺点:需要整个图计算才得出结果,不容易做分布式集群方案。
11.事务的四大特性
事务的四大特性ACID:原子性、一致性、隔离性、永久性。
原子性(atomicity)指事务中包含的所有操作要么全部成功,要么全部失败回滚。
一致性(consistency)指事务必须使数据库从一个一致性状态变换到另一个一致性状态。
隔离性(isolation)指多个并发事务之间要相互隔离。
永久性(durability)指事务一旦提交,对数据库的改变是永久性的,即使是数据库系统出现故障,也不会丢失提交事务的操作。
12.SQL优化(查询角度)
1.避免写select *,而是写具体的字段。
2.where里面不写or,而是通过写两个selec语句并通过union all来代替。
3.where里面尽量不写null,而是改成具体的数值。比如性别不为空,可以改成性别为男或者女。
4.where里面避免写!=或者<>。
5.在左连接、右连接、内连接效果一样的情况下,采用内连接。
6.小表连接大表的时候,让小表作为主表。
7.优先考虑使用where过滤条件再group分组,而不是group分组后再通过having过滤。
8.避免使用like,可以使用regexp代替like。
9.大部分情况下,可以用exists代替in。
10.避免直接使用笛卡尔积,比如:from后面接多个表(from t1,t2,t3)或者join条件后面的on带无效条件。
13. hive里行转列和列转行
行转列
方式一 : 通过 GROUP BY + CASE WHEN + 聚合函数
方式二 : 通过 GROUP BY + CONCAT_WS + COLLECT_LIST
列转行
方式一 :采用 UNION ALL 的方式,在指标少时方便使用,当行转列的指标比较多时代码量会比较大,维护困难
方式二:使用lateral view和str_to_map或者explode
Python笔面试题
1.写一段程序求π值,要求精确到小数点后四位以上。(某银行笔试题,未给出公式)
首先需要知道π的计算公式,然后使用循环即可得出答案。pow(m,n)方法是计算m的n次方。
pi=0
N=100#可以不为100,小一些大一些都可以。
for i in range(N):
pi+=1/pow(16,i)*(4/(8*i+1)-2/(8*i+4)-1/(8*i+5)-1/(8*i+6))
print('%.4f'%pi)
另一个公式和解法
a,b,n,pi,temp=1,1,1,0,1
while n<=10000:
pi+=temp
b+=2
a=-a
temp=a/b
n+=1
pi=pi*4
print('%.4f'%pi)
- python中numpy和pandas的区别
①numpy的核心数据结构是ndarray,支持任意维数的数组;而pandas的核心数据结构是series和dataframe,仅支持一维和二维数据。
②numpy主要用于数值计算,pandas主要用于数据处理与分析。
3.编程题(某信用卡笔试题) 已知如下需求:
产品:工作量计算器
已知信息:标准大小的项目,需要1个人用80个工时完成;
计算方式1:工时计算: 输入:项目大小(浮点型,代表标准大小的倍数),人数,(整数)
输出:工时数量(浮点型)
案例:1.5倍标准大小的项目,一共有两个人》》程序》》需要60.0个工时
计算方式2:人力计算
输入:项目大小(浮点型,代表标准大小的倍数),工时数量(浮点型)
输出:人数(整数)‘
案例:0.5倍标准大小的项目,需要在20.0个工时内完成》》程序》》需要2个人力
请根据以上需求内容,使用python代码完成上述项目;
def cal(choice,project,num=None,time=None):
if choice=='1':
num=int(input('请输入人数'))
time=project/num*80
else:
time=float(input('请输入工时数量'))
num=math.ceil(project/time*80)#人数需要向上取整
print('{}倍标准大小的项目,一共有{}个人,需要{}个工时'.format(project,num,time))
choice=input('请输入你的选择,1:工时计算,2:人力计算')
project=float(input('请输入项目的大小'))
cal(choice,project)
4.python的数据结构有哪些,可以介绍一下它们的区别吗?
python有四种基本的数据结构分别是列表(list)、元组(tuple)、集合(set)、字典(dict)。列表和元组比较明显的区别是一个是方括号,一个是圆括号,其次就是列表的元素可以修改,元组中的元素不可修改,列表和元组都可以根据索引访问其中的元素。集合就是和数学上的集合概念基本一致,他是无序性并且是不重复的,不能够通过索引获取其中的元素,同时里面的元素也是不可修改的。字典与他们最大的区别是字典的结构不同,字典中每个元素是由键值对组成的,它相当于是一个映射,并且在字典中每个元素的键是不能够重复的和不可修改的,但值可以重复也可以修改,可以通过字典的键来访问值,python3.6版本后字典是有序的,之前是无序的。
5.pandas库中有哪些数据结构呢,它们有什么区别和联系吗?
pandas库中的数据结构有两种,分别是series和dataframe。
区别:
series是一维数据结构,它由index和value组成。
dataframe是二维数据结构,它不仅含有index和value,还有column(列)。或者说dataframe是由多个series组成。
联系: dataframe是由多个series组成,无论是行或者列,单独拆分出来都是一个series。
6.pandas库中比较常用的函数有哪些?
- read_csv()、to_csv() 的函数,读取数据。
- head()、tail()查看数据集前五行或后五行。
- info、describe,查看数据集基本信息和统计性描述。
- drop_duplicates() 、dropna() 删除重复值和缺失值。
- groupby分组汇总。
- sort_values()排序。
- replace()替换。
- count()、sum() 计数和求和。
- value_counts()返回指定列中所有不同的值,以及值的个数。
pandas库中如何实现两个表格进行表关联?
可以通过pandas库中的join或者merge、concat函数进行合并。
join:用法例如df1.join(df2,on='a',how='left',lsuffix='',rsuffix='',sort='False')how后面可以有inner/outer/left/right,on是连接条件,并且两个dataframe在合并时不能有相同的列名,如果有重叠的列名必须在join方法中加入lsuffix参数,可以给左侧重复的列名加上后缀。join用法是通过行索引左右合并的,不能够上下合并。
merge:pd.merge(df1, df2, how='inner', on=None, left_on=None, right_on=None,left_index=False, right_index=False, sort=True,suffixes=('_x', '_y'))。how为‘left’, ‘right’, ‘outer’或‘inner’之一。on代表两个dataframe的共有列作为连接键。merge用法是包含join用法的,merge默认是按照相同的列名连接的,join是按照相同的行索引连接的。由于merge函数的left_on参数可以让它自由选定左边dataframe的某一列作为连接键,又因为left_index的存在,可以让merge像join一样实现行索引的连接。
concat:pd.concat([df1,df2], axis=0, join=‘outer’, ignore_index=False),join参数只有inner/outer,代表交集和并集,axis默认是等于0,代表上下合并,ignore_index=True代表合并和重置索引。concat不仅可以合并dataframe也可以合并series。
pandas库中loc和iloc区别?
loc是基于标签查找数据的,比如:df.loc[1,'a'],输出标签为1所在的行中列名为'a'的值。iloc是基于索引也就是坐标查找数据的,比如df.iloc[1,1]代表输出第一列第一行的值。
pandas中数据透视表有用过吗?
有,例如pivot_table函数可以实现类似Excel数据透视表的功能。
pandas中stack函数有用过吗?
stack将数据的列转旋转成行。还有一个是unstack,将行转化为列。
pandas中如何将某列设置为索引?
使用set_index函数可以将某列变为行索引,例如:df.set_index('列名', inplace=True)
pandas中groupby的作用是什么?
对数据进行分组、应用变换以及汇总。
Excel和Tableau面笔试题
1.Excel和tableau的区别?
①tableau倾向于可视化分析,生成更加精美的图表,Excel倾向于分析数据和数据处理。
②tableau可以处理海量数据集,Excel到接近百万数据集就非常卡顿了。
③Excel自带的图形更多、计算字段更加简单。taleau需要设置一些图形计算字段才能画出雷达图、漏斗图等,计算字段也比较复杂。
2.常用Excel函数有哪些,分别说一下用法和参数。
- vlookup(查找值,数据表,列序数,匹配条件)在表格的首列查找指定的数值,并返回表格当前行中指定列的数值。
- sum(数值1,数值2...数值5)用于返回单元格区域中所有数字之和。
- sumif(区域,条件,求和区域) 对满足条件的单元格求和,第一个区域是用于条件判断的单元格区域。
- count(值1,值2...数值5)用于对数字型数据的行计数。
3.VLOOKUP中精确匹配和大致匹配的区别
0(FALSE)是精确匹配,就是只会找lookup-value(查找值)这个值,找不到就返回错误。
1(TRUE)是大致匹配,就是找lookup-value这个值,找不到就找小于这个值的最大值。
精确查找使用的是历遍法。而大致匹配是利用的二分法,二分法只找两次就完成任务,因为二分法不是以内容为查找对象,而是通过不断地二分数据源,每次排除一半数据,到最后一次二分时完成任务。
4.tableau中度量和维度的区别?
维度:通常是分类字段,如名称、地区、邮寄方式等。将其拖放到功能区时,tableau不会对其进行运算,而是对视图区进行分区,维度的内容显示为各区的标题。
度量:通常是数值字段,如销售额、利润、折扣等。将其拖放到功能区时,tableau默认会进行聚合运算,连续字段的取值会显示为视图中的连续轴。
实习/校招相关问题
- 有考虑过在实习公司转正吗?
- leader对你的评价是什么?
- 介绍一下这段实习的工作内容
- 实习中如何和业务方沟通的?
- 简历上你写的实习项目最后落地了吗?结果是怎么样的?
- 实习过程中最有成就感的一件事
- 实习中遇到的困难
- 实习的收获
- 实习的时候做的项目的数据量大概是多少?
- 实习的时候做的是风控数据分析,毕业后从事的是偏业务的数据分析,当时为什么没有考虑继续留在风控行业呢?
- 为什么要做这个项目?
- 你平常建模调包的时候会看看底层代码吗?
- 你对python的使用是局限于调包呢,还是会写一些底层代码的设计?
开放性问题
- 你认为数据分析师需要具备哪些能力,你觉得你具备这些能力了吗?
- 你的性格适合数据分析吗?
- 最有成就感的事情是什么?
- 你觉得自己最大的缺点和优点分别是什么?
- 对自己的评价是什么?
- 为什么选择本公司?
- 为什么选择数据分析岗位?
- 你的职业规划是什么?
- 期待什么样的工作氛围?
- 在别人眼中,你是一个什么样的人?
- 有了解过现在面试的这个岗位吗?符合你的期望吗?
- 说一下你在大学生活中遇到最大的挫折是什么,如何解决的?
- 说一下你对这个行业的看法?
- 有了解过我们公司吗?
- 是否有工作地点方面的偏好?
- 是否有行业方面的偏好?
- 你期望的工作内容是什么样的?
- 希望从这个岗位中学到什么?
- 自己想做的数据分析是什么类型?
- 觉得自己做数分最大的优势是什么?
- 你认为商业分析和数据分析有哪些区别?
银行和国企常问问题
- 大学生活中是否参加过社团或者担任过班干部?从中你学到/收获了哪些?
- 有没有拿过奖学金?
- 班级排名或者年级排名多少?
- 有没有挂过科,挂了几门,现在通过了吗?
- 父母是做什么的?
- 你认为父亲和母亲哪一个对你的影响最大?
- 目前投递了哪些公司,面试了多少?目前是否有offer?
- 简历上你写的实习公司是做什么的?
- 为什么想来银行/国企,而不是互联网?
- 对本银行/国企,有了解过吗?
- 说一下你对金融科技岗的理解
- 四六级有没有通过?
- 在哪了解到这个公司/银行的?
- 你的职业规划是什么?