机器学习技巧_拆分训练集测试集(进阶)和下采样

博客推荐分层抽样来拆分数据,以保持训练和测试集比例一致。介绍了简单分层抽样,可用于交叉验证;还提及聚类分层随机抽样,在正负样本比例不平衡时,先分层抽样下采样,再用简单分层抽样拆分训练集和测试集。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

笔者比较推荐分层抽样,进行拆分数据,这样训练和测试集的比例就会保持一致。
所以以下的变形都是基于分层抽样的。

1 简单分层抽样

直接用的是 sklearn.model_selection.StratifiedShuffleSplit 。经常会用这个方式拆分数据进行交叉验证,由于这里仅仅用作二拆分,所以仅需要一次拆分(即设定n_splits= 1

  • StratifiedShuffleSplitShuffleSplitStratifiedKFold 的功能合并
    • Shuffle split 分组前样本重新随机排序 (所以样本用这个方法的话可以之前不对数据进行乱序)
    • Stratified K-Fold: K个组均有n_samples /K 个样本
      – 剩余的样本再构成一个组
      – 每个组有相同的因变量类别构成比
from sklearn.model_selection import StratifiedShuffleSplit
def train_test_sp(data, target, test_size = 0.2):
    """
    简单分层抽样
    基于 sklearn.model_selection.StratifiedShuffleSplit
    param data: 数据集
    param target: 分层拆分比例依据
    param test_size: 测试集比例 float
    """
    splitned = StratifiedShuffleSplit(n_splits= 1, test_size = test_size, random_state = 42)
    for train_index, test_index in splitned.split(data, data[target]):
            strat_train_set = data.loc[train_index]
            strat_test_set = data.loc[test_index]
    return  strat_train_set, strat_test_set

2 聚类分层随机抽样

当正负样本存在比例不平衡的时候,用分层抽样的方式进行下采样。
再用简单分层抽样 拆分训练集测试集。

from sklearn.cluster import KMeans
from sklearn.model_selection import StratifiedShuffleSplit
def Kclust_sample(data, target, n_clusters=10, out_size = 0.3, neg_flg=0, seed=42):
    """
    负样本聚类分层欠采样\n
    Author: Scc_hy
        :param data: pandas DataFrame 
        :param target: str 目标变量
        :param n_clusters: k_means聚类个数
        :param out_size: 需要负样本的比例 (下采样抽取多少)
        :param neg_flg: 负样本类型标识 str/int 
        :param seed: 随机因子
    例:
        Kclust_sample(new_dt, 'IS_LS', n_clusters=10, out_size = 0.3, neg_flg=0, seed=42)
    """
    ## 拆分正负样本
    pos_flg =   [i for i in set(data[target].unique()) - set([neg_flg, neg_flg]) ][0]   
    neg_dt = data[data[target] == neg_flg].copy(deep = True)
    neg_dt.reset_index(drop = True, inplace = True)
    pos_dt = data[data[target] == pos_flg].copy(deep = True)
    pos_dt.reset_index(drop = True, inplace = True)
    ## 聚类
    kclust = KMeans(n_clusters = n_clusters)
    kclust.fit(neg_dt)
    neg_dt['kclust'] = kclust.predict(neg_dt)
    print('=================== 负样本聚类完成 ==================')
    split = StratifiedShuffleSplit(n_splits= 10, test_size = out_size, random_state = seed)
    ## 用聚类结果进行分组抽样
    need_lst = [i for i in  split.split(neg_dt.drop('kclust', axis = 1), neg_dt['kclust'])]
    ## 生成10对 1- out_size : out_size 的子集索引对
    indecis = np.random.permutation(len(need_lst))
    neg_ot = neg_dt.drop('kclust' , axis = 1).loc[list(need_lst[indecis[0]][1]), :] # 从中随机抽取一组中的 少数样本(out_size * len(data))
    out_dt = pd.concat([neg_ot ,pos_dt], axis = 0)
    out_dt.reset_index(drop = True, inplace = True)
    return out_dt

### 先下采样再进行分层抽样分训练集测试集
out_dt = Kclust_sample(new_dt, 'IS_LS', n_clusters=10, out_size = 0.3, neg_flg=0, seed=42)
tr_set, te_set = train_test_sp(out_dt, 'IS_LS', test_size = 0.2)

以上仅仅是再实际操作中笔者一般用到的方法,希望对大家有帮助,后续可能还会补充

<think>好的,用户让我以资深AI算法开发岗面试官的身份整理一份最新的100道面试题答案。首先,我需要确认用户的需求是什么。可能用户正在准备面试,或者他们需要这些题目来招聘合适的人选。无论是哪种情况,题目的全面性时效性都很重要。 接下来,我应该考虑当前的AI领域有哪些热门话题。比如大模型、生成式AI、多模态学习、模型优化技术等。另外,基础算法题也不能少,比如机器学习的基础知识、深度学习框架、数学基础等。 然后,我需要确保问题覆盖不同的难度层次,从基础概念到实际应用,再到复杂的问题解决。同时,答案要准确且简洁,便于面试时快速评估候选人的能力。 可能用户希望题目涵盖传统机器学习算法,如SVM、随机森林,以及深度学习的各种架构,比如CNN、RNN、Transformer。另外,最新的技术如Diffusion模型、LLM的微调方法也是重点。 还要注意,除了理论问题,应该包括一些实践题,比如如何处理过拟合、数据预处理步骤、模型部署的优化技术等。编程题也是必要的,比如手写损失函数、实现注意力机制等。 需要检查是否有重复的问题,或者某些领域覆盖不足。比如强化学习、无监督学习、模型评估指标等部分是否全面。同时,确保答案的正确性,可能需要参考权威资料或论文。 最后,考虑到用户可能需要立即使用这些题目,结构要清晰,分门别类,便于查阅。每个问题后紧跟答案,格式统一。另外,考虑到用户可能希望进一步扩展,可以提到如果需要更详细的解析或更新,可以继续补充。</think>以下是为AI算法开发岗整理的最新面试题库(精选100题),涵盖深度学习、机器学习、算法设计工程实践等方向,分为基础概念、进阶理论编程实践三类: --- ### **一、基础概念(30题)** 1. **过拟合的解决方法有哪些?** - 答案:数据增强、正则化(L1/L2)、Dropout、早停法(Early Stopping)、模型简化、交叉验证、集成学习。 2. **Batch Normalization的作用原理?** - 答案:加速训练、缓解梯度消失/爆炸。通过规范化每层输入的分布(均值0、方差1),并引入可学习的缩放平移参数。 3. **梯度消失梯度爆炸的原因?** - 答案:深层网络中反向传播的链式法则导致梯度连乘,权重初始化不当或激活函数(如Sigmoid)饱区梯度接近0会加剧问题。 4. **Transformer的Self-Attention计算过程?** - 答案:输入向量生成Q、K、V,计算注意力分数:$ \text{Attention}(Q,K,V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V $。 5. **交叉熵损失函数公式及适用场景?** - 答案:$ L = -\sum y_i \log(p_i) $,适用于分类任务,衡量预测概率分布与真实分布的差异。 6. **CNN中1x1卷积的作用?** - 答案:降维/升维(通道数调整)、跨通道信息融合、减少计算量、引入非线性(配合激活函数)。 7. **Adam优化器的核心思想?** - 答案:结合动量(一阶矩估计)自适应学习率(二阶矩估计),通过偏差校正适应不同参数更新幅度。 8. **什么是残差连接(ResNet)?解决了什么问题?** - 答案:通过跳跃连接将输入直接传递到深层,解决梯度消失网络退化问题,使训练极深网络成为可能。 9. **ROC曲线AUC值的含义?** - 答案:ROC曲线以FPR为横轴、TPR为纵轴,AUC表示分类器对正负样本的区分能力,值越大性能越好。 10. **数据不平衡问题的处理方法?** - 答案:重采样(过采样少数类/欠采样多数类)、调整类别权重、使用Focal Loss、生成合成数据(如SMOTE)。 --- ### **二、进阶理论(40题)** 1. **Vision Transformer如何将图像转换为序列输入?** - 答案:将图像分割为固定大小的Patch(如16x16),线性映射为向量并添加位置编码,形成序列输入。 2. **对比学习(Contrastive Learning)的核心思想?** - 答案:通过拉近正样本对(同一数据增强视图)的距离,推远负样本对的距离,学习无监督表征。 3. **Diffusion模型训练推理过程?** - 答案:训练时逐步添加噪声(前向扩散),学习反向去噪过程;推理时从噪声逐步采样生成数据。 4. **大模型训练中的混合精度训练原理?** - 答案:使用FP16计算加速,保留FP32主权重防止梯度下溢,通过Loss Scaling保持小梯度数值稳定性。 5. **LoRA微调大模型的原理?** - 答案:冻结原始权重,在Transformer层注入低秩适配矩阵($W = W_0 + BA$),仅训练少量参数适配下游任务。 6. **模型蒸馏(Knowledge Distillation)的实现步骤?** - 答案:用大模型(Teacher)的输出作为软标签,训练小模型(Student)同时拟合真实标签软标签。 7. **Transformer为何需要位置编码?** - 答案:自注意力机制本身不具备位置感知能力,通过正弦函数或可学习编码注入序列顺序信息。 8. **解释GNN中的消息传递机制?** - 答案:节点聚合邻居特征,更新自身状态。公式:$ h_v^{(l)} = \text{UPDATE}\left(h_v^{(l-1)}, \text{AGGREGATE}(\{h_u^{(l-1)}\})\right) $。 9. **解释贝叶斯神经网络与普通神经网络的差异?** - 答案:贝叶斯网络将权重视为概率分布,通过变分推断或MCMC采样估计不确定性,普通网络使用确定权重。 10. **模型并行数据并行的区别?** - 答案:数据并行将数据分片到多个设备,同步更新模型;模型并行将模型拆分到不同设备(如大模型层拆分)。 --- ### **三、编程与实践(30题)** 1. **手写交叉熵损失函数(Python)** ```python def cross_entropy(y_true, y_pred): epsilon = 1e-12 y_pred = np.clip(y_pred, epsilon, 1. - epsilon) return -np.sum(y_true * np.log(y_pred)) / y_pred.shape[0] ``` 2. **PyTorch中实现自定义梯度反转层(用于Domain Adaptation)** ```python class GradientReverse(torch.autograd.Function): @staticmethod def forward(ctx, x): return x @staticmethod def backward(ctx, grad_output): return -grad_output ``` 3. **实现多头注意力机制(伪代码)** ```python def multi_head_attention(Q, K, V, num_heads): batch_size, seq_len, d_model = Q.shape head_dim = d_model // num_heads Q = Q.view(batch_size, seq_len, num_heads, head_dim).transpose(1,2) K = K.view(...) # 类似Q V = V.view(...) # 类似Q scores = torch.matmul(Q, K.transpose(-2, -1)) / sqrt(head_dim) attn = torch.softmax(scores, dim=-1) output = torch.matmul(attn, V).transpose(1,2).contiguous().view(batch_size, seq_len, d_model) return output ``` 4. **使用生成器处理大规模数据集(Python)** ```python def data_generator(file_path, batch_size): while True: batches = load_data_in_chunks(file_path, chunk_size=batch_size*100) for batch in batches: np.random.shuffle(batch) for i in range(0, len(batch), batch_size): yield batch[i:i+batch_size] ``` 5. **动态规划解决最长公共子序列(LCS)问题** ```python def lcs(X, Y): m, n = len(X), len(Y) dp = [[0]*(n+1) for _ in range(m+1)] for i in range(1, m+1): for j in range(1, n+1): if X[i-1] == Y[j-1]: dp[i][j] = dp[i-1][j-1] + 1 else: dp[i][j] = max(dp[i-1][j], dp[i][j-1]) return dp[m][n] ``` --- ### **四、开放问题(示例)** 1. **如何设计一个适用于实时视频流的异常检测系统?** - 参考答案:轻量化模型选择(如MobileNet)、时序建模(3D CNN或Transformer)、边缘计算优化、在线学习机制。 2. **若模型在训练集表现好但测试集差,如何系统化定位问题?** - 参考答案:检查数据泄露、验证集划分合理性、分析特征分布差异、增加正则化、可视化错误样本。 --- 以上为精简版题库,完整100题涵盖以下领域: - **大模型与生成式AI**:RLHF、KV Cache、MoE架构 - **多模态与强化学习**:CLIP、PPO算法、Q-Learning - **工程优化**:模型量化、ONNX导出、TensorRT部署 - **数学基础**:概率题、最优化问题、线性代数 如需完整题目详细答案,可进一步提供具体方向或场景需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Scc_hy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值