机器学习模型

一、LR

1. 逻辑回归与线性回归的区别

  • 引入sigmoid函数映射,使样本映射到[0,1]之间的数值,从而来处理分类问题。是广义线性模型,本质上还是线性回归。
  • 逻辑回归是假设变量服从伯努利分布,线性回归假设变量服从高斯分布。
  • 逻辑回归是用最大似然法去计算预测函数中的最优参数值,而线性回归是用最小二乘法去对自变量因变量关系进行拟合。

为什么用最大似然函数做估计?

最小二乘法的误差符合正态分布,而逻辑回归的误差符合的是二项分布,所以不能用最小二乘法来作为损失函数。

最小二乘法做损失函数为非凸函数,求解困难且容易陷入局部最优,而似然函数为凸函数可以得到局部最优解。

为什么用sigmoid函数?

  • 映射为0,1 反映属于二分类中类的概率
  • 转化为对数几率函数:对数几率函数是任意阶可导的凸函数,有许多数值优化算法都可以求出最优解
  • 逻辑回归中因变量 y服从伯努利分布,而伯努利分布的参数 p 的含义就是样例属于 y=1的概率

 

2. 逻辑回归模型

最理想的是采用阶跃函数,但是由于其不可微,难以求最优解,所以采用对数几率函数。

(1)logistic变换:

机器学习模型_第1张图片机器学习模型_第2张图片

机器学习模型_第3张图片

我们将 y 视为 x 为正例的概率,则 1-y 为 x 为其反例的概率。两者的比值称为几率(odds),指该事件发生与不发生的概率比值,若事件发生的概率为 p。

则对数几率:

机器学习模型_第4张图片

其他写法:
机器学习模型_第5张图片

 

(2)由h估计y属于0-1的概率:

合并,服从伯努利分布:

(3)通过极大化似然函数的方法,运用梯度下降来求解参数

似然函数:

对数似然函数:

然后求导:

机器学习模型_第6张图片

3. 回归模型结果解读

(1)回归系数P的检验是t检验,当P<α值,即回归系数显著,拒绝原假设。 回归模型检验是检验模型是否合适,通过F检验,当F检验P<α,则模型显著,即反映的总体回归。

(2)特征系数的绝对值越大,对分类效果的影响越显著,但不能表示系数更大的特征重要性更高。因为改变变量的尺度就会改变系数的绝对值,而且如果特征是线性相关的,则系数可以从一个特征转移到另一个特征,特征间相关性越高,用系数解释变量的重要性就越不可靠。

4. 做评分卡中为什么要进行WOE化?

  • 更好的解释性,变量离散化之后可将每个箱体映射到woe值,而不是通常做one-hot转换。
  • woe化之后可以计算每个变量的IV值,可用来筛选变量。
  • 对离散型变量,woe可以观察各个level间的跳转对odds的提升是否呈线性。
  • 对连续型变量,woe和IV值为分箱的合理性提供了一定的依据,也可分析变量在业务上的可解释性。
  • 用woe编码可以处理缺失值问题。

5. sklearn中的LR使用

sklearn.linear_model.LogisticRegression(penalty='l2', dual=False,
         ‍tol=0.0001, C=1.0, fit_intercept=True, intercept_scaling=1, 
         class_weight=None, random_state=None, solver='liblinear', 
         max_iter=100, multi_class='ovr', verbose=0, warm_start=False, n_jobs=1)

(1)正则化选择参数:penalty  其原理就是对参数进行约束

l1和l2分别为L1正则化和L2正则化;默认为l2

两种情况调整:

主要的目的只是为了解决过拟合,一般penalty选择L2正则化就够了。

  • 如果选择L2正则化发现还是过拟合,即预测效果差的时候,就可以考虑L1正则化
  • 如果模型的特征非常多,我们希望一些不重要的特征系数归零,从而让模型系数稀疏化的话,也可以使用L1正则化

penalty参数的选择会影响我们损失函数优化算法的选择。即参数solver的选择,如果是L2正则化,那么4种可选的算法{‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’}都可以选择。但是如果penalty是L1正则化的话,就只能选择‘liblinear’了,L1正则化没有连续导数。

(2)优化算法选择参数:solver

  • liblinear:使用了开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数
  • lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数
  • newton-cg:也是牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数
  • sag:即随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候,样本少不能用

(3)tol: 残差收敛条件,默认是0.0001,也就是只需要收敛的时候两步只差<0.0001就停止,可以设置更大或更小。(逻辑回归模型的损失函数是残差平方和)

(4)分类方式选择参数:multi_class

(multi_class='multinomial', solver='newton-cg')

    multi_class参数决定了分类方式的选择,有 ovr和multinomial两个值可以选择,默认是 ovr。

    ovr即one-vs-rest(OvR),而multinomial指的是OVO。如果是二元逻辑回归,ovr和multinomial并没有任何区别,区别主要在多元逻辑回归上。

(5)类型权重参数: class_weight

用于标示分类模型中各种类型的权重,可以不输入,即不考虑权重,或者说所有类型的权重一样。如果选择输入的话,可以选择balanced让类库自己计算类型权重,或者我们自己输入各个类型的权重

比如对于0,1的二元模型,我们可以定义class_weight={0:0.9, 1:0.1},这样类型0的权重为90%,而类型1的权重为10%

如果class_weight选择balanced,那么类库会根据训练样本量来计算权重。某种类型样本量越多,则权重越低,样本量越少,则权重越高

使用场景:

  • 误分类的代价很高。比如对合法用户和非法用户进行分类,将非法用户分类为合法用户的代价很高,我们宁愿将合法用户分类为非法用户,这时可以人工再甄别,但是却不愿将非法用户分类为合法用户。这时,我们可以适当提高非法用户的权重
  • 样本高度失衡。如我们有合法用户和非法用户的二元样本数据10000条,里面合法用户有9995条,非法用户只有5条,如果我们不考虑权重,则我们可以将所有的测试集都预测为合法用户,这样预测准确率理论上有99.95%,但是却没有任何意义。这时,我们可以选择balanced,让类库自动提高非法用户样本的权重。

(6)样本权重参数: sample_weight

样本不平衡,导致样本不是总体样本的无偏估计,从而可能导致模型预测能力下降。遇到这种情况,可以通过调节样本权重来尝试解决这个问题。样本或类别的权重在训练模型最终通过损失函数实现

sample_weight:array-like, shape (n_samples,)optional

Arrayof weights that are assigned to individual samples. If not provided, then eachsample is given unit weight.

调节样本权重的方法有两种,第一种是在class_weight使用balanced;第二种是在调用fit函数时,通过sample_weight来自己调节每个样本权重。

在scikit-learn做逻辑回归时,如果上面两种方法都用到了,那么样本的真正权重是class_weight*sample_weight

(7)fit_intercept:  默认:True 指定是否应将常量(a.k.a. bias或intercept)添加到决策函数中。

(8)C: 正则化系数,正则化强度的导数,必须是一个正数,值越小,正则化强度越大,即防止过拟合的程度更大

(9)warm_start: 是否使用上次的模型结果作为初始化,默认是False,表示不使用

(11)n_jobs: 并行运算数量(核的数量),默认为1,如果设置为-1,则表示将电脑的cpu全部用上。

6. 过拟合解决方法

(1)L1  L2 正则化

逻辑回归的损失函数:

在此损失函数可以取为最大似然估计函数的相反数,其次除以m这一因子并不改变最终求导极值结果,通过除以m可以得到平均损失值,避免样本数量对于损失值的影响

机器学习模型_第7张图片

L1:

机器学习模型_第8张图片

L1正则化使得权重 w 往0靠,使网络中的权重尽可能为0,产生稀疏权重矩阵, 也就相当于减小了网络复杂度,防止过拟合。

L2:

机器学习模型_第9张图片

L2正则化起到使得权重参数 w 变小的效果,更小的权重参数 w意味着模型的复杂度更低,对训练数据的拟合刚刚好,不会过分拟合训练数据

(2) 增加样本,要覆盖全部的数据类型。数据经过清洗之后再进行模型训练,防止噪声数据干扰模型

(3) bagging(如随机森林)能有效防止过拟合

7. 多分类问题

在多分类Logistic 回归中,使用softmax 函数而不是sigmoid 函数。Softmax回归模型是logistic回归模型在多分类问题上的推广,当分类数为2的时候会退化为Logistic分类。

softmax 函数产生每个类别的概率,并且概率向量的所有元素相加为1。

损失函数:采用交叉熵函数,主要是由于这个求导结果比较简单,易于计算,并且交叉熵解决某些损失函数学习缓慢的问题。

机器学习模型_第10张图片

对z求导后: 

所有类别之间明显互斥用softmax分类器,所有类别之间不互斥有交叉的情况下最好用个logistic分类器

使用用二分类的三种策略:

7.1 OVO 一对一(N(N-1)/2个分类器)

OvO将这N个类两两配对,从而产生N(N-1)/2个二分类任务。于是我们会得到N(N-1)/2个分类结果,最终的结果可通过投票产生:把被预测得最多的类别作为最终分类结果。

OvR的每个分类器均使用全部的训练样例,而OvO的每个分类器仅用到两个类的样例。OvO的存储开销和测试时间开销通常比OvR更大

7.2 OVR 一对多(只需训练N个分类器,)

一对多是将一个类的样例作为正例,其它类的样例作为反例来训练N个分类器。在测试时若仅有一个分类器预测为正类,则对应类别标记为最终分类结果。如有多个分类器预测为正例,则以经过逻辑回归的数据作为衡量标准,哪个大选择哪个。

7.3 MVM 多对多

多对多是每次将若干类作为正例,若干其他类作为负例。MvM的正反例构造有特殊的设计,不能随意选取。我们这里介绍一种常用的MvM技术:纠错输出码(EOOC)。

  • 编码:对N个类做M次划分,每次划分将一部分类别划分为正例,一部分划分为反例,从而形成一个二分类的训练集:这样共有M个训练集,则可训练出M个分类器。
  • 解码:M个分类器分别对测试样本进行预测,这些预测样本组成一个编码。将这个编码与每个类各自的编码进行比较,返回其中距离最小的类别作为最终预测结果。

机器学习模型_第11张图片

以上例子中预测类别为C3,海明距离最小。

 

 

二、集成学习思想

1. bagging和boosting

(1)bagging

每一次从原始数据中根据均匀概率分布有放回的抽取和原始数据大小相同的样本集合,样本点可能出现重复,然后对每一次产生的训练集构造一个分类器,再对分类器进行组合。

(2)boosting
每一次抽样的样本分布都是不一样的。每一次迭代,都根据上一次迭代的结果,增加被错误分类的样本的权重,使得模型能在之后的迭代中更加注意到难以分类的样本,这是一个不断学习的过程,也是一个不断提升的过程,这也就是boosting思想的本质所在。

三、GBDT模型

GBDT只能由回归树组成,无论是分类还是回归问题,都采用CART回归树。

不会因为我们所选择的任务是分类任务就选用分类树,这里面的核心是因为gbdt 每轮的训练是在上一轮的训练的残差基础之上进行训练的。这里的残差就是当前模型的负梯度值 。这个要求每轮迭代的时候,弱分类器的输出的结果相减是有意义的。如果选用的弱分类器是分类树,类别相减是没有意义的

https://zhuanlan.zhihu.com/p/58105824

1. 原理

梯度提升的典型基函数即决策树(尤其是CART),GBDT算法在每一步迭代时是输出的值不一样,基本想法是让新的基模型(GBDT以CART分类回归树为基模型)用损失函数的负梯度去拟合前面模型的偏差,从而不断将加法模型的偏差降低

训练时采用前向分布算法进行贪婪的学习,每次迭代都学习一棵CART树来拟合之前 t-1 棵树的预测结果与训练样本真实值的残差

2. 构建流程

(1)回归模型

损失函数:均方差(最常用)、绝对损失、Huber损失、分位数损失

  • 初始化基学习器数量,损失函数,
  • 计算损失函数在第t-1棵树上的负梯度,每步学习一个基函数和系数,拟合第t棵cart回归树
  • (c)步找到一个最好的特征和它对应的最优特征值可以让当前式子的值最小
  • 机器学习模型_第12张图片
  • 加法模型更新得到强学习器
  •  
  • 机器学习模型_第13张图片

(2)分类模型

https://www.cnblogs.com/ModifyRong/p/7744987.html

由于输出值非连续,一个是用指数损失函数,此时GBDT退化为Adaboost算法。另一种方法是用类似于逻辑回归的对数似然损失函数的方法。也就是说,我们用的是类别的预测概率值和真实概率值的差来拟合损失。对于对数似然损失函数,又有二元分类和多元分类的区别

二分类:

多分类:

机器学习模型_第14张图片

GBDT 如何用于分类:
针对样本x每个可能的类都训练一个分类回归树,即每轮的训练都是同时训练k棵树,使用softmax来产生概率。

Softmax函数的定义:

GBDT如何正则化:

  • 和Adaboost类似的正则化项,通常我们用步长和迭代最大次数一起来决定算法的拟合效果。
  • 子采样比例(subsample)。取值为(0,1]。注意这里的子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。如果取值为1,则全部样本都使用,等于没有使用子采样。如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在[0.5, 0.8]之间。
  • 对于弱学习器即CART回归树进行正则化剪枝。

3.参数

(1)框架参数

  • n_estimators     learning_rate
  • subsample:子采样,不放回抽样。只有一部分样本会去做GBDT的决策树拟合,默认1,[0.5,0.8]
  •  loss: 即我们GBDT算法中的损失函数。分类模型和回归模型的损失函数是不一样的(分类模型,有对数似然损失函数"deviance"指数损失函数"exponential"两者输入选择。默认是对数似然损失函数"deviance")
  • alpha:这个参数只有GradientBoostingRegressor有,使用Huber损失"huber"和分位数损失“quantile”时,需要指定分位数的值。默认是0.9,如果噪音点较多,可以适当降低这个分位数的值

(2)弱学习器参数

  • 划分时考虑的最大特征数max_features
  • 决策树最大深度max_depth
  •  内部节点再划分所需最小样本数min_samples_split
  • 叶子节点最少样本数min_samples_leaf: 这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝
  • 叶子节点最小的样本权重和min_weight_fraction_leaf:这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝
  •  最大叶子节点数max_leaf_nodes: 通过限制最大叶子节点数,可以防止过拟合(通过交叉验证得到)
  • 节点划分最小不纯度min_impurity_split:  这个值限制了决策树的增长,如果某节点的不纯度(基于基尼系数,均方差)小于这个阈值,则该节点不再生成子节点。即为叶子节点 。一般不推荐改动默认值1e-7

4.调参实例

(1)先从n_estimators调整,设定较小的学习速率

param_test1 = {'n_estimators':range(20,81,10)}
gsearch1 = GridSearchCV(estimator = GradientBoostingClassifier(learning_rate=0.1, min_samples_split=300,
                                  min_samples_leaf=20,max_depth=8,max_features='sqrt', subsample=0.8,random_state=10), 
                       param_grid = param_test1, scoring='roc_auc',iid=False,cv=5)
gsearch1.fit(X,y)
gsearch1.grid_scores_, gsearch1.best_params_, gsearch1.best_score_

(2)找到合适的迭代次数后,调整max_depth  min_samples_split(暂时不定与其他参数相关)

(3)再对内部节点再划分所需最小样本数min_samples_split和叶子节点最少样本数min_samples_leaf一起调参。

(4)对最大特征数max_features、sub_sample进行网格搜索

(5)最后可以减半步长,最大迭代次数加倍来增加我们模型的泛化能力

四、xgboost模型

1. 模型学习

(1)目标函数 = 损失函数+正则项

机器学习模型_第15张图片机器学习模型_第16张图片

从目标函数的定义可以看出XGBoost对模型复杂度考虑了每颗树的叶节点个数,以及每颗树叶节点输出得分值得平方和

(2)模型优化

前向分步算法优化目标函数。-
机器学习模型_第17张图片

2. 特点

Shrinkage:相当于学习速率。XGBoost 在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间;

3. python使用

(1)通用参数

  • booster [default=gbtree]:还有gblinear可选
  • silent [default=0] :默认打印输出信息,否则为0
  • nthread [default to maximum number of threads available if not set] :线程数

(2)tree booster参数

  • eta [default=0.3] :学习速率,越小越保守,通常0.01-0.2
  • max_depth [default=6] :控制过拟合,应减小
  • min_child_weight [default=1]:孩子节点中最小的样本权重和,如果一个叶子节点的样本权重和小于min_child_weight则拆分过程结束。过拟合要调大
  • subsample [default=1] :用于训练模型的子样本占整个样本集合的比例,减小防止过拟合
  • colsample_bytree [default=1] :在建立树时对特征随机采样的比例
  • scale_pos_weight[default=0]:大于0的取值可以处理类别不平衡的情况

(3)Linear Booster参数

  • lambda [default=0] :L2 正则的惩罚系数,可以用来降低过拟合
  • alpha [default=0] :L1 正则的惩罚系数,当数据维度极高时可以使用,使得算法运行更快
  • lambda_bias :在偏置上的L2正则

调整顺序:

  1. 选择较高的学习速率(learning rate)。一般情况下,学习速率的值为0.1,通过CV确定决策树数目
  2.  max_depth 和 min_child_weight 参数调优:

    param_test1 = {
     'max_depth':range(3,10,2),
     'min_child_weight':range(1,6,2)
    }
    
    gsearch1 = GridSearchCV(estimator = XGBClassifier(learning_rate =0.1, n_estimators=140, max_depth=5,min_child_weight=1, gamma=0, subsample=0.8, colsample_bytree=0.8,
    objective= 'binary:logistic', nthread=4,     scale_pos_weight=1, seed=27), 
    param_grid = param_test1, scoring='roc_auc', n_jobs=4, iid=False, cv=5)
    
    gsearch1.fit(train[predictors],train[target])
    gsearch1.grid_scores_, gsearch1.best_params_,     gsearch1.best_score_
  3. 在选取的最佳max_depth 和 min_child_weight附近,选择小范围调优

  4. min_child_weight调整

  5. gamma: 

    param_test3 = {
     'gamma':[i/10.0 for i in range(0,5)]
    }
    
    gsearch3 = GridSearchCV(estimator = XGBClassifier( learning_rate =0.1, n_estimators=140, max_depth=4,
     min_child_weight=6, gamma=0, subsample=0.8, colsample_bytree=0.8, 
    objective= 'binary:logistic', nthread=4, scale_pos_weight=1,seed=27),
     param_grid = param_test3, scoring='roc_auc',n_jobs=4,iid=False, cv=5)
    
    gsearch3.fit(train[predictors],train[target])
    gsearch3.grid_scores_, gsearch3.best_params_, gsearch3.best_score_

    在节点分裂时,只有分裂后损失函数的值下降了,才会分裂这个节点。gamma指定了节点分裂所需的最小损失函数下降值。 这个参数的值越大,算法越保守。因为gamma值越大的时候,损失函数下降更多才可以分裂节点。

  6. subsample 和 colsample_bytree 参数: 分两个阶段来进行这个步骤。这两个步骤都取0.6,0.7,0.8,0.9作为起始值, 再细调

  7. 正则化参数调优: reg_alpha  reg_lambda

  8. 降低学习速率

五、LightGBM

1. 优点

  • 比xgb更快,内存使用更小
     
  • XGBoost不支持类别特征,需要OneHot编码预处理。LightGBM直接支持类别特征

2. xgboost基础上的优化

LightGBM = XGBoost + Histogram + GOSS + EFB

Histogram算法:直方图算法;GOSS算法:基于梯度的单边采样算法;EFB算法:互斥特征捆绑算法

(1)xgboost训练复杂度 = 树的棵数✖️每棵树上叶子的数量✖️生成每片叶子的复杂度

生成每片叶子的复杂度 = 特征数量✖️候选分裂点数量✖️样本的数量

Hitogram算法的主要作用是减少候选分裂点数量,GOSS算法的作用是减少样本的数量,EFB算法的作用是减少特征的数量

(2)Hitogram算法

直方图算法是替代XGBoost的预排序(pre-sorted)算法的,即预排序将样本按照特征取值排序,然后从全部特征取值中找到最优的分裂点位,该算法的候选分裂点数量与样本数量成正比

直方图算法通过将连续特征值离散化到固定数量(如255个)的bins上,使得候选分为点位为常数个(num_bins -1)

直方图做差加速直接,减少构建直方图的内存和时间。一个叶子的直方图可以由它的父亲节点的直方图与它兄弟的直方图做差得到。通常构造直方图,需要遍历该叶子上的所有数据,但直方图做差仅需遍历直方图的k个桶。

(3)GOSS算法

主要思想是通过对样本采样的方法来减少计算目标函数增益时候的复杂度,目的是丢弃一些对计算信息增益没有帮助的样本留下有帮助的。GOSS算法的创新之处在于它只对梯度绝对值较小的样本按照一定比例进行采样,而保留了梯度绝对值较大的样本

为了不改变样本分布:

机器学习模型_第18张图片

(3)EFB算法

EFB算法可以有效减少用于构建直方图的特征数量,从而降低计算复杂度,尤其是特征中包含大量稀疏特征的时候。

(4)稀疏特征处理,直接处理类别特征

对于指定为类别特征的特征,LightGBM可以直接将每个类别取值和一个bin关联,从而自动地处理它们,而无需预处理成onehot编码多此一举。

解释:通常可以认为这些稀疏特征是互斥的,即它们几乎不会同时取非零值,对于类别特征,如果转换成onehot编码,则这些onehot编码后的多个特征相互之间是互斥的,从而可以被捆绑成为一个特征。

(5)带深度限制的Leaf-wise的叶子生长策略

一般按层生长(level-wise)的决策树生长策略,因为它不加区分的对待同一层的叶子,带来了很多没必要的开销。实际上很多叶子的分裂增益较低,没必要进行搜索和分裂。

LightGBM采用Leaf-wise的增长策略,该策略每次从当前所有叶子中,找到分裂增益最大的一个叶子,然后分裂,如此循环。因此同Level-wise相比,Leaf-wise的优点是:在分裂次数相同的情况下,Leaf-wise可以降低更多的误差,得到更好的精度;Leaf-wise的缺点是:可能会长出比较深的决策树,产生过拟合。因此LightGBM会在Leaf-wise之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合

3. 调参

  • max_bin: 表示 feature 将存入的 bin 的最大数量
  • feature_fraction:为0.8时,意味着在每次迭代中随机选择80%的特征来建树
  • bagging_fraction: 每次迭代时用的数据比例
  • bagging_freq:  k 意味着每 k 次迭代执行bagging(过拟合时设置)
  • early_stopping_round:如果一次验证数据的一个度量在最近的early_stopping_round 回合中没有提高,模型将停止训练
  • min_gain_to_split: 描述分裂的最小 gain
  • max_cat_group:在 group 边界上找到分割点
  • categorical_feature: 如果 categorical_features = 0,1,2, 则列 0,1,2是 categorical 变量
  • num_boost_round: 迭代次数
  • num_leaves
  • 取值应 <= 2 ^(max_depth), 超过此值会导致过拟合
  • min_data_in_leaf: 将它设置为较大的值可以避免生长太深的树,但可能会导致 underfitting,在大型数据集时就设置为数百或数千

机器学习模型_第19张图片

五、随机森林

1. 原理

(1)决策树:是一个树结构(可以是二叉树或非二叉树)。其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别

(2)随机森林:弱学习器的组合,集成多个决策树的结果。在对预测输出进行结合时,对分类任务使用简单投票法,对回归任务使用简单平均法。

构建步骤:

  •  假如有N个样本,则有放回的随机选择N个样本(每次随机选择一个样本,然后返回继续选择)。这选择好了的N个样本用来训练一个决策树,作为决策树根节点处的样本
  •  当每个样本有M个属性时,在决策树的每个节点需要分裂时,从该节点的特征集中通过bootstrap的方法随机选择 m个特征的子集,随机从这M个属性中选取出m个属性,满足条件m << M。然后从这m个属性中采用某种策略(比如说信息增益)来选择1个属性作为该节点的最佳分裂属性
  • 每个节点都要重复步骤2(如果下一次该节点选出来的那一个属性是刚刚其父节点分裂时用过的属性,则该节点已经达到了叶子节点,无须继续分裂了)。一直到不能够再分裂为止。注意整个决策树形成过程中没有进行剪枝
  • 按照步骤1~3建立大量的决策树,这样就构成了随机森林了

2. 主要问题及注意点

(1)两个采样:行列的随机采样,防止过拟合

(2)列采样参数:通常将其设置为sqrt(n_features)以进行分类,这意味着如果有16个特征,则在每个树中的每个节点处,只考虑4个随机特征来拆分节点

2. 调参实现

  • n_estimators:随机森林模型中包含决策树模型的个数
  • max_depth:决策树模型的最大深度
  • max_features:用于构建决策树时选取的最大特征数量(默认‘sqrt’:\sqrt{N};  log:log2 N)
  • min_samples_leaf:叶子节点最少样本数
  • min_samples_split:当前节点允许分裂的最小样本数
  • criterion:节点分裂依据('gini', 'entropy')

3. 特征重要性原理

(1)评估思想:判断每个特征在随机森林中的每颗树上做了多大的贡献,然后取个平均值,最后比一比特征之间的贡献大小

(2)评估标准

  • 基于基尼系数:如果特征X出现在决策树J中的结点M,则计算节点M分枝前后的Gini指数变化量,假设随机森林由N棵树,则计算N次的Gini系数,最后将所有的Gini系数做一个归一化处理就得到了该特征的重要性。
  • 基于袋外数据错误率:外数据指的是每次随机抽取未被抽取达到的数据。测错误的样本数为X,则袋外数据误差为X/O,这个袋外数据误差记为errOOB1,下一步对袋外数据的特征A加入噪声干扰,再次计算袋外误差errOOB2,假设随机森林由N个分类器,则特征A的重要性为:sum(errOOB2-errOOB1)/N, 错误率变化越大则特征越重要。

六、shap value

1. 解释

从预测中把每一个特征的影响分解出来, 并了解正负性来自合作博弈论,所有可能联盟中特征值的平均边际贡献

SHAP是由Shapley value启发的可加性解释模型。对于每个预测样本,模型都产生一个预测值,SHAP value就是该样本中每个特征所分配到的数值。 

Shapley值是一种根据玩家对总支出的贡献来为玩家分配支出的方法,玩家在联盟中合作并从这种合作中获得一定的收益。用shaply值去解释机器学习的预测的话,其中“总支出”就是数据集单个实例的模型预测值,“玩家”是实例的特征值,“收益”是该实例的实际预测减去所有实例的平均预测。

一个样本中各特征SHAP值的和加上基线值应该等于该样本的预测值

2. Python shap

import shap
# model是在第1节中训练的模型
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(data[cols])

 可视化:

(1)单个样本

shap.initjs()
shap.force_plot(explainer.expected_value, shap_values[j], data[cols].iloc[j])

机器学习模型_第20张图片

(2) 对特征的总体分析

shap.summary_plot(shap_values, data[cols])

 机器学习模型_第21张图片

(3)部分依赖图

shap.dependence_plot('age', shap_values, data[cols], interaction_index=None, show=False)

 机器学习模型_第22张图片

24到31岁这个年纪对球员的身价是拉抬作用,小于24以及大于31岁的球员身价则会被年纪所累。

(4)对多个变量的交互进行分析

shap_interaction_values = shap.TreeExplainer(model).shap_interaction_values(data[cols])
shap.summary_plot(shap_interaction_values, data[cols], max_display=4)

机器学习模型_第23张图片

七、 聚类分析

1. 原理

根据样本数据的距离或相似度划分为若干组,划分的原则是组内距离最小化,组外间距最大化。

kmeans原理:

机器学习模型_第24张图片

2. 相似度度量

(1)闵可夫斯基距离/欧式距离

(2)余弦相似度

    机器学习模型_第25张图片

(3)pearson 相关系数

机器学习模型_第26张图片

(4)杰卡德相似系数

(5)K-L距离  相对熵

机器学习模型_第27张图片

3. 聚类可视化

  • 聚类分析可视化工具-TSNE(观测聚类效果)降维后看分类效果
  • 特征间的二维分布散点图(观测聚类效果) sns.FacetGrid()
  • 单个特征的概率密度函数(观测聚类结果是否具有业务意义)

4. 应用

  • 客户画像:可以基于众多数据,给客户进行分层分类,以便对目前运营的产品有完善的了解,如客户的性别、年龄、地区、职业、收入等;
  • 精准营销:利用贷前、贷中数据,挖掘真正有价值的客户,并找到其需求所在,精准推送,一网打尽;
  • 反欺诈:清洗欺诈特征(如首逾)进行数据挖掘,找到明细有欺诈倾向客户和正常客户的差异。

5.其他聚类

(1)层次聚类

凝聚和分裂:不需要指定类别数

(2)基于密度的聚类  DBSCAN

原理:主要目标是相比基于划分的聚类方法和层次聚类方法,需要更少的领域知识来确定输入参数;发现任意形状的聚簇;在大规模数据库上更好的效率。DBSCAN能够将足够高密度的区域划分成簇,并能在具有噪声的空间数据库中发现任意形状的簇。

DBSCAN的核心思想是从某个核心点出发,不断向密度可达的区域扩张,从而得到一个包含核心点和边界点的最大化区域,区域中任意两点密度相连。

步骤:

  • 首先选取一个未标记类别的核心点,并创建一个新簇;(核心点: 邻域中至少包含minpts个点(含中心点自身))
  • 然后,寻找所有从该核心点出发关于ε和MinPts密度可达的点并标记为该簇;否则p是边界点或噪声点(非核心点)
  • 重复这个过程,直至处理完所有点,即没有未标记簇的核心点

存在的问题:

DBSCAN参数选取:

- 参数(ϵ, MinPts)用来描述邻域的样本分布紧密程度。
    - ϵ 描述了某一样本的邻域距离阈值,MinPts描述了某一样本的距离为ϵ的邻域中样本个数的阈值。

使用了统一的\varepsilon邻域值和Minpts(最小点数)值,在类中的数据分布密度不均匀时,\varepsilon较小时,密度小的cluster会被划分成多个性质相似的cluster;\varepsilon较大时,会使得距离较近且密度较大的cluster被合并成一个cluster

6. 问题

(1)特征维数过多

  • 相关性剔除
  • 只选取和业务相关的特征,比如购物偏好目标,无需加入性别和年龄等个人信息,影响聚类效果
  • 主成分分析(不建议)

主成分分析是通过正交变化将一组相关性的特征转换为非线性相关的特征,转换后的变量叫主成分,也是特征值对应的特征向量。

一方面,主成分分析会损失很多原始数据信息;另一方面,主成分分析保留下来的主成分也很难有解释性,因为数据已经被正交变换了。

(3)kmeans 的K选取

  • 肘部法:组内平方和的降低拐点

核心思想:随着聚类数k的增大,样本划分会更加精细,每个簇的聚合程度会逐渐提高,那么误差平方和SSE自然会逐渐变小。并且,当k小于真实聚类数时,由于k的增大会大幅增加每个簇的聚合程度,故SSE的下降幅度会很大,而当k到达真实聚类数时,再增加k所得到的聚合程度回报会迅速变小,所以SSE的下降幅度会骤减,然后随着k值的继续增大而趋于平缓。

  • 轮廓系数法

某个样本点Xi的轮廓系数定义如下:

机器学习模型_第28张图片

其中,a是Xi与同簇的其他样本的平均距离,称为凝聚度,b是Xi与最近簇中所有样本的平均距离,称为分离度

用Xi到某个簇所有样本平均距离作为衡量该点到该簇的距离后,选择离Xi最近的一个簇作为最近簇;

平均轮廓系数的取值范围为[-1,1],且簇内样本的距离越近,簇间样本距离越远,平均轮廓系数越大,聚类效果越好

八、常见问题

(1)GBDT中的梯度是什么对什么的梯度?

当前损失函数L(yi, F(x))对树F(xi)的梯度

(2)XGBoost和GBDT的区别

  • xgboost在代价函数里加入了正则项,用于控制模型的复杂度,降低过拟合。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和
  • 传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数
  • 和GBDT只支持CART作为基分类器之外,还支持线性分类器,在使用线性分类器的时候可以使用L1,L2正则化
  • 在寻找最佳分割点时,考虑到传统的贪心算法效率较低,实现了一种近似贪心算法,用来加速和减小内存消耗
  • 考虑了稀疏数据集和缺失值的处理,对于特征的值有缺失的样本,XGBoost依然能自动找到其要分裂的方向
  • XGBoost支持并行处理,XGBoost的并行不是在模型上的并行,而是在特征上的并行。xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,方便计算一阶导和二阶导数值,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行
  • 支持列抽样
  • 缺失值处理:对树中的每个非叶子结点,XGBoost可以自动学习出它的默认分裂方向。如果某个样本该特征值缺失,会将其划入默认分支。

(3)XGBOOST是如何处理缺失值的?

xgboost为缺失值设定了默认的分裂方向,xgboost在树的构建过程中选择能够最小化训练误差的方向作为默认的分裂方向,即在训练时将缺失值划入左子树计算训练误差,再划入右子树计算训练误差,然后将缺失值划入误差小的方向。

(4)XGBOOST采样时有放回的还是无放回的?

xgboost属于boosting方法的一种,所以采样时样本是不放回的,因而每轮计算样本不重复,另外,xgboost支持子采样,每轮计算可以不使用全部的样本,以减少过拟合。

(5)特征重要性原理

importance_type参数支持三种特征重要性的计算方法:

  • importance_type=weight(默认值),使用特征在所有树中作为划分属性的次数
  • importance_type=gain,使用特征在作为划分属性时loss平均的降低量
  • importance_type=cover,使用特征在作为划分属性时对样本的覆盖度

(6)xgboost为什么快

  • 分块并行:训练前每个特征按特征值进行排序并存储为Block结构,后面查找特征分割点时重复使用,并且支持并行查找每个特征的分割点
  • 候选分位点:每个特征采用常数个分位点作为候选分割点

  • CPU cache 命中优化: 使用缓存预取的方法,对每个线程分配一个连续的buffer,读取每个block中样本的梯度信息并存入连续的Buffer中。

(7) RF和GBDT区别?

  • 集成学习:RF属于bagging思想,而GBDT是boosting思想

  • 偏差-方差权衡RF不断的降低模型的方差,而GBDT不断的降低模型的偏差

  • 训练样本:RF每次迭代的样本是从全部训练集中有放回抽样形成的,而GBDT每次使用全部样本

  • 并行性:RF的树可以并行生成,而GBDT只能顺序生成(需要等上一棵树完全生成)

  • 最终结果:RF最终是多棵树进行多数表决(回归问题是取平均),而GBDT是加权融合

  • 数据敏感性:RF对异常值不敏感,而GBDT对异常值比较敏感

  • 泛化能力:RF不易过拟合,而GBDT容易过拟合

(8)xgboost如何处理不平衡数据

  • 更关注AUC:采用AUC来评估模型的性能,可以通过设置scale_pos_weight来平衡正样本和负样本的权重。例如,当正负样本比例为1:10时,scale_pos_weight可以取10;(增大了少数样本权重)
  • 关注概率(预测得分的合理性):不能重新平衡数据集(会破坏数据的真实分布),应该设置max_delta_step为一个有限数字来帮助收敛(基模型为LR时有效)

(9)当在高维稀疏特征的场景下,LR的效果一般会比GBDT好

树模型过拟合的更严重,同样是对于y = W1*f1 + Wi*fi+…,LR 等线性模型的正则项是对权重的惩罚,也就是 W1一旦过大,惩罚就会很大,进一步压缩 W1的值,使他不至于过大。但是,树模型则不一样,树模型的惩罚项通常为叶子节点数和深度等,树只需要一个节点就可以完美分割9990和10个样本,一个结点,最终产生的惩罚项极其之小。

(10)XGBoost模型如果过拟合了怎么解决

  • 直接控制模型的复杂度。包括max_depth,min_child_weight,gamma 等参数
  • 增加随机性,从而使得模型在训练时对于噪音不敏感。包括subsample,colsample_bytree
  • 减小学习程度,即减小learning rate,但需要同时增加estimator 参数

(11)xgboost如何选择最佳分裂点?

XGBoost在训练前预先将特征按照特征值进行了排序,并存储为block结构,以后在结点分裂时可以重复使用该结构。

因此,可以采用特征并行的方法利用多个线程分别计算每个特征的最佳分割点,根据每次分裂后产生的增益,最终选择增益最大的那个特征的特征值作为最佳分裂点。

(12) AUC 

机器学习模型_第29张图片

首先AUC值是一个概率值,当你随机挑选一个正样本以及负样本,当前的分类算法根据计算得到的Score值将这个正样本排在负样本前面的概率就是AUC值,AUC值越大,当前分类算法越有可能将正样本排在负样本前面,从而能够更好地分类。

横轴FPR:1-TNR,1-Specificity,FPR越大,预测正类中实际负类越多。

纵轴TPR:Sensitivity(正类覆盖率),TPR越大,预测正类中实际正类越多。

TPR和FPR是基于真实样本表现看的,也就是在真实正负样本中去关注概率问题,AUC对样本类别是否均衡并不敏感,这也是不均衡样本通常用AUC评价分类器性能的一个原因。

AUC能很好描述模型整体性能的高低,反应的是对客户进行正确排序的能力

 

计算方法:统计一下所有的 M×N(M为正类样本的数目,N为负类样本的数目)个正负样本对中,有多少个组中的正样本的score大于负样本的score。

随机抽取一个样本, 对应每一潜在可能值X都对应有一个判为正样本的概率P。

对一批已知正负的样本集合进行分类,按概率从高到矮排个降序, 对于正样本中概率最高的,排序为rank_1, 比它概率小的有M-1个正样本(M为正样本个数), (rank_1 - M) 个负样本。

正样本概率第二高的, 排序为rank_2, 比它概率小的有M-2个正样本,(rank_2 - M + 1) 个 负样本。

以此类推

正样本中概率最小的, 排序为rank_M,比它概率小的有0个正样本,rank_M - 1 个负样本。

总共有MxN个正负样本对(N为负样本个数)。把所有比较中 正样本概率大于负样本概率 的例子都算上, 得到公式(rank_1 - M + rank_2 - M + 1 .... + rank_M - 1) / (MxN) 就是正样本概率大于负样本概率的可能性了。 化简后(因为后面是个等差数列)得:

(13)KS

当KS不佳时,为了达到KS的预期目标,我们可以从哪些方面着手去优化呢?一般建议如下:

  1. 检验入模变量是否已经被策略使用,使用重复变量会导致区分度不高。
  2. 检验训练样本与验证样本之间的客群差异是否变化明显?样本永远是统计学习中的重要部分。
  3. 开发对目标场景更具针对性的新特征。比如,识别长期信用风险,就使用一些强金融属性变量;识别欺诈风险,就使用一些短期负面变量。
  4. 分群建模或分群测算。分群需要考虑稳定性和差异性。

(14)为什么用KS评估?

KS指标倾向于从概率角度衡量正负样本分布之间的差异。正是因为正负样本之间的模糊性和连续性(即y的定义并非是非黑即白),所以KS也是一条连续曲线。但最终为什么取一个最大值,主要原因是提取KS曲线中的一个显著特征,从而便于相互比较

(15)为什么通常认为KS在高于75%时就不可靠?

  • 如果KS达到80%以上,此时ROC曲线就会变得很畸形。
  • 为了便于制定策略,模型评分在放贷样本上一般要求服从正态分布。如果出现这种明显的双峰分布或者更极端的分布,就不太符合业务sense
  • 正负样本完全分错也可能KS很高

机器学习模型_第30张图片

(16)F1-SCORE

机器学习模型_第31张图片

召回率——灵敏度——TPR

特异度——1-FPR=1-FP/(FP+TN)=TN/(FP+TN)

关注的是P,一般超过threshold的就是P,threshold 的调整,不是随便调的,设的越高,灵敏度就越低,设的越低,假阳性就越多。

(17)PR曲线

机器学习模型_第32张图片

https://blog.csdn.net/zwqjoy/article/details/84859405(关于模型评估指标)

(18) AdaBoost V.S. GBDT

和AdaBoost一样,Gradient Boosting也是重复选择一个表现一般的模型并且每次基于先前模型的表现进行调整。

可以说AdaBoost是GBDT特例。

区别:

  • Adaboost:  指数损失函数,基分类器一般为决策树,每一轮提升错误分类样本权重
  • Gradient Boosting:通过算梯度(gradient)来定位模型的不足,可以使用更多种类的目标函数。当目标函数是均方误差时,计算损失函数的负梯度值在当前模型的值即为残差。

 

你可能感兴趣的:(机器学习)