2022机器学习阶段性复盘

news2024/11/29 10:30:50

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. 典型的一天工作安排是怎样的?一天多少新量,多少老量?多少量是合适的?
  3. 怎么判断高意向客户?
  4. 怎么保证每个月业绩稳定?
  5. 核心话术分享?
  6. 逼单的技巧?
  7. 什么情况放弃一个客户?
  8. 成单用户的维护?如何促进复购?
  9. 公司的激励措施
  10. 人员流动发生时,客户怎么交接?

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=(NegTNegiPosTPosi)WOEi=(NegTNegiPosTPosi)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=Σ(AE)ln(A/E)=Σ(cnttestcnticnttraincnti)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=Σ(AE)ln(A/E)=Σ(PostestPosiPostrainPosi)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') Σplog(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)=n11Σ(XX)(YY)

三、前瞻性模型调研

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步骤直到代价函数不再发生较大大变化或达到迭代次数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/576405.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

cuda编程学习——GPU加速/时间计时Clock 干货向(五)

前言 参考资料: 高升博客 《CUDA C编程权威指南》 以及 CUDA官方文档 CUDA编程:基础与实践 樊哲勇 文章所有代码可在我的GitHub获得,后续会慢慢更新 文章、讲解视频同步更新公众《AI知识物语》,B站:出门吃三碗饭 …

路径规划算法:基于花授粉优化的路径规划算法- 附代码

路径规划算法:基于花授粉优化的路径规划算法- 附代码 文章目录 路径规划算法:基于花授粉优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍利用智能优化算法…

面试官:这么简单的二叉树算法都不会?

今天我们来看一个有趣的算法题,也是一道高频面试题。这个题目是leetcode的第572题,要求是这样的:给定两颗二叉树A和B,判断B是否是A的子树。在下面这个例子中可以看到B是A的子树。 想一想该怎样解决这个问题呢?如果B是A…

Python丨tkinter开发常用的29种功能用法(建议码住)

在Python软件开发中,tkinter中command功能的作用是为按钮、菜单等组件绑定回调函数,用户操作该组件时会触发相应的函数执行。 本文涵盖了各种组件和功能: 1、为Button组件(按钮)绑定回调函数 import tkinter as tk …

模拟量偏差报警功能块(SCL代码)

工业模拟量采集的相关基础知识,可以查看专栏的系列文章,这里不再赘述,常用链接如下: PLC模拟量采集算法数学基础(线性传感器)_plc傳感器數據轉化_RXXW_Dor的博客-CSDN博客模拟量采集库如何设计,具体算法代码请参看我的另一篇博文:PLC模拟量输入 模拟量转换FC:S_ITR_R…

栈和队列(详解)

🍕博客主页:️自信不孤单 🍬文章专栏:数据结构与算法 🍚代码仓库:破浪晓梦 🍭欢迎关注:欢迎大家点赞收藏关注 文章目录 🍓栈1. 栈的概念及结构2. 栈的实现2.1 初始化栈2.…

MySQL运维篇(三)

五.读写分离 5.1 介绍 读写分离,简单地说是把对数据库的读和写操作分开,以对应不同的数据库服务器。主数据库提供写操作,从数据库提供读操作,这样能有效地减轻单台数据库的压力。 通过MyCat即可轻易实现上述功能,不仅可以支持MySQL&#x…

【论文总结】Composition Kills: A Case Study of Email Sender Authentication

构成杀伤力: 电子邮件发送者认证的案例研究 摘要 基于组件的软件设计是构建现代软件系统的一种主要工程方法。然而,由于不同组件之间对信息的解释可能不一致,这种编程范式产生了安全问题。在本文中,我们利用这种不一致来识别电子…

双列集合 JAVA

双列集合 一次需要添加一对数据,分别为键和值键不可以重复,值可以重复键和值是一一对应的,每一个键只可以找到自己对应的值键值对在java中也叫做Entry对象 #mermaid-svg-zKLj0vUbRaN9zlse {font-family:"trebuchet ms",verdana,ar…

SpringBoot2-基础入门(二)

SpringBoot2 - 基础入门(二) 了解自动装配原理 文章目录 SpringBoot2 - 基础入门(二)了解自动装配原理一、依赖管理1.1 父项目做依赖管理1.2 starer场景启动器 2、自动配置2.1 自动配置依赖2.2 组件扫描 3、配置文件3.1 各种配置…

【软件测试知识】

目录 软件测试软件测试模型瀑布模型V 模型W 模型敏捷开发模型 软件开发流程软件测试方法白盒测试黑盒测试 软件测试 软件测试模型 说到开发模型,从软件发展来看,比较典型的有瀑布模型,V 模型和 W 模型以及 敏捷开发模型。并不是说开发模型的…

【论坛java项目】第二章 Spring Boot实践,开发社区登录模块:发送邮件、开发注册功能、会话管理、生成验证码、开发登录、退出功能、

😀如果对你有帮助的话😊 🌺为博主点个赞吧 👍 👍点赞是对博主最大的鼓励😋 💓爱心发射~💓 目录 一、发送邮件1、启用客户端SMTP服务2、导入jar包3、邮箱参数配置MailClientdemo.html…

第13届蓝桥杯Scratch省赛真题集锦

编程题 第 1 题 问答题 报数游戏 题目说明 背景信息: 5个男生和3个女生,8个人围成一个圆圈,给定一个数字n (2 小于等于n 小于等于5)。从第一个开始依次报数,当报数为n时,这个人离开圆圈。然后下一个从1开始报数,再次报…

MySQL---使用索引优化、大批量插入数据优化

1. 使用索引优化 索引是数据库优化最常用也是最重要的手段之一, 通过索引通常可以帮助用户解决大多数的MySQL 的性能优化问题: create table tb_seller (sellerid varchar (100),name varchar (100),nickname varchar (50),password varchar (60),status varchar…

高级Java多线程面试题及回答

高级Java多线程面试题及回答 1)现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行? 这个线程问题通常会在第一轮或电话面试阶段被问到,目的是检测你对”join”方法是否熟悉。这个多线程问题比较简单,可…

网络安全的红利还能吃几年?

在我看来这是一个伪命题,因为网络安全的核心和本质是持续对抗,只要威胁持续存在,网络安全的红利就会持续存在! 对于网络安全新入行的同学们来说,这是一个最坏的时代,因为你只能自己搭环境才能重现那些大牛们…

网络编程 lesson5 IO多路复用

select 当需要在一个或多个文件描述符上等待事件发生时,可以使用select函数。 select函数是一个阻塞调用,它会一直等待,直到指定的文件描述符上有事件发生或超时。 select函数详解 int select(int nfds, fd_set *readfds, fd_set *writefd…

初识SPDK,从SPDK的软件架构到使用实操

相信很多做存储的同学都听说过SPDK,它是Intel开发的一套开源存储栈。SPDK的全称为存储高性能开发包(Storage Performance Development Kit),从名称可以看出SPDK其实就是一个第三方的程序库。但是这个程序库却是非常强大的,下图是SPDK的软件模块图,从该图可以看出,几乎囊…

Linux---用户管理命令(useradd、userdel、usermod、passwd、id)

1. 用户与用户组 Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向 系统管理员申请一个账号,然后以这个账号的身份进入系统。 Linux系统中可以: 配置多个用户、配置多个用户组、用户可以…

什么?电路板上还要喷漆?

什么是三防漆? 三防漆是一种特殊配方的涂料,用于保护线路板及其相关设备免受环境的侵蚀。三防漆具有良好的耐高低温性能;其固化后成一层透明保护膜,具有优越的绝缘、防潮、防漏电、防震、防尘、防腐蚀、防老化、耐电晕等性能。 在…