2022机器学习阶段性复盘
文章目录
- 2022机器学习阶段性复盘
- 一、业务洞察
- 1.1 业务调研
- 1.2 采样策略
- 一、特征工程
- 1.1 特征筛选之iv_psi
- 1.2 特征筛选之启发式搜索
- 1.3 时间特征的曲率变换
- 1.4 多重共线性特征的剔除
- 1.5 什么样的特征适合树模型或LR模型
- 1.5 什么样的特征是稳定可泛化特征
- 二、机器学习
- 1.4 什么样的特征适合LR
- 2.1 refit训练
- 2.2 Wide&Deep的改动思考
- 2.3 LightGBM与RF的思考
- 2.4 深度学习结合optuna的调参策略
- 2.5 小样本建模的挑战
- 2.6 多目标学习-多塔构建思路
- 2.7 神经网络偏置项如何更新
- 2.8 神经网络BN层的意义
- 2.9 L1与L2正则项的正确解读
- 2.9 weight_decay的解读-L2正则项系数
- 2.10 数值特征归一化的选择
- 2.11 优化器的选择
- 多分类损失函数
- FM公式推导
- 手写卷积代码
- 皮尔逊系数
- 三、前瞻性模型调研
- 3.1 Transformer的预训练与下游finetune
- 3.2 腾讯广告大赛冠军方案
- 3.3 整体nn.Embedding和独立Embedding的差异
- 3.4 ChatGPT中Reward Model机制
- 三、销售能力建模
- 3.1 销售能力重点指标
- 3.2 ELO算法
- 3.3 融合ELO的线性回归算法
- 四、分发策略
- 4.1 优选与优配策略
- 4.2 假设检验及应用
- 4.3 评估策略理论收益
- 五、工程能力
- 5.1 torch常用指令
- 5.1 分布式云梯框架
- 5.2 torch.script模型部署
- 5.3 onnx模型部署
- 5.4 类scikit-learn的模型部署
- 六、重点踩坑
- 6.1 数据穿越&训练集测试集不同分布的危害
- 七、面试复盘
- 7.1 spark实现k-means
一、业务洞察
1.1 业务调研
基本情况:公司概况,各SKU的总营收,客单价,转化率,投流,销售;
调研评估:策略覆盖度,投放占比等;
分配过程:了解端到端的线索投流到转化的全流程,至关重要,涉及AB桶试验设计;
调研问题清单:行业概况,公司概况,时间周期规律,用户画像,组织架构;
数据基建:了解重点分配表,订单表等数据,目标是串联整个分配流程。对齐数据及口径一致性;
销售访谈:
- 销售流程的拆解,包括线索获取,外呼,跟进,成单
- 典型的一天工作安排是怎样的?一天多少新量,多少老量?多少量是合适的?
- 怎么判断高意向客户?
- 怎么保证每个月业绩稳定?
- 核心话术分享?
- 逼单的技巧?
- 什么情况放弃一个客户?
- 成单用户的维护?如何促进复购?
- 公司的激励措施
- 人员流动发生时,客户怎么交接?
1.2 采样策略
一、特征工程
1.1 特征筛选之iv_psi
信息价值IV与群体稳定性PSI
-
WOE定义:对每一特征下的每种取值,统计该取值下的正负样本数量与该特征下的正负样本数量之间的关系
W O E i = l n ( N e g i N e g T / P o s i P o s T ) = l n ( N e g i N e g T ) − l n ( P o s i P o s T ) WOE_i=ln(\frac{Neg_i}{Neg_T}/\frac{Pos_i}{Pos_T})=ln(\frac{Neg_i}{Neg_T})-ln(\frac{Pos_i}{Pos_T}) WOEi=ln(NegTNegi/PosTPosi)=ln(NegTNegi)−ln(PosTPosi) -
IV定义:IV值的计算是对WOE值的加权和, 在 W O E WOE WOE的基础上量化了该特征下每一取值在差异占比上的相对关系。也就是说,如果某个分组样本正负样本差异占总体数量比较低,那么对预测其实贡献也是比较低的,所以会给WOE基础上再打个折。
I V = Σ i n ( 负样本占比 − 正样本占比 ) ∗ W O E i IV = \Sigma^n_i(负样本占比-正样本占比)*WOE_i IV=Σin(负样本占比−正样本占比)∗WOEi
I V i = ( N e g i N e g T − P o s i P o s T ) ∗ W O E i = ( N e g i N e g T − P o s i P o s T ) ∗ l n ( N e g i N e g T / P o s i P o s T ) IV_i=(\frac{Neg_i}{Neg_T}-\frac{Pos_i}{Pos_T})*WOE_i=(\frac{Neg_i}{Neg_T}-\frac{Pos_i}{Pos_T})*ln(\frac{Neg_i}{Neg_T}/\frac{Pos_i}{Pos_T}) IVi=(NegTNegi−PosTPosi)∗WOEi=(NegTNegi−PosTPosi)∗ln(NegTNegi/PosTPosi)
I V = Σ i n I V i IV=\Sigma^n_iIV_i IV=ΣinIVi -
psi定义:
p s i = Σ ( A − E ) ∗ l n ( A / E ) = Σ ( c n t i c n t t e s t − c n t i c n t t r a i n ) ∗ l n ( c n t i c n t t e s t / c n t i c n t t r a i n ) psi=\Sigma(A-E)*ln(A/E) = \Sigma(\frac{cnt_{i}}{cnt_{test}} - \frac{cnt_{i}}{cnt_{train}})*ln(\frac{cnt_i}{cnt_{test}}/\frac{cnt_i}{cnt_{train}}) psi=Σ(A−E)∗ln(A/E)=Σ(cnttestcnti−cnttraincnti)∗ln(cnttestcnti/cnttraincnti)
与iv计算框架一致,不同的是参与iv计算的是同一份数据下该取值的负样本率和正样本率,而psi是两份数据下该取值的占比 -
ppsi定义:
p p s i = Σ ( A − E ) ∗ l n ( A / E ) = Σ ( P o s i P o s t e s t − P o s i P o s t r a i n ) ∗ l n ( P o s i P o s t e s t / P o s i P o s t r a i n ) ppsi=\Sigma(A-E)*ln(A/E) = \Sigma(\frac{Pos_{i}}{Pos_{test}} - \frac{Pos_{i}}{Pos_{train}})*ln(\frac{Pos_i}{Pos_{test}}/\frac{Pos_i}{Pos_{train}}) ppsi=Σ(A−E)∗ln(A/E)=Σ(PostestPosi−PostrainPosi)∗ln(PostestPosi/PostrainPosi)
IV的头半段其实反映出了该分组的有响应和无响应分别占总体的比例。
woe有正有负,而iv由于 ( 负样本占比 − 正样本占比 ) (负样本占比-正样本占比) (负样本占比−正样本占比)和 W O E i WOE_i WOEi方向相同,乘积是正的;
分箱越细,IV越高,因此分箱要控制在10以内,最小箱占比5%;
只能应用于二分类场景;
IV与PSI的共同点,都是对两个概率分布的差异性的衡量,IV是对同一份数据中正负样本的衡量,PSI是对两份数据中取值占比的衡量,ppsi是对两份数据中正样本率的衡量;
1.2 特征筛选之启发式搜索
利用可解释性强的backbone(如LR),从1个特征开始训练,每次新增一个特征加入训练,每次从剩余的特征列表中选出考试结果最优的特征进行保留,继续进行下一轮特征筛选,直到考试结果不再增长;
特征列表务必要保证是稳定可用的特征,避免选出的特征存在不稳定特征造成过拟合,可利用value_counts(), iv_psi等手段粗筛一波
考试结果可选取K折验证的validset集合,最后投票选择;
1.3 时间特征的曲率变换
对于时间类特征,若定义域在0-1之间,直接做log变换并不足够的凸显差异(近乎于y=x),做曲率变换是为了加大差异程度;
1.4 多重共线性特征的剔除
- 根据特征构造逻辑和经验,进行去重;
- 对num型特征,根据person系数进行去重;
1.5 什么样的特征适合树模型或LR模型
LR模型对于cat型特征,只能采取onehot编码进行表达,要保留最精简特征,同质特征会分散信息权重;
而树模型,本质是一种if-then的策略,onehot的表达会使得一个特征被离散化后,分别做if-else的分裂,导致一个特征的表达过于分散。
1.5 什么样的特征是稳定可泛化特征
- 泛化性通过的基于LR的启发式搜索
二、机器学习
1.4 什么样的特征适合LR
LR本质是对历史特征进行加权求和的操作, y = Σ w x + b y=\Sigma wx+b y=Σwx+b, 求得的是与目标的线性关系
- 线性相关性越强,越适合LR,最适合的方案应当是泛化性通过的启发式搜索,其次是简单的iv,psi观察;
- 某些num特征更适合分箱处理,因为num特征只有一维,根据公式而言,LR只能学得该特征与目标的线性权重,非线性信息无法学得,因此对此类特征进行分箱,才更适合LR学习;
2.1 refit训练
-
valid refit训练
神经网络在训练时需要配置validset以进行early_stopping和观察过拟合情况,训练集天然缺少valid数据,为了弥补valid数据没参与训练的损失,可以在early_stopping发生后,进行refit。可尝试将train+valid进行Oversampling的数据,进行1-2epoch补充训练。 -
数据集时效性增强refit
对于toB的convertion场景,客户方业务变动直接反映在数据的时效性上,时间上越接近当下的数据就越接近线上的情况,因此可对训练集中时间接近当下的样本,进行过采样(如直接复制,按比例复制等),从结果上看来对测试集的效果有正向作用。
2.2 Wide&Deep的改动思考
原始的WD就Wide和Deep独立处理,最后合并输出。
问题:Wide就是LR没什么好说的,但Deep非常容易产生过拟合
Wide不断拼接Deep,即残差块,Wide直接添加到每一deep_layer的输出
一方面,可以避免梯度消失
一方面,保留最有信息的特征,避免该deep-layer学习到的信息量很少
一方面,
2.3 LightGBM与RF的思考
2.4 深度学习结合optuna的调参策略
以Wide&Deep为例,需要调的参数包括了embedding_size, layers, dropout, learning_rate等,手工调参太过于依赖经验,需要借助optuna进行调参;
- 层数不要作为参数,一个探索任务的层数应固定下来,调节隐层神经元数量,以节省optuna的参数空间;
- 训练过程要设置early_stopping,可以以auc_valid作为指标,patience>=7作为早停条件,返回给optuna的是auc_valid_best;
- 为了试验可复现性,请务必每次在optuna.trial前设置随机种子
2.5 小样本建模的挑战
- 尽可能使用简单的模型;
- 神经网络的参数尽可能少,主要体现在正则化Dropout,隐含层和神经元数量在不影响效果的情况下,尽可能少;
- 特征数量尽可能精简,可使用LR启发式搜索挑出泛化性强的特征作为Wide,Deep在wide特征基础上,结合业务洞察加入特征;
- 模型评估时,要切换随机种子,交叉验证。
2.6 多目标学习-多塔构建思路
- 硬参数共享
即Embedding, Linear等层的weight实现共享。
硬参数共享大大降低了过度拟合的风险。实际上,实验表明过度拟合共享参数的风险是N阶的。 其中N是任务数 , 小于过度拟合任务特定参数,即输出层。这在直觉上是有道理的:我们同时学习的任务越多,我们的模型就越能找到捕获所有任务的表示,我们对原始任务过度拟合的可能性就越小。
2.7 神经网络偏置项如何更新
结论:偏置项也会被更新
首先理解偏置的功能
-
偏置可以加速神经网络拟合,对于二维空间而言, f(x) = wx是一个过原点的直线,但过原点的直线(超平面)不一定满足当下的分类任务,因此需要偏置项;
-
偏置b可以视为控制每个神经元的阈值(-b等于神经元阈值);
每个神经元单独设置阈值等价于在每一层加入一个没有输入,输出恒为1的偏置神经元,下一层的神经元的bias等价于这个偏置神经元输出的权值,也就是说只要调整权重就能等效调整阈值 -
神经网络加偏置的神经元
f(w0x0+w1x1+…+wn*xn),其中x0代表偏置,是一个恒为1的神经元,w0是其对应的权重
2.8 神经网络BN层的意义
神经网络BN层的意义
2.9 L1与L2正则项的正确解读
L1与L2正则项的直观理解
损失函数等高线理解
2.9 weight_decay的解读-L2正则项系数
结论:在L2正则项前乘的系数,反映在权重更新公式上,是一个令权重不断减小的系数,已达到防止过拟合的目的
带L2正则项的损失函数为
其中C0代表原始的代价函数,后面那一项就是L2正则化项,系数λ就是权重衰减系数。
对于权重的更新如下所示:
因此,最终体现在权重更新的公式上,weight_decay与原始w结合,除正则项带来的缩减以外,w本身也在逐渐减小,达到防止过拟合的作用。
2.10 数值特征归一化的选择
Q:数值特征主要围绕[0,1]好还是[-1,1]好?
0,1归一化,让处于0的特征,学不到任何有价值的信息,因此需要做min,max截断处理,缺失值填充0
一般选择归一到[-1,1], 因为大部分网络是偏好零对称输入的,我们使用的激活函数一般都是ReLU,如果ReLU的输入都是正数,那么它其实就是一个恒等函数,有没有它都一个样,ReLU就失去了意义。
2.11 优化器的选择
-
随机梯度下降SGD:
对每个训练样本进行参数更新,每次执行都进行一次更新,且执行速度更快。
θ=θ−η⋅∇(θ) × J(θ;x(i);y(i)),其中x(i)和y(i)为训练样本。优点:
频繁的更新使得参数间具有高方差,损失函数会以不同的强度波动。这实际上是一件好事,因为它有助于我们发现新的和可能更优的局部最小值,而标准梯度下降将只会收敛到某个局部最优值。缺点:
但SGD的问题是,由于频繁的更新和波动,最终将收敛到最小限度,并会因波动频繁存在超调量。 -
Batch-wise的SGD(常用)
为了避免SGD和标准梯度下降中存在的问题,一个改进方法为小批量梯度下降,即每一个batch,进行一次随机梯度下降;优点:
可以减少参数更新的波动,最终得到效果更好和更稳定的收敛。
由于矩阵运算,使得计算更加高效 -
带动量的SGD
SGD方法中的高方差振荡使得网络很难稳定收敛,所以有研究者提出了一种称为动量(Momentum)的技术,通过优化相关方向的训练和弱化无关方向的振荡,来加速SGD训练。换句话说,这种新方法将上个步骤中更新向量的分量’γ’添加到当前更新向量。V(t)=γV(t−1)+η∇(θ).J(θ),最后通过θ=θ−V(t)来更新参数。
优点:
使网络能更优和更稳定的收敛;
减少振荡过程。缺点:
当小球达到曲线上的最低点时,动量相当高。由于高动量可能会导致其完全地错过最小值,因此小球不知道何时进行减速,故继续向上移动当其梯度指向实际移动方向时,动量项γ使得权重更新更快;当梯度与实际移动方向相反时,由于γ使得权重更新变缓。这种方式意味着动量项只对相关样本进行参数更新,减少了不必要的参数更新,从而得到更快且稳定的收敛,也减少了振荡过程。
-
Adam自适应优化器
就是好
多分类损失函数
结论:交叉熵损失函数, torch.nn.CrossEntropyLoss(),即softmax+交叉熵
交叉熵=信息熵=信息量的数学期望:
−
Σ
p
∗
l
o
g
(
y
′
)
-\Sigma p*log(y')
−Σp∗log(y′)
FM公式推导
FM模型
手写卷积代码
def convolution(k, data):
# k:3x3卷积核
n,m = data.shape
img_new = []
for i in range(n-3):
line = []
for j in range(m-3):
a = data[i:i+3,j:j+3]
line.append(np.sum(np.multiply(k, a)))
img_new.append(line)
return np.array(img_new)
皮尔逊系数
用于衡量两个连续变量的相关系数
p
e
a
r
s
o
n
=
c
o
v
(
X
,
Y
)
σ
x
σ
y
pearson=\frac{cov(X, Y)}{\sigma_x\sigma_y}
pearson=σxσycov(X,Y),即两个连续变量的协方差/各自的标准差
c
o
v
(
X
,
Y
)
=
1
n
−
1
Σ
(
X
−
X
‾
)
(
Y
−
Y
‾
)
cov(X,Y) = \frac{1}{n-1}\Sigma(X-\overline{X})(Y-\overline{Y})
cov(X,Y)=n−11Σ(X−X)(Y−Y)
三、前瞻性模型调研
3.1 Transformer的预训练与下游finetune
Attention与Transformer
Transformer与下游finetune
3.2 腾讯广告大赛冠军方案
3.3 整体nn.Embedding和独立Embedding的差异
整体embedding:所有的cat特征构造一份lookup table
独立embedding: 每个特征都有自己的lookup table
3.4 ChatGPT中Reward Model机制
Reward Modeling
下图是ChatGPT中权重的更新逻辑,可以看到Reward Model的创新主要是采用了相对的人工排序,来计算Loss
其中,yw 代表排序排在 yl 的所有句子。用上述例子(A > B > C > D)来讲,loss 应该等于:
l
o
s
s
=
r
(
A
)
−
r
(
B
)
+
r
(
A
)
−
r
(
C
)
+
r
(
A
)
−
r
(
D
)
+
r
(
B
)
−
r
(
C
)
+
.
.
.
+
r
(
C
)
−
r
(
D
)
loss = r(A) - r(B) + r(A) - r(C) + r(A) - r(D) + r(B) - r(C) + ... + r(C) - r(D)
loss=r(A)−r(B)+r(A)−r(C)+r(A)−r(D)+r(B)−r(C)+...+r(C)−r(D)
l
o
s
s
=
−
l
o
s
s
loss = -loss
loss=−loss
为了更好的归一化差值,我们对每两项差值都过一个 sigmoid 函数将值拉到 0 ~ 1 之间。可以看到,loss 的值等于排序列表中所有「排在前面项的reward」减去「排在后面项的reward」的和。而我们希望模型能够「最大化」这个「好句子得分」和「坏句子得分」差值,而梯度下降是做的「最小化」操作。
三、销售能力建模
3.1 销售能力重点指标
3.2 ELO算法
3.3 融合ELO的线性回归算法
四、分发策略
4.1 优选与优配策略
4.2 假设检验及应用
4.3 评估策略理论收益
优配乘积=各档名片转化率*各档销售转化率
优配基线乘积=名片平均转化率*各档销售转化率
优配后平均期望=avg(各档优配乘积)
优配后基线平均期望=avg(各档优配基线乘积)
提升效果=优配后平均期望/优配后基线平均期望
● 公式如下:
五、工程能力
5.1 torch常用指令
5.1 分布式云梯框架
5.2 torch.script模型部署
5.3 onnx模型部署
5.4 类scikit-learn的模型部署
六、重点踩坑
6.1 数据穿越&训练集测试集不同分布的危害
2022-12-01以来,持续两个月的攻坚,最终告一段落,起因是经过方法论提炼的特征,能经过历史4个月的考验。
- 第三方数据方更新版本,版本之间的数据diff非常大,使得模型必须重新训练。但由于第三方数据不存在回溯逻辑,开工前已经建立起了数据穿越的可能。
- 业务对应的是考研,且2022-12/2023-01/2023-02,分别发生了疫情解禁,考研结束,春节,复工四大标志性事件,使得这期间的数据分布与9/10/11月的训练数据分布存在差异,但客观条件是我们也没有更多数据支撑了;
- 模型攻坚方向经历了,非线性模型 -> 数据时效性增强 -> 多目标双塔模型,均无显著收益。
- 最终怀疑第三方数据发生穿越,且刚好穿越了12-01-02三个和业务强相关的三个月,于是将和业务强相关的特征全部剔除,保留了穿越影响小的特征。效果稳定上升。
七、面试复盘
7.1 spark实现k-means
算法实现步骤
step1 首先随机选取k个样本点最为初始聚类中心
step2 计算每个样本到聚类中心的距离,将该样本归属到最近的聚类中心
step3 将每个类的点的均值作为新的聚类中心
step4 重复2、3步骤直到代价函数不再发生较大大变化或达到迭代次数