目录
机器学习的训练过程可以理解为一个统计过程,即已知数据求数据服从哪种分布的过程;而机器学习的预测过程可以理解为一个概率问题,即已知数据分布后对一个实例求概率,通过概率最大化得到最可能的预测值。而机器学习的训练过程往往转化为参数优化问题(在合理的假设下,给定历史数据,期望求得数据服从哪种分布,是一个参数估计的过程),这时就与代数、高数关系密切。因此,统计、概率、代数、高数将贯穿于机器学习的整个过程中,在后续的算法介绍中您将逐步感受到它们的影子。
深度学习的理念:一种端到端的学习方式,即让算法自动完成特征工程的工作,然后进行模型训练。
在机器学习任务中,针对不同输入结构的输入数据,采用不同的机器学习方法。
独立同分布数据:独立同分布类数据是指样本间在时间上没有相互关联,每个样本的行为不受其他样本影响。机器学习中的大部分方法都是为了解决这种独立同分布的数据而提出的,而且建模的假设就是认为样本是独立同分布的,如线性回归模型、决策树、支持向量机模型、神经网络模型等。深度学习的DNN网络可以很好地完成建模任务。在独立同分布数据中,传统的机器学习和深度学习应用没有本质区别。
时序数据:时序数据与独立同分布数据相反,样本间有较强的关系。但这种相关只是在时间上的相关,即当前样本的状态与历史的一个或多个状态有关,样本间不是相互独立的。
股票数据当前的价格与历史的价格有很强的相关性,不能将其看作是样本无关的数据。另外,文本数据也是样本相关的,某一个单词与左右相邻的单词强相关,这里通常称为上下文相关。
RNN和LSTM的优缺点:
RNN网络考虑到HMM模型在计算当前状态时只考虑一阶历史信息的问题而进行了改进,该网络会考虑更多的历史状态(甚至是全部的历史状态)来确定当前状态。但是由于RNN没有遗忘功能,过早的历史信息对当前的状态已经没有影响。LSTM网络,增加了模型的遗忘功能,使模型可以有选择性地记住更有用的特征。LSTM模型的简化模型GRU模型,同时在处理文本数据时增加了上下文关联性的考虑而提出了双向GRU等模型。
好文:https://www.jianshu.com/p/afa0facbe625
机器学习的建模流程:数据清洗、特征工程、模型训练与参数优化、模型上线运行
模型选择和模型评价
模型选择是在某个模型类中选择最好的模型,而模型评价对这个最好的模型进行评价。模型评价阶段不做参数调整而是客观地评价模型的预测能力。
主流方法有ROC曲线、KS曲线两种。
roc曲线由命中率(真阳率tpr)和假阳率fpr绘制,横坐标为fpr,纵坐标为tpr。
TPR考虑的是第一行,实际都是正例,FPR考虑的是第二行,实际都是负例。
一个优秀的客户流失预警模型,命中率(TPR)(召回率)应尽可能高,即能尽量揪出潜在流失客户,同时假警报率(FPR)应尽可能低,即不要把未流失客户误判为流失客户
accuracy(整体准确度), precision(精准度), recall, f-score(f1=2tp/(2tp + fp + fn),对不平衡率比较有效)
我们希望在阈值相同的情况下,假警报率尽可能小,命中率尽可能高,即ROC曲线尽可能陡峭,其对应的AUC值(ROC曲线下方的面积)尽可能高。
真正例率是在所有正例中,你将多少预测为了正例,这是你希望最大化的,也可以看作收益;假正例率是在所有负例中,你又将多少预测为了正例,这是你希望最小化的,也可以看作代价。
AUC值能达到0.75以上就已经可以接受,如果能达到0.85以上,就是非常不错的模型
模型搭建完成后,有时还需要知道各个特征变量的重要程度,即哪些特征变量在模型中发挥的作用更大,这个重要程度称为特征重要性。
分类两种曲线PR和ROC
ROC曲线和PR曲线。她们也基于混淆矩阵。
ROC曲线通过不断移动分类器的“截断点”来生成曲线上的一组关键点。截断点就是指区分正负样本的阈值。在ROC图上绘制出每个截断点对应的位置,再连接所有点就能得到最终的ROC曲线。
AUC值是ROC曲线下的面积大小。
PR曲线,是精确度(precision)和召回率(recall)的关系曲线。横轴是召回率,纵轴的精确率。
为什么ROC曲线不受样本不均衡问题的影响
PR曲线会受样本不均衡的影响
PR中,TP/(TP+FP),实际包括正例和负例,正负样本数量的变化会引起该值的变化。因此影响PR曲线对对分类器的评价。
ROC曲线不会受样本不均衡的影响。
在正负样本数量不均衡的时候,比如负样本的数量增加到原来的10倍,那TPR不受影响,FPR的各项也是成比例的增加,并不会有太大的变化。因此,在样本不均衡的情况下,同样ROC曲线仍然能较好地评价分类器的性能,这是ROC的一个优良特性,也是为什么一般ROC曲线使用更多的原因。
F1分数(F1-Score),又称为平衡F分数(BalancedScore),它被定义为精确率和召回率的调和平均数。
多分类时,看micro-f1和macro-f1
micro-F1
第一种计算出所有类别总的Precision和Recall,然后计算F1。这种方式被称为Micro-F1微平均。
二分类的micro-F1 score和Accuracy的值相等:https://blog.csdn.net/weixin_44839047/article/details/112460705
macro-F1
是计算出每一个类的Precison和Recall后计算F1,最后将F1平均。这种范式叫做Macro-F1宏平均。
weighted
对每一类别的f1_score进行加权平均, 权重为各类别数在y_true中所占比例。
应用
商业实战中应用广泛,如信用卡评分模型。
根据特征变量的个数可将线性回归模型分为一元线性回归和多元线性回归。
最小二乘法
拟合的目的是使残差平方和尽可能小,即实际值和预测值尽可能接近。
数学上通过最小二乘法和梯度下降法来求解系数。
通过对残差平方和进行求导(对a和b进行求导),导数为0时,该残差平方和将取极值,此时便能获得拟合需要的系数a和截距b了。
代码:查看系数、常数项
regr,coef_
regr.intercept_
常用: R 2 R^2 R2(R-squared)来衡量线性拟合的优劣,P值用来衡量特征变量的显著性。
R 2 R^2 R2取值范围是0~1,越接近1则拟合程度越高。
另外,xgboost, lightGBM可以用r2_score()
来打印出r2结果。
优点
缺点
评估事件发生概率的分类模型,适用于计算二分类问题。
前提假设是样本符合伯努利分布(离散型机率分布)。很少直接将连续值作为逻辑回归模型的特征输入,而是将连续特征离散化为一系列0、1特征交给逻辑回归模型。
假设数据服从伯努利分布,通过极大似然函数,运用梯度下降来求解参数,来达到数据二分类的目的。
逻辑回归就是线性回归+sigmoid进行非线性转换,得到一个0~1之间的 概率值。
离散特征的增加和减少都很容易,易于模型的快速迭代。
离散化后的特征对异常数据有很强的鲁棒性,能增强泛化能力
特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险
在逻辑回归里,应用到sigmoid函数作为预测函数,将ax+b加权和(在线性回归基础上)映射到0-1的范围空间里。在进行分类判断时,设定一个概率的阈值,大于阈值则样本预测值为1,小于阈值则样本预测为0。
线性回归优化目标函数用的最小二乘法
最小二乘法:误差平方和最小
sigmoid函数:在z=0的时候十分敏感,而在z>>0和z<<0的时候都不敏感。
目标函数利用**极大似然估计法(对数似然函数作为损失函数),结合梯度下降法**来估计逻辑回归的参数。
极大似然估计:利用已知样本信息结果,反推最有可能(最大概率)导致这些样本结果出现的模型参数值(模型已定,参数未知)
对数极大似然ylogy+(1-y)log(1-y)
优点:
缺点:
预测结果呈S型分布,两端的概率变化非常小,中间的概率变化十分剧烈,难以找到阈值;
拟合能力不好;只能处理线性可分类的问题
连续变量不同样本下的分布情况。
离散变量,观察变量的每个可能取值的分布情况,即占比信息;还可以计算每个可能取值下的坏样本率,即哪个可能的取值下更容易出现违约情况。
在实际工作中获取到的数据往往不那么理想,可能会存在非数值类型的文本数据、重复值、缺失值、异常值及数据分布不均衡等问题。
常用的三种无监督编码——Get_dummies哑变量处理、Label Encoding编号处理和One-hot编码。
离散变量分为可排序和不可排序变量。
哑变量dummy variable
使用pd.get_dummies()
来构建哑变量处理非数值型数据。
构造哑变量容易产生高维数据,因此,哑变量常和PCA(主成分分析)一起使用,即构造哑变量产生高维数据后采用PCA进行降维。
与One-hot编码相比
因此,不可排序变量在数值化的过程中,如果希望保持这种等距特性,推荐使用One-hot编码方法完成离散变量数值化。
pandas的哑变量编码也认为缺失值是一种特征
Label Encoding编号处理
可排序的变量的数值化转换时,如果希望保留等级大小关系,则需要用标签编码(Label编码)来完成。函数只支持单变量的标签编码,如果是多个变量,需要则需要逐个循环对变量进行编码。
使用LabelEncoder()
函数将文本类型的数据转换成数字。但Label Encoding的一个缺点——可能会产生一些没有意义的关系。树模型(如决策树、随机森林及XGBoost等集成算法)能很好地处理这种转化,因此对于树模型来说,这种奇怪的现象是不会影响结果的。
另外,scikit-learn中的标签编码方式不支持变量等级设置,因此,遇到比如学历的编码时,通常认为博士比本科具有更高的编码评分,这种情况就要采用自定义字典的方式进行变量数值化。
哑变量编码、labelencoder编码总结
Get_dummies的优点是它的值只有0和1,缺点是当类别的数量很多时,特征维度会很高,此时可以配合使用下一章要讲解的PCA(主成分分析)来减少维度。
Get_dummies
,Label Encoding
或replace()
函数;Label Encoding
也没有太大关系。onehot编码
onehot很方便计算变量之间的欧氏距离,保持了离散变量的等距性。
看这个解说:https://www.cnblogs.com/king-lps/p/7846414.html
红、黄、蓝编码,用one-hot表示就是红色:1 0 0 ,黄色: 0 1 0,蓝色:0 0 1 。如此一来每两个向量之间的距离都是根号2,在向量空间距离都相等,所以这样不会出现偏序性加粗样式,基本不会影响基于向量空间度量算法的效果。
独热编码(哑变量 dummy variable)是因为大部分算法是基于向量空间中的度量来进行计算的,为了使非偏序关系的变量取值不具有偏序性,并且到圆点是等距的。
对离散变量做One-hot编码后的结果是一个与变量种类M相关的N×M的稀疏矩阵,N为样本总数。如果离散变量的种类很多,则编码后的矩阵异常稀疏,维度特别高。
优缺点
自然状态码
但是one-hot编码有稀疏性,所以还有自然状态码,比如0,1,2,3,4,5它们的编码为
自然状态码为:000,001,010,011,100,101
独热编码为:000001,000010,000100,001000,010000,100000
考虑目标变量,则变量编码的过程可能会使离散变量的数值化过程更具有方向性,这就是有监督编码。
WOE编码
WOE编码是评分卡中最常用的有监督编码方法。WOE编码既可以对离散变量编码,也可以对分箱后的连续变量编码。WOE编码就是对坏样本分布与好样本分布的比值再进行对数变换的结果。
WOE编码可以表示变量的预测能力。WOE值可以表示变量的每个取值的预测能力,因此,WOE值也可以作为连续变量分箱的目标函数使用。在变量选择中更常用的是IV(Information Value)值。
WOE编码与One-hot编码不同,WOE编码后的变量并没有维度上的改变。One-hot编码自定义字典映射是无监督的,自定义字典映射依据专家经验而定;而WOE编码是有监督的,变量的编码值是通过训练数据计算得到的,更加客观。
WOE编码好处
WOE缺点
Tree Model不太需要one-hot编码: 对于决策树来说,one-hot的本质是增加树的深度。
data = data.drop_duplicates('c1')
isnull()
,isna()
来查看空值。
空值处理:删除、填补
删除:data.dropna(thresh=2)
填补:data.fillna()
data.fillna(data.mean())
,data.fillna(method='pad')
,此处的method='pad’表示用空值上方的值来替换空值,如果上方的值不存在或也为空值,则不替换。method='backfill’或method=‘bfill’,表示用空值下方的值来替换空值,如果下方的值不存在或也为空值,则不替换具体的填补办法依照原始变量的数据类型而定。
1.如果原始变量为字符串类型,对缺失值用特殊的字符串填补即可,如NA或missing;or频率最多tian’chong
2.如果原始变量为整型或浮点型,
就用同类型的特殊值填补,比如-7777(只要这个数不是原始变量中存在的值即可);
或者对连续变量分箱,将缺失值单独作为一个箱,对分箱后的结果进行编码(连续变量离散化、离散变量再数值化)。
不采用分箱的方式处理连续变量的缺失值,就只能用统计量进行插补,或根据算法进行建模以预测缺失值可能的取值。
可以生成一个附加列,表征该连续变量是否存在缺失值.
异常值检验可以分为单变量和多变量两种方法,
绘制每个变量的箱线图,直观地感受样本的分布与异常值情况
这里要先剔除缺失值再绘制箱线图。
两种检测方法——利用箱体图观察和利用标准差检测
箱体图观察
将上四分位数和下四分位数的差值记为IQR,即IQR=Q3-Q1;令箱体图上界为Q3+1.5×IQR,下界为Q1-1.5×IQR。
data.boxplot()
绘制箱体图
利用标准差
因为3个标准差过于严格,此处将阈值设定为2个标准差,即认为当数值与均值的距离超出2个标准差,则可以认为它是异常值
如果Z-score标准化后的数值大于标准正态分布的标准差1的2倍,那么该数值为异常值,返回布尔值True,否则返回布尔值False。
异常值处理方式
异常值也是非常重要的特征,尤其在反欺诈模型中,更不能提前处理异常值。在其他评分卡模型中,如果进行变量分箱,异常值也不需要处理,直接作为参数进行分箱即可
在实际工作中,如果不确定是否要做数据标准化,可以先尝试做一做数据标准化,看看模型预测准确度是否有提升,如果提升较明显,则推荐进行数据标准化。
Normalize,离差标准化(线性函数归一化),它利用原始数据的最大值和最小值把原始数据转换到[0,1]区间内。实现对原始数据等比缩放。
这种方法比较适用在数值比较集中的情况。有一个缺陷就是当有新数据加入时,可能导致max和min的变化,需要重新定义。
Z-score 标准化(Mean Normaliztion)也称均值归一化,通过原始数据的均值(mean)和标准差(standard deviation)对数据进行标准化。标准化后的数据符合标准正态分布,即均值为0,标准差为1。
更容易通过梯度下降找到最优解。(梯度下降:线性回归、LR、SVM、DNN,都需要归一化)
z-score标准化方法适用于属性A的最大值和最小值未知的情况,或有超出取值范围的离群数据的情况。该种归一化方式要求原始数据的分布可以近似为高斯分布,否则归一化的效果会变得很糟糕。
需要标准化的算法
除了KNN模型,还有一些模型也是基于距离的,所以量纲对模型影响较大,就需要进行数据标准化,如SVM、KMeans、PCA等。线性回归模型和逻辑回归模型,有时也需要进行数据标准化处理。
参数估计的时候使用梯度下降,在使用梯度下降求解最优化问题的时候,归一化/标准化可以加快梯度下降速度,即提升模型收敛速度。
对于树模型则无须做数据标准化处理,因为数值缩放不影响分裂点位置,对树模型的结构不造成影响。因此,决策树模型及基于决策树模型的随机森林模型*、AdaBoost*模型、XGBoost模型、LightGBM模型通常都不需要进行数据标准化处理,因为它们不关心变量的值,而是关心变量的分布和变量之间的条件概率。
归一化标准化使得变量的量纲相同,(否则梯度下降收敛困难)。
L1范数指权值向量w中各个元素绝对值之和。L1正则可以产生稀疏权值矩阵(很多元素为0),进而进行特征选择,即让特征的系数变为0。
L2范数指权值向量w中各元素的平方和,然后求平方根。L2正则不具有稀疏性,L2范数可以防止过拟合,提高模型泛化能力。
L1正则化叫做Lasso回归
L2正则化叫做ridge回归(岭回归),
变量分箱方法主要用于连续变量,对于变量取值较稀疏的离散变量也应该进行分箱处理。
在构建信用评分卡模型的过程中,需要利用WOE值和IV值进行特征筛选,而计算这两个值的第一步就是要进行数据分箱。
数据分箱就是将一个连续型变量离散化,可分为等宽分箱和等深分箱。等宽分箱是指每个分箱的差值相等。等深分箱是指每个分箱中的样本数一致。
等宽分箱
pd.cut()
,data_cut=pd.cut(data[‘年龄’], 3)信用评分卡模型可以依据年龄、月收入、负债比率、历史逾期次数等多个特征变量对客户进行评估。对特征变量年龄进行离散化可以使建立的模型更稳定.还可以自定义。
通常的做法
作用
分箱会增加模型预测效果的稳定性,即会减少模型在训练集上的表现与测试集上的偏差。
缺点
WOE值和IV值它们可以用来衡量特征变量的预测能力,或者说特征变量的特征区分度,类似的指标还有基尼系数和信息增益。
对于逻辑回归等没有基尼系数等指标的模型而言,可以通过WOE值和IV值进行变量选择。
IV值的计算是以WOE值为基础的,而要计算一个变量的WOE值,需要先对这个变量进行分箱处理。
WOE值与IV值在银行的信贷违约预测中应用较多。
进行变换后:
WOE值也可以理解为:分箱后第i个分箱中违约客户和未违约客户的比值与整个样本中该比值的差异。WOE值反映的就是分箱后第i个分箱中违约客户和未违约客户的比值yi/ni,这其实就反映了特征区分度
如果WOE变成无穷大,处理方法有两种:第一种方法是对数据重新进行更合理的分箱,使各个分箱的WOE值不再无穷大;第二种方法是忽略这些无穷大的值,直接让它变为0。
每个分箱的WOE值的绝对值都很大,那么说明这一特征变量的特征区分度很高,因此这类问题应该重点考虑这一特征变量。
如果出现了无穷大的WOE值,也是我们不希望看到的,这样会导致基于WOE值的IV值也变成无穷大,不利于进行特征筛选
IV值
通过IV值可以评判特征变量的预测能力,从而进行特征筛选。
IV是Information Value(信息量)的缩写。在进行特征筛选时,IV值能较好地反映特征变量的预测能力,特征变量对预测结果的贡献越大,其价值就越大,对应的IV值就越大,因此,我们可根据IV值的大小筛选出需要的特征变量。
各个分箱的IV值:
对各个分箱的IV值进行简单求和,就得到这个特征变量的IV值,计算公式如下
IV值永远非负,一定大于0。WOE可能为负值。因此IV值更合适。 一个特征变量的IV值越高,说明该特征变量越具有区分度
不过IV值也不是越大越好,如果一个特征变量的IV值大于0.5,有时需要对这个特征变量持有疑问,因为它有点过好而显得不够真实。通常会选择IV值在0.1~0.5这个范围内的特征变量。
对样本数据的每个特征变量进行IV值计算并排序后,就可以获得特征变量的决策能力强弱信息。
用IV好于WOE
代码
对于线性回归模型和逻辑回归模型等以线性方程表达式为基础的机器学习模型,需要注意多重共线性的影响。如果存在多重共线性,则需要进行相应处理,如删去某个引起多重共线性的特征变量。
多重共线性多个变量的情况如:根据3个朝向的数字就能判断第4个朝向的数字是0还是1)。即某个特征变量可以用其他特征变量的线性组合表示,则称特征变量间存在完全共线性。可以表示如下:
影响
检验共线性方法
相关系数判断和方差膨胀系数法(VIF检验)
相关系数
X.corr()
相关性非常强,有理由相信它们会导致多重共线性,因此需要删去其中一个特征变量orPCA降维。
这里的相关系数是皮尔森系数(见后文)。
相关系数是多重共线性的充分条件,而不是必要条件!在有多个特征变量时,相关系数较小的特征变量间也可能存在较严重的多重共线性
VIF检验方差膨胀系数
序号特征
如成绩(高中低),转为321,保留了大小关系
独热编码
处理类别间不具有大小关系的特征,比如血型(A,B,O,AB)转为4维系数向量。
类别取值较多的话,要注意:
(1)使用稀疏向量来节省空间
(2)配合特征选择降低维度。
高维时,knn距离难以有效衡量,lr时维度太多参数也会多容易过拟合
二进制编码
利用二进制对id进行哈希映射,最终得到0/1向量。维度少于独热编码,节省存储空间。
好连接:https://blog.csdn.net/choven_meng/article/details/109075410
http://www.manongjc.com/detail/7-gybyabxdrooalqm.html
建立模型时,可能会遇到正负样本比例极度不均衡的情况。建立信用违约模型时,违约样本的比例远小于不违约样本的比例,此时模型会花更多精力去拟合不违约样本,但实际上找出违约样本更为重要。这会导致模型可能在训练集上表现良好,但测试时表现不佳。
携程项目也有样本不平衡问题。好样本是坏样本的2.5倍(18:50)
很好的连接待看:https://zhuanlan.zhihu.com/p/354853593
数据增强方式:~
(1)带权值的损失函数
在算法实现过程中,对于分类中不同样本数量的类别分别赋予不同的权重(一般思路分类中的小样本量的类别权重高,大样本量的类别权重低),然后进行计算和建模。
class_weighted
与samples_weight
:https://zhuanlan.zhihu.com/p/75679299
balanced
。sample_weight
来自己调节每个样本权重。设置类别权重参数:class_weight
很好的说明:如果给定参数‘balanced’,则使用y的值自动调整与输入数据中的类频率成反比的权重。
默认是
'balance'
。当使用字典时,其形式为:Weights associated with classes in the form{class_label: weight}
,比如:{0: 1, 1: 1}表示类0的权值为1,类1的权值为1.
作用,主要应用以下两类问题:
算法中都有基于类别参数的调整设置。比如SVM,?
from sklearn.svm import SVC
model_svm=SVC(class_weight='balanced')
model_svm.fit(x,y)
对于样本不平衡,还可以使用样本权重参数:sample_weight
,而不使用class_weight
。它是通过调节样本权重来尝试解决样本不平衡问题(样本不是总体样本的无偏估计)。在调用fit
函数时,通过sample_weight
来自己调节每个样本权重。
设置样本权重:sample_weight
。在贝叶斯、决策树、svm、lr等都会遇到
fit(X,y,sample_weight=None)
:X,y以矩阵的方式传入,而sample_weight则是每条测试数据的权重,同样以array格式传入。
score(X,y,sample_weight=None)
:评分函数,将返回一个小于1的得分,可能会小于0
在scikit-learn做逻辑回归时,如果上面类别权重调整、样本权重调整都用到了,那么样本的真正权重是class_weight
*sample_weight
。
另外,计算结果时,如f1分数,设置损失权重: weighted
如计算f1-score, 参数里设置
average='weighted'
,f1_score(y_true, y_pred, average=‘weighted’)
xgboost
AUC时来评估模型性能的时候,可用scale_pos_weight
来平衡正样本和负样本的权重。例如,当正负样本比例为1:10时,scale_pos_weight可以取10;(参数设置为:正样本数/负样本数)——xgboost设置
计算公式为:
过采样的方法有随机过采样和SMOTE法过采样。
随机过采样
比如原来有100个违约样本,随机抽取900次得到900个有重复的违约样本,然后和原来的100个旧违约样本组合成1000个违约样本。
因为随机过采样重复地选取了违约样本,所以有可能造成少样本过拟合。
随机过采样最好任何情况下都不要用,无法学习更鲁棒、易泛化的特征,在不平衡数据上表现较差;(因为正样本的特征几乎都一样,所以模型对于这些正样本学习其实能到的东西基本都是不变的,所以容易造成过拟合)
SMOTE过采样
SMOTE法是一种针对随机过采样容易导致过拟合问题的改进方案。SMOTE算法采用了K邻近的思想,它合成新的少数类样本,合成的策略是对少数类的样本a,从它的k个最近邻中随机选一个样本b,然后在a、b之间的连线上随机选一点作为新合成的少数类样本。
简而言之:
算法过程:
SMOTE优点
SMOTE缺点
应用
案例:信用卡违约预测
imblearn库:Python中专门用来处理数据不均衡问题的工具库
下采样是从1000个不违约样本中随机选取100个样本,和100个违约样本一起构成新的训练集。欠采样抛弃了大部分不违约样本,在搭建模型时有可能产生欠拟合。
一般用来平衡数据集、去噪。
方法
参考:https://www.cnblogs.com/limingqi/p/11783435.html
缺点:会造成信息缺少 or 最后模型的欠拟合。
欠采样代码
在实战中处理样本不均衡问题时,
损失函数也并非越小越好,若损失函数过小,容易出现过拟合。
解决过拟合方法有:数据入手、获取更多数据;降低模型复杂度;正则化;集成学习。
欠拟合
损失函数也并非越小越好,若损失函数过小,容易出现过拟合。为了避免这个问题,可以在损失函数中加入正则化项或惩罚项,
正则化为了解决过拟合为问题,分为L1和L2正则化。
L1 正则化。向量中各元素绝对值之和,逼近于0。又叫做稀疏规则算子(Lasso regularization)。关键在于能够实现特征的自动选择,参数稀疏可以避免非必要的特征引入的噪声;
L2 正则化。使得每个元素都尽可能的小,但是都不为零。在回归里面,有人把他的回归叫做岭回归(Ridge Regression),也有人叫他 “权值衰减”(weight decay)。
L1 会趋向于产生少量的特征,而其他的特征都是 0,而 L2 会选择更多的特征,这些特征都会接近于 0
决策树正则化就是剪枝,通常把子节点个数作为惩罚项。
如果将所有特征数据都用来拟合模型,会提高模型的复杂度,造成过拟合风险显著增大,且不同的特征数据间可能存在共线性。此时就需要对数据进行降维,以浓缩特征向量。
降维的方法主要有选择特征和抽取特征两种:
- 过滤方法:将所有特征进行打分评价,选择最有效的一些特征。比如:卡法检验,信息增益,相关系数打分。
- 包装方法:将特征组合的选择看做是一个在特征空间中的搜索问题。比如:随机爬山法,启发式的搜索方法等。
- 嵌入方法:将特征选择的过程嵌入到模型训练的过程中,其实也就是正则化的方法。比如lasso回归,岭回归,弹性网络(Elastic Net)等。
二维到一维的数据降维的本质就是将原始数据做零均值化处理后,寻找如下所示的合适的线性组合系数α和β,将二维数据转换为一维数据。
将n维数据(X1,X2,…,Xn)转换成k维数据(F1,F2,…,Fk),即将n个特征降维成k个新特征呢?其本质也是一样的,构造k个线性组合。
线性组合满足以下特征:
步骤:
找出数据里最主要的方面,用数据里最重要的方面代替原始数据。因此主成分分析是一种线性变换,把数据变换到一个新的坐标系统中,使得任何数据投影的第一大方差在第一个坐标(称为第一主成分)上,第二大方差在第二个坐标上,以此类推。
PCA的目的是为了让映射后的样本具有最大的发散性。
保留低阶主成分,忽略高阶主成分。低阶主成分通常能保留住数据的最重要的方面。
算法步骤
把矩阵X从n x m
维降到n x k
维的矩阵Y,找到这样的矩阵W维度为m x k
,
将原始数据按列组成n行m列矩阵X
将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值(中心化)
求出**协方差**矩 C = 1 m X X T C=\frac{1}{m}XX^T C=m1XXT
根据下面的解释,是找X的n个随机变z:
对角线上的元素是各个随机变量的方差,非对角线上的元素是两两随机变量之间的协方差,该矩阵为对称矩阵。
求出该协方差矩阵的特征值、单位特征向量
通俗地说,任意一个协方差矩阵都可以视为线性变换的结果。
对于任何对称矩阵,存在一个特征值分解 ∑ = U ⋀ U T \sum = U\bigwedge U^T ∑=U⋀UT,U的每一列都是相互正交的特征向量,且是单位向量,满足 U T U = I U^T U=I UTU=I,对角矩阵对角线上的元素从大到小是特征值,非对角线上的元素都是0!
将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵W,W维度为m x k
,实现矩阵Y=XW
中心化是为了后续参与统计运算,比如求方差就包括了x-u
方差:用来度量单个随机变量的离散程度。因此方差可以视作随机变量x关于其自身的协方差Conv(x,x)
特征工程数据降维,同时保持数据集的对方差贡献最大的特征。
非监督学习的降维方法,只需要特征值分解,就可以对数据进行压缩、去噪。
降维的必要性:
- 多重共线性可能使解空间不稳定,影响结果的稳定性。
- 高维空间具有稀疏性
优点
缺点
决策树
决策树是一种基本的分类与回归方法,其模型就是用一棵树来表示整个决策的过程,这棵树可以是二叉树也可以是多叉树。根节点包括整个样本集,每一个叶子节点都对应一个决策结果,每一个内部节点对应一个决策过程。因此从根节点到每个叶子节点的路径对应一个判定序列。
回归决策树划分标准不是基尼系数or信息熵,而是均方误差MSE。value是均值。
决策树通过学习简单的IF-THEN决策规则从而预测目标变量的值,其模型就是用一棵树来表示整个决策的过程,从上而下,每一次迭代就是选择一个特征属性进行分裂,直到不能叶子节点不能分裂为止。
选择特征:ID3优先选择信息增益最大的,
ID3使用信息增益作为选择特征的准则
熵用于表示随机变量不确定性的度量
信息增益 = 信息熵 - 条件熵
信息增益越大表示使用特征 A 来划分所获得的“纯度提升越大”。 选择信息增益最大的特征,直到剩余特征的信息增益小于阈值、或已经没有特征可以选择时终止。
C4.5 使用信息增益比作为选择特征的准则
CART使用GINI指数作为选择特征的准则
https://blog.csdn.net/weixin_42676175/article/details/104480532
基尼指数反映了从数据集中随机抽取两个样本,其类别标记不一致的概率。基尼指数代表了模型的不纯度,
基尼系数越低表示系统的混乱程度越低,区分度越高,特征越好,越适合用于分类预测。这和信息增益(率)正好相反
决策树生成:通常是利用信息增益最大、信息增益比最大、Gini 指数最小作为特征选择的准则。从根节点开始,递归的生成决策树。相当于是不断选取局部最优特征,或将训练集分割为基本能够正确分类的子集;
对决策树进行剪枝优化,预防树的过拟合,增强泛化能力。构建决策树的损失函数,将每一个叶子节点回缩到上一层父节点,对损失函数最小的叶节点进行修剪。
剪枝策略
预剪枝(边建立、边剪枝):在构造过程中,对每个节点在划分前先进行评估,当某个节点满足剪枝条件,则直接停止此分支的构造。可以控制树的深度(最常),叶子节点个数、叶子节点样本数、信息增益量等。
<\hr>
后剪枝:先从训练集生成一颗完整的决策树,然后自底向上对非叶节点进行考察,若将该节点对应的子树替换为叶节点,能带来泛化性能的提升,则将该子树替换为叶节点。C4.5就后剪枝。后简直通常可以得到泛化能力更好的决策树,但时间开销大。
回归决策树
回归决策树模型与分类决策树模型最大的不同就是其划分标准不是信息熵或基尼系数,而是均方误差MSE。
优点:
易于理解和解释,输出树形图解释性较强,容易提取出规则。
对输入数据的属性要求较低。对异常值不敏感。
可以同时处理标称型(有限,如真与假)和数值型(无限)的数据;可以处理有缺失属性的样本;能处理不相关的特征;
是很多重要集成模型的基础
缺点:
改进
ID3
优点
缺点:
ID3只能用于处理离散分布的特征,不能处理连续的数据,并且对缺失值敏感;
ID3会越分越细,导致过拟合
ID3 没有剪枝策略,容易过拟合
信息增益准则对可取值数目较多的特征有所偏好,类似“id”这种编号的特征其信息增益接近于 1(因为自身熵值极大,它的特征的熵值为0,所以信息增益率会很高);
应用
C4.5
优点:
连续值的排序运算:先将特征取值排序,以连续两个值中间值作为划分标准。尝试每一种划分,并计算修正后的信息增益,选择信息增益最大的分裂点作为该属性的分裂点。
分割太细分母增加,信息增益率会降低。
缺点:
应用
CART
使用基尼指数,因此减少了大量的对数运算,偏向于特征值较多的特征;CART实质是在某个特征维度对样本空间进行划分,这变为一种求最优的切分特征和最优的切分点。XGBoost是由很多的CART树组成。
生成的树必须是二叉树(C4.5, ID3是多叉树);CART树可以多次重复选择特征。(ID3和C4.5每层只有一次)
优点
总体区别
ID3只可以离散,C4.5 CART都可以连续
ID3和C4.5只能分类,CART可以分类可以回归
ID3对样本缺失值比较敏感,C4.5和cart可以对缺失值做不同方式的处理;
ID3和C4.5多叉树,样本特征不复用;CART树二叉树,特征可以重复使用;
ID3和C4.5通过简直来权衡准确性和泛化,CART利用全部数据发现所有可能的树结构进行对比
Bagging(并联):并行地训练一堆分类器,各分类器之间没有依赖关系。bagging是有放回的选择样本,所有的样本权重保持不变。理论上越多树越好,但实际上超过一定数量结果就差不多上下浮动了。bagging采用并行计算的方式,可以同时生成所有的弱分类器。预测的时候,所有弱分类器的权重相等。
Boosting(串联):基于提升的迭代算法。每次训练过程中,新增的树是基于预测错分类的样本点,给这些样本点更多的权重,然后权重被更新过的样本集被用于训练下一个分类器,整个训练过程如此迭代进行下去。也就是说新分类器会把注意力放在之前分类效果不好的样本上。各分类器之间有依赖关系,必须串行。boosting采用顺序计算的方式,各个分类器只能按顺序生成,后一个分类器的参数会用到前一个分类器的结果。预测的时候,每个弱分类器都有相应的权重,分类误差越小,权重越高。
比如XGboost, Adaboost, GBDT
- Bagging + 决策树 = 随机森林
- AdaBoost + 决策树 = 提升树
- Gradient Boosting + 决策树 = GBDT
是多重决策树的组合,而不只是一棵决策树。让很多决策树一起工作,可以进行回归、分类。采用大多数决策树的输出结果作为最终预测结果。
针对回归问题,通过随机森林中所有决策树预测值的平均值计算得出最终预测值。(软投票)
针对分类问题,随机森林中的每棵决策树会预测最新数据属于哪个分类。最终,哪一分类被选择最多,就预测这个最新数据属于哪一分类。(硬投票)
随机森林(Random Forest)是 Bagging 的一个变体。Ramdon Forest 在以决策树为基学习器构建 Bagging 集成的基础上,进一步在决策树的训练过程中引入随机属性选择。
随机森林模型会在原始数据集中随机抽样,构成n个不同的样本数据集,然后根据这些数据集搭建n个不同的决策树模型,最后根据这些决策树模型的平均值(针对回归模型)或者投票情况(针对分类模型)来获取最终结果。
数据随机、特征随机(k=根号M)。
Bagging(并联):并行地训练一堆分类器,各分类器之间没有依赖关系。bagging是有放回的选择样本,所有的样本权重保持不变。理论上越多树越好,但实际上超过一定数量结果就差不多上下浮动了。bagging采用并行计算的方式,可以同时生成所有的弱分类器。预测的时候,所有弱分类器的权重相等。
bagging用于减少方差。
Boosting(串联):基于提升的迭代算法。每次训练过程中,新增的树是基于预测错分类的样本点,给这些样本点更多的权重,然后权重被更新过的样本集被用于训练下一个分类器,整个训练过程如此迭代进行下去。也就是说新分类器会把注意力放在之前分类效果不好的样本上。各分类器之间有依赖关系,必须串行。boosting采用顺序计算的方式,各个分类器只能按顺序生成,后一个分类器的参数会用到前一个分类器的结果。预测的时候,每个弱分类器都有相应的权重,分类误差越小,权重越高。
boosting用于减少偏差。
Boosing就是培养精英和重视错误。
“培养精英”就是每一轮训练后对预测结果较准确的弱学习器给予较大的权重,对表现不好的弱学习器则降低其权重。在最终预测时,“优秀模型”的权重是大的,相当于它可以投出多票,而“一般模型”只能投出一票或不能投票。
“重视错误”就是在每一轮训练后改变训练集的权值或概率分布。通过提高在前一轮被弱学习器预测错误的样例的权值,降低前一轮被弱学习器预测正确的样例的权值,来提高弱学习器对预测错误的数据的重视程度,从而提升模型的整体预测效果。比如XGboost, Adaboost, GBDT
- Bagging + 决策树 = 随机森林
- AdaBoost + 决策树 = 提升树
- Gradient Boosting + 决策树 = GBDT
stacking通过一个元分类器或者元回归器来整合多个分类模型或回归模型的集成学习技术。通常考虑的是异质弱学习器,并行地学习它们,并通过训练一个「元模型」将它们组合起来,根据不同弱模型的预测结果输出一个最终的预测结果。 Stacking中第二层学习的过程就是为了寻找合适的权重或者合适的组合方式。
基础模型利用整个训练集做训练,元模型将基础模型的预测作为特征进行训练。
stacking 用于提升预测结果的stacking
抽取样本:每棵树的样本是通过有放回的方式从样本总体中随机抽取的
随机采样:随机打乱、拿噪音点等。
抽取特征:每棵树都会随机选择k个特征,然后采用决策树算法(ID3, C4.5, CART)来构建一课决策树
K控制了随机性的引入程度,是一个重要的超参数
构建多课决策树(建立树的过程是同时运行的)
采用多数投票法输出最后的决策结果
预测贷款风险,银行or证券使用较多;
预测股票涨跌。
优势
有效解决决策树过拟合问题,能够处理特征维度很多的数据(决策树就适合少的)
对数据的适应能力强,可以处理离散和连续的,无需要规范化
可解释性强,训练完后可以给出哪些feature比较重要,可以可视化分析
我的携程预测方法里就用了feature_importance来查看。
判断方法有两种,树中特征出现的位置来判断;
可以解决回归和分类问题
不同决策树可以由不同主机并行训练生成,效率很高
由于每次不再考虑全部的属性,而是一个属性子集,所以相比于 Bagging 计算开销更小,训练效率更高;
劣势
特征维度较小的数据不适合采用
相对于决策树来说要花费更多时间来训练
随机森林评估特征重要性
集成学习可以评估特征的重要性。用随机森林进行特征重要性评估的思想其实很简单,说白了就是看看每个特征在随机森林中的每颗树上做了多大的贡献,然后取个平均值,最后比一比特征之间的贡献大小。
贡献通常可以用基尼系数作为评价标准来衡量。
Adaptive Boosting,它以一种高度自适应的方式按顺序训练弱学习器。
简单来说,AdaBoost算法的核心思想就是调整错误样本的权重,进而迭代升级。
针对分类问题,AdaBoost算法根据前一次的分类效果调整数据的权重,在上一个弱学习器中分类错误的样本的权重会在下一个弱学习器中增加,分类正确的样本的权重则相应减少,并且在每一轮迭代时会向模型加入一个新的弱学习器。不断重复调整权重和训练弱学习器,直到误分类数低于预设值或迭代次数达到指定最大值,最终得到一个强学习器
过程:
有了弱学习器的权重后,就可以更新原来样本的权重了。这也是AdaBoost算法的核心思想所在:增大分类错误的样本的权重,减小分类正确的样本的权重,从而在之后实现更为准确的分类。
正则化项
为防止AdaBoost算法过拟合,可以向模型加入正则化项——每个弱学习器的权重缩减系数ν,又称为learning rate(学习率)。
应用
AdaBoost算法既能做分类分析,也能做回归分析。
案例:
信用卡精准营销预测
特征变量有客户的年龄、性别、月收入、月消费及月消费与月收入之比,目标变量是精准营销后客户是否响应(即客户在营销后是否办了信用卡),取值为1代表营销有效,取值为0代表营销失败
参数
adaboostRegression多了个loss参数
GBDT是Gradient Boosting Decision Tree(梯度提升树)的缩写。与AdaBoost的区别在于:AdaBoost算法是调整权重,而GBDT算法则是拟合残差。AdaBoost算法根据分类效果调整权重(弱分类器权重、样本权重)并不断迭代,最终生成强学习器;GBDT算法则将损失函数的负梯度作为残差的近似值,不断使用残差迭代和拟合回归树,最终生成强学习器。
GBDT算法既能做分类分析,又能做回归分析。GBDT分类模型的弱学习器是分类决策树模型,GBDT回归模型的弱学习器则是回归决策树模型。
当损失函数是平方函数时,负梯度就是残差。不过当损失函数不是平方函数时,负梯度只是残差的近似值,并不完全等于残差。
残差是实际值-预测值( y i − y ^ i y_i - \hat y_i yi−y^i),然后用下一颗树的残差去拟合上一课树产生的残差,从而产生新的残差。(缩小误差,从而让树预测的更准确。)(残差会越来越小,or精确的说,均方误差会越来越小)
并不断重复此步骤,使残差变小
即:第一棵树预测的是y得到y1, 第二棵树预测的是y-y1得到y2, 第三棵树预测的是Y-y1-y2得到的是y3.
每一步残差计算变相增大了分类instance的权重。对于已经分对instance则趋于0。这样后面的树能更专注前面被分错的instance。
代码
实际中默认模型迭代次数为100.
应用
GBDT算法既能做分类分析,又能做回归分析
预测信用卡额度, 产品定价预测
优点
在高维稀疏特征的时候,线性模型会比非线性模型好:带正则化的线性模型比较不容易对稀疏特征过拟合。
某种程度上可以说是GBDT算法的改良版,两者在本质上都是利用了Boosting算法中拟合残差的思想。运行速度快,预测准确度高,且支持并行操作,极大地提升了机器学习的效率和效果,无论是分类模型还是回归模型都有很大的作用。
xgboost是一堆cart树的集合。
算法本身优化:
- XGBoost算法的损失函数,除了本身的损失,还加上了正则化部分,用来控制模型的复杂度,可以防止过拟合,泛化能力更强。
∑ Ω ( f i ) \sum \varOmega (f_i) ∑Ω(fi)是将全部t课树的复杂度进行求和,添加到目标函数中作为正则化项。 复杂度由叶子数组成。
- XGBoost对损失函数做二阶泰勒展开(将损失函数的二阶导数作为学习目标),相较于GBDT算法的损失函数只对误差部分做负梯度(一阶泰勒) 展开,增加了精度,二阶泰勒展开可以近似大量损失函数,
- ?借鉴RF支持列抽样,不仅能降低过拟合,还能减少计算。这是xgboost区别于传统gdbt的一个点。
- ?shrinkage收缩方法。相当于学习系数,对每颗子树都要乘上该系数,防止过拟合。
- 能对缺失值处理。通过枚举所有缺失值在当前节点是进入左子树还是右子树更优来处理缺失值默认的方向。
算法运行效率优化
- 对每个弱学习器,如决策树建立的过程做并行选择,找到合适的子节点分裂特征和特征值,从而提升运行效率
xgboost的生成
多数情况下,xgboost将cart回归树作为基分类器,回归树预测误差(均方误差、对数误差、还可以是交叉熵等),节点是数值(预测值)。CART回归树是二叉树,通过不断将特征进行分裂。CART实质是在某个特征维度对样本空间进行划分,这变为一种求最优的切分特征和最优的切分点。XGBoost是由很多的CART树组成。
XGBoost使用了和CART回归树一样的想法,利用贪心算法,遍历所有的特征的所有特征划分点。计算loss functoin最小值。
xgb
特征重要性
(1)weight:使用特征在所有树中作为划分属性的次数
(2)gain:使用特征在作为划分属性时loss平均的降低量
(3)cover:使用特征作为划分属性时对样本的覆盖度
应用:XGBoost算法搭建金融反欺诈模型和信用评分卡模型
金融反欺诈特征变量有:客户换设备次数、在本次交易前的支付失败次数、换IP的次数、换IP国的次数及本次交易的金额。(商业实战中使用的特征变量远比本案例多得多)
代码
XGBoost分类模型的特征变量只支持array数组类型或DataFrame二维表格类型的数据
为什么调优后的结果还不如调优前的结果?通常来说,出现这种情况的概率较小,可能是因为数据量较小,也可能是因为本案例中使用了交叉验证
参数
常用:max_depth
, n_estimators
, learning_rate
。
我:objective
定义目标函数,n_jobs
,sub_sample
, colsample_bytree
构建每棵树时的子抽样比例,
objective参数在回归问题中取值为’reg:linear’,而在二分类问题中一般取值为’binary:logistic’,在多分类问题中一般取值为’multi:softmax’。
max_depth
,min_child_weight
、gamma
用于控制模型复杂度
如果一个结点分裂后,它的所有子节点的权重之和都大于该阈值,该叶子节点才可以划分。
对于一个叶子节点,当对它采取划分之后,损失函数的降低值的阈值。
xgboost很好的参考:https://zhuanlan.zhihu.com/p/83901304
xgboost很好的相关问题:https://blog.csdn.net/andyjkt/article/details/107599156
xgboost的相关面试题:https://blog.csdn.net/weixin_39675926/article/details/111139229
xgboost优缺点
优点
先不处理那些值缺失的样本,采用那些有值的样本搞出分裂点,在遍历每个有值特征的时候,尝试将缺失样本划入左子树和右子树,选择使损失最优的值作为分裂点。
决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点)
缺点
XGBoost预先将每个特征按特征值排好序,存储为块结构,分裂结点时可以采用多线程并行查找每个特征的最佳分割点,极大提升训练速度。
对于XGBoost模型而言,很多预处理都不是必要的,例如缺失值,XGBoost模型会自动处理,它会通过列举所有缺失值在当前节点是进入左子树还是右子树来决定缺失值的处理方式。
因为XGBoost模型是基于决策树模型的,所以像线性回归等模型需要的特征变换(如离散化、标准化、取log、共线性问题处理)等预处理工作,XGBoost模型都不太需要,这也是树模型的优点之一。(对共线性不敏感,不需要特征标准化)。节省了很多特征工程时间。
客户价值预测(线性回归)
客户价值预测就是预测客户在未来一段时间可以带来多少利润。
利润可能来自:信用卡年费、取现手续费、分期手续费、境外交易手续费
特征:历史贷款金额、贷款次数、月收入、学历、性别
用户分群(Kmeans)
用户流失预警
用户风险预测
信用卡额度预测(回归)
信用评分卡模型(XGBoost):根据客户的信用历史资料构建信用评分卡模型给客户评分。根据客户的信用得分,可以预估客户按时还款的可能性,并据此决定是否发放贷款及贷款的额度和利率
历史授信额度、月收入、年龄、历史违约次数
通常会用到逻辑回归模型和决策树模型。
商业实战中常以基于逻辑回归的评分卡模型为基础(稳定性强,半年到一年更新一次,但不够精确,KS值不够大),再结合决策树等树模型(不太稳定,可能要一个月更新一次,但拟合度强,区分度高,可以在第一拨快速去掉违约人员)。
金融反欺诈模型(XGBoost)
客户换设备次数、在本次交易前的支付失败次数、换IP的次数、换IP国的次数及本次交易的金额
客户违约预测(LightGBM):银行等金融机构经常会根据客户的个人资料、财产等情况,来预测借款客户是否会违约,以便进行贷前审核、贷中管理、贷后违约处理等工作。通过海量数据对客户进行风险评估并进行合适的借款利率定价,这便是一个典型的风险定价过程。
收入、年龄、性别、历史授信额度、历史违约次数
广告收益回归预测
新闻聚类分群模型(Kmeans DBSCAN)
贝叶斯定理可以理解成下面的式子:
后验概率(新信息出现后的A概率) = 先验概率(A概率) x 可能性函数(新信息带来的调整)
P(A|B)称为"后验概率"
P(A)称为"先验概率"(Prior probability)
P(B|A)/P(B)称为"可能性函数"(Likelyhood),这是一个调整因子,也就是新信息B带来的调整,作用是将先验概率(之前的主观判断)调整到更接近真实概率。
朴素贝叶斯通过特征的概率来预测分类,模型是不需要调参的:
训练分类器,计算输入的训练样本中,每个不同的分类类别在训练样本中出现的频率以及每个类别下各个特征属性出现的条件概率值。
先计算先验概率P(类别)、可能性函数P(特征|类别) /P(类别)
根据公式,计算在该样本出现的条件下,各个分类类别出现的概率,哪个概率最大,待分类的样本就属于哪个类别
P(类别|特征) = 先验*可能性函数
朴素贝叶斯法对条件概率分布做了条件独立性的假设
假设特征之间相互独立,那么我们统计的时候,就需要在整个特征空间中去找,比如统计p(不帅、性格不好、身高矮、不上进|嫁)。由于数据的稀疏性,很容易统计到0的情况。 这样是不合适的。
主要用于文本分类(多分类)、垃圾邮件分类等
垃圾邮件过滤、翻译、搜索、中文分词;
情感分类
投资策略;无人驾驶更新地图信息;
肿瘤预测模型。
优点
缺点
高斯朴素贝叶斯:特征变量是连续变量,符合高斯分布。比如说人的身高、物体长度等。如果连续变量不是正态分布,需要先转为正态分布。
伯努利贝叶斯:特征变量是离散变量,符合伯努利分布(0/1分布)。在文本分类中特征变量体现在一个单词是否出现。
多项式朴素贝叶斯:特征变量是离散变量,符合多项式分布。在文档分类中特征变量体现在一个单词出现的次数,或者是单词的 TF-IDF 值等。是一种典型的文本分类模型。
文本分类应用实例:
https://www.cnblogs.com/jpcflyer/p/11069659.html
很好的解释:https://zhuanlan.zhihu.com/p/106265377
线性可分SVM
二分类模型,求解出正确划分数据集并且找出几何间隔最大的超平面。对于一个线性可分的数据集来说,这种超平面有无数多个,但是几何间隔最大的超平面却是唯一的。
划分数据的决策边界叫做超平面。离这个超平面最近的点就是“支持向量”。点到超平面的距离叫做间隔。支持向量机的意思就是使得超平面和支持向量之间的间隔尽可能的大。这样才可以使两类样本准确分开。
超平面由法向量w和截距b决定。
距离该超平面最近的点(圈出来的点)就是支持向量支持向量到超平面的距离之和为 2 ∣ ∣ w ∣ ∣ \frac{2}{||w||} ∣∣w∣∣2, SVM的目标就是使得这个距离之和最大化,即||w||最小化。可以借助拉个朗日来计算极值,但是推理过程我不太了解。
线性可分:可以用一个线性函数把两类样本分开,比如二维空间中的直线、三维空间中的平面以及高维空间中的线性函数
线性不可分:指有部分样本用线性分类面划分时会产生分类误差的情况。
为什么要软间隔最大化?
因为如果训练数据线性可分,会存在无数个超平面,利用硬间隔最大化的原理可以得到唯一解。近似可分的时候,可以引入松弛变量,求解软间隔最大化学习到一个线性分类器,此为线性支持向量机。
线性不可分SVM
需要核函数技巧(kernel trick)和软间隔最大化来学习非线性SVM
核函数把原始样本从现有空间映射到一个更高维的空间,使得样本在高位空间线性可分。
常见核函数:
- 线性核:样本数量小于特征数,选择线性核。K(x,z)=x*z
- 高斯核:参数相对少,大样本or小样本都有很好的效果。优先使用高斯核or线性核。
- 样本数量大于特征数目,可以使用非线性核,将样本映射到更高的维度:如高斯核、多项式核
- 样本数量等于特征数量,也可以高斯核
- 多项式核:核参数较多。
优点
缺点
K近邻算法的原理非常简单:对于一个新样本,K近邻算法的目的就是在已有数据中寻找与它最相似的K个数据,或者说“离它最近”的K个数据,如果这K个数据大多数属于某个类别,则该样本也属于这个类别。KNN需要标准化。
数据标准化的常见方法有min-max标准化(也称离差标准化)和Z-score标准化(也称均值归一化)
步骤如下:
计算训练样本和测试样本中每个样本点的距离
欧式距离、
曼哈顿距离:|x1-x2|+|y1-y2|
对所有距离进行排序(升序)
选择前k个最小距离的样本
根据这k个样本的标签进行投票,属于哪个分类的样本最多,则测试样本也属于哪个类
k值的选择取决于数据。
一般情况下,k值小的时候,只有与输入实例十分接近的训练实例才有效,因此近似误差小,估计误差大(噪声较大);较大的K值,能够减小噪声的影响,但会使类别之间的界限变得模糊,导致近似误差大,但估计误差小。
k值大小选择没有理论最优,往往是结合k折交叉验证得到最优k值选择
优点
缺点
不适合解决样本不平衡问题,效果差,对稀有类别的预测准确率低
有些类别样本数量很多,而其他样本数量很少
因为KNN算法值考虑前k个最小距离内,哪类的样本数量最多,而不会将远近考虑在内。可以考虑用权重进行改进。
对于样本容量大/特征多的数据集计算量比较大(体现在距离计算上)
需要大量内存
Kmeans是聚类的分类算法,
核心思想
变量量纲不一样会引起距离偏差,所以一定要归一化/标准化
均值和方差大的维度将对数据的聚类产生决定性影响。
样本间距离的计算方式可以是欧氏距离、曼哈顿距离、余弦相似度等。最常用的基于欧式距离的聚类算法(会受均值和方差影响)。
质心横、纵坐标就是这一簇数据横、纵坐标的均值
优点:
n_cluster
缺点
倾向于得到接近大小的cluster.
改进:
K值选择方法:手肘法。取不同k值计算累积距离
应用
客户分类(营销定位):银行用户分群 (我:携程构造用户画像用kmeans分群)
银行拥有海量的客户,对于不同的客户,银行需要采取不同的营销工作策略。
对于收入高且风险承受能力强的客户,可以重点挖掘业务机会,如向其推销一些收益率高但周期相对较长的理财产品;而对于收入低且风险承受能力较弱的客户,则需要采取其他策略。
银行客户的特征有很多,如年龄、收入、性别、学历、婚姻状况、户籍等。
各类客户的平均收入
画像结果比如:
重点客户,是需要重点营销和推广的对象;
优质客户,是需要精心维护和营销的对象;
潜力客户,是需要耐心挖掘和等待的对象。
客户分群很好的解释:https://blog.csdn.net/weixin_41636030/article/details/89007379
客户分群的目的是每一组特征描述丰富详细,不同组间特征差异明显,但组内特征相似。
它是一个计算距离的过程,主要是用欧式距离去解决。
聚类不能有缺失值是因为它会拉偏质心,导致聚类不准;回归模型不支持缺失值是因为它使得有缺失值的变量失去了预测的作用。
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种以密度为基础的空间聚类算法,可以用密度的概念剔除不属于任一类别的噪声点。该算法将簇定义为密度相连的点的最大集合,将具有足够密度的区域划分为簇,并可以发现任意形状的簇
原理
画圆半径越小,圆内最小样本数越大,对于簇的产生越严格,密度要求越高,离群点越多。
参数:min_samples
,eps
半径。
优点
缺点
自底向上(A):从下而上地合并cluster,具体而言,就是每次找到距离最短的两个cluster,然后进行合并成一个大的cluster,直到全部合并为一个cluster。整个过程就是建立一个树结构,类似于下图。
计算距离方式
average-linkage:计算两个cluster各自数据点的两两距离的平均值
single/complete:选择两个cluster中距离最短/最长的一对数据点的距离作为类的距离。
自顶向下(D)
优点
缺点
协同过滤算法的原理是根据用户群体的产品偏好数据,发现用户或物品之间的相关性,并基于这些相关性为用户进行推荐。根据原理的不同,协同过滤算法分为两类——基于用户的协同过滤算法和基于物品的协同过滤算法。
基于用户
基于用户的协同过滤算法的本质是寻找相似的用户:通过一个用户的相关数据寻找与该用户相似的其他用户,进而为该用户推荐相似用户关注的产品。
基于物品
基于物品的协同过滤算法的本质是寻找相似的物品:通过一个物品的相关数据寻找与该物品相似的其他物品,进而为关注该物品的用户推荐相似的物品。
在商业实战中,大多数应用场景偏向于使用基于物品的协同过滤算法。
用户的数量是非常庞大的(如淘宝的用户群体达数亿),而物品的数量则相对有限,因此,计算不同物品的相似度往往比计算不同用户的相似度容易很多。
用户的喜好较为多变,而物品的属性较明确,不随时间变化。物品的相似度比较固定。
欧氏距离、余弦值和皮尔逊相关系数。
欧式距离
基于欧氏距离衍生出的相似度公式
余弦相似度
cosine_similarity(df)
皮尔逊相关系数
皮尔逊相关系数r是用于描述两个变量间线性相关强弱程度的统计量,取值范围为[-1,1],为正值代表两个变量存在正相关,为负值代表两个变量存在负相关。
其中,COV(X,Y)为变量X和Y的协方差,D(X)和D(Y)分别为变量X和Y的方差。
代码
这里会返回相关系数和显著性水平p值。P<0.05表示显著相关,即两个变量之间的相关性真的存在,而不是由偶然因素引起的。只有在显著相关的前提下,r值才有意义。简单来说就是先通过观察P值是否小于0.05判定是否真的存在相关性,再根据r值判定相关性有多强。
pandas库就是直接.corrwith()
,.corr()
关联分析
解说:https://www.bilibili.com/video/BV1FD4y1U7vB?from=search&seid=805510543456018572&spm_id_from=333.337.0.0
关联分析它通过深入分析数据集,寻找事物间的关联性,挖掘频繁出现的组合,并描述组合内对象同时出现的模式和规律。
在神经网络模型中,常用来做非线性转换的激活函数有Sigmoid函数、Tanh函数、Relu函数
sigmoid
(0,1),Sigmoid函数的导数f′(x)从0开始,很快就又趋近于0,所以在梯度下降时会出现梯度消失;而且Sigmoid函数的均值是0.5而非0,不利于下一层的输出。
tanh
(-1,1),当x很大或很小时,导数f′(x)也会很接近0,同样有梯度消失的问题。但是Tanh函数的均值为0,这弥补了Sigmoid函数均值为0.5的缺点。
relu
(0, +∞),当输入为正数时,它可以弥补Sigmoid函数和Tanh函数的梯度消失问题,但是当输入为负数时,它仍然有梯度消失的问题。此外,Relu函数的计算速度比Sigmoid函数和Tanh函数要快一些
得物笔试:风控反欺诈聚类
属于一个欺诈团体的欺诈用户们,他们之间会存在一些关系,比如团体的用户之间可能会共用一个手机号。问如何对将欺诈团体的用户聚类?