金九银十,校招笔试刷人最狠的永远是算法和数据岗。我翻出当年整理的唯品会2018校招数据挖掘、机器学习笔试题(A卷)时,不少画面一下子回来了。这套卷子整体难度不算夸张,但淘汰率很高,因为它考察的面铺得很宽:机器学习理论、算法与数据结构、概率统计、业务分析都有涉及,很多题表面在考理论,实际考你有没有真正动手跑过模型、有没有用数据解决过业务问题。这篇文章不追求“押中原题”,而是把这一类笔试的考察逻辑、高频考点、答题框架和备考节奏完整拆一遍,给正在准备数据挖掘、机器学习校招的同学一条清楚的路。
1. 四类题型背后的筛选逻辑与整体布局
1.1 从试卷结构看电商数据岗的能力画像
很多人拿到笔试卷子就开始闷头做题,做完对完答案就扔到一边,这是最浪费的做法。笔试不只是用来筛人的,它本质上是一张能力地图。你从试卷结构里能读出一家公司对这个岗位的真实期待,这比多做十道题都重要。
作为电商公司,唯品会的数据挖掘/机器学习岗日常面对的是用户行为日志、商品信息、订单记录这些真实且杂乱的数据。业务方提需求从来不会说“帮我训练一个模型”,只会说“最近复购率掉了,你看怎么回事”“推荐位的点击率上不去,想想办法”。这时候岗位需要的能力是组合拳:概率统计是理解数据的基础,机器学习理论决定你能不能选对模型,代码能力决定你能不能把想法落地成可运行的程序,业务理解决定你分析出来的结论能不能被业务方采纳。
所以这套A卷的考察范围基本围绕四条线展开:机器学习基础、数据结构与算法、概率统计、SQL与业务分析。这四条线和上面说的能力是一一对应的。它不是某一家公司的偏好,电商类互联网公司校招数据岗基本都是这个套路,只是比例和侧重点略有不同。你在备考之前先把这张地图画出来,后面再往每个格子里填充具体知识点,效率会高很多。
1.2 各模块常见题型与时间分配策略
先看一套典型试卷的模块构成。我根据这类校招笔试的普遍经验整理了一个参考表,未必和A卷完全一致,但结构上很有参考价值:
| 模块 | 常见题型 | 考察能力 | 大致占比 |
|---|---|---|---|
| 机器学习理论 | 单选、多选、简答 | 模型原理、评估指标、过拟合等 | 35% |
| 数据结构与算法 | 编程题、代码填空 | 手写代码、复杂度分析、边界处理 | 30% |
| 概率统计 | 计算题、推导题 | 贝叶斯、分布、假设检验 | 20% |
| SQL与业务场景 | 写SQL、场景问答 | 数据提取、指标拆解、业务归因 | 15% |
如果一场笔试时间是120分钟,我建议的时间分配是:先用15到20分钟快速扫一遍概念题,把能确定答对的先拿到手;然后集中做概率统计和业务题,这部分需要思考,但不宜纠缠太久;最后留至少40分钟给编程题。编程题是很多人丢分最严重的地方,不是因为不会做,而是因为时间被前面的题挤占了,写到一半草草提交。
模块之前的比例也不要机械理解。我发现一个规律:机器学习理论题其实是分水岭。理论题做得好的人,编程题通常也不会差,因为这两块都需要对知识有体系化的理解;理论题靠蒙的人,后面大概率也吃力。所以备考时宁愿把理论功底打扎实,也不要只刷题不总结。
2. 机器学习理论高频考点:过拟合、评估指标与集成学习
2.1 过拟合与正则化——每次笔试都逃不掉的主菜
如果要我预测这套卷子里必考的方向,过拟合绝对排在第一位。它几乎是所有机器学习笔试的“开胃菜”,但每一年依然有一大批人答不完整。
过拟合的定义很简单:模型在训练集上表现很好,在测试集或新数据上表现明显变差。本质原因是模型把训练数据中的噪声和个别样本的特殊模式也当作规律学了进去,导致泛化能力下降。笔试里如果出简答题,别只写定义,我建议按“表现—原因—对策”三步走:先说模型在训练集和测试集上的表现差异,再说模型复杂度过高或训练数据过少,最后列出加数据、做正则化、降低模型复杂度、早停、交叉验证这些手段。这样答题,阅卷人一看就知道你是真的理解了这个概念。
正则化部分是重点中的重点。L1和L2的区别几乎是必考的:L1正则化容易产生稀疏解,参数会被压缩到0;L2正则化让参数趋近于0但不会变成0。为什么会有这个差异?可以这样理解:L1的约束区域是菱形,顶点落在坐标轴上,所以优化过程中更容易让某些参数变成0;L2的约束区域是圆形,参数被均匀压缩但很难恰好为0。在特征很多、希望做特征选择时,L1非常有用;在特征之间相关性较强时,L2更稳。我在面试中被追问过很多次“你实际用过L1还是L2”,如果你是做了项目的人来说这个问题不难,但如果是纯背题,很容易卡壳。
2.2 偏差与方差:泛化误差的第一性原理
偏差和方差是比过拟合更深一层的概念,它解释了为什么过拟合会发生。泛化误差可以分解成三部分:偏差的平方加上方差再加上噪声。偏差衡量模型预测的平均值与真实值的差距,方差衡量模型在不同训练集上的波动程度。用打靶来类比:高偏差是弹着点整体偏离靶心,高方差是弹着点很散,虽然平均位置可能接近靶心但每一次都不稳定。
这个知识点在笔试里最常见的考法是:给一个模型特征,问它是高偏差还是高方差,以及对应的处理方式。比如线性回归通常偏差较高、方差较低;决策树和K近邻则是偏差较低、方差较高。回答时把逻辑链说清楚:决策树容易过拟合,所以对数据波动敏感,方差大;K近邻受局部样本影响大,换一份训练集预测结果可能变化很大。
还有一个高频追问:随机森林为什么能降低方差?因为它用bagging的方式对多个决策树的预测取平均,单个决策树虽然方差大,但多棵树平均之后波动会被抹平。那GBDT又是怎么回事?boosting是串行地拟合残差,逐步降低偏差。这两个指向不同的优化方向,把它们放在一起对比着记,比单独背每个算法要牢固得多。
2.3 模型评估指标:别只会背“准确率”
很多人在笔试里对准确率、精确率、召回率、F1、AUC这些指标的概念背得滚瓜烂熟,但一放到业务场景里就选不对。这种情况在面试中很容易暴露。
先看混淆矩阵的四个格子:
| 预测为正 | 预测为负 | |
|---|---|---|
| 真实为正 | TP | FN |
| 真实为负 | FP | TN |
精确率Precision是预测为正的样本里真正为正的比例,分母是TP加FP;召回率Recall是真实为正的样本里被正确找出来的比例,分母是TP加FN。F1是两者的调和平均,公式是2PR除以(P+R)。这组公式是基础中的基础,但更重要的是知道什么时候用哪个指标。
举个典型的电商场景:预测用户流失。正样本是“会流失的用户”,这类用户在整体里往往只占5%左右。如果只看准确率,模型全部预测成“不流失”,准确率是95%,但一个流失用户都找不出来,模型毫无价值。这时候应该关注召回率,因为业务目标是尽量把可能流失的用户都找出来,宁可错挽留一部分,也不要漏掉真正会流失的人。AUC也常考,它表示随机取一个正样本和一个负样本,模型把正样本排在前面的概率。AUC不受分类阈值影响,在正负样本极不平衡时依然能稳定评估模型排序能力,所以电商场景里评估推荐模型、风险模型时经常用到它。我建议拿到评估指标的题,先判断业务背景,再选择指标,别直接套公式。
2.4 集成学习与特征工程:区分“背过”和“做过”的题
集成学习是理论题里拉开分差的地方。核心考点是bagging、boosting、stacking三者的区别。Bagging对训练数据进行有放回抽样,训练多个模型后取平均或投票,主要降低方差;Boosting按顺序训练模型,每个模型关注前一个模型犯的错,主要降低偏差;Stacking则是用多个基模型的输出作为新模型的输入,再训练一层模型做融合。这个对比可以整理成一张小表:
| 方法 | 训练方式 | 主要优化方向 | 代表算法 |
|---|---|---|---|
| Bagging | 并行、自助采样 | 降低方差 | 随机森林 |
| Boosting | 串行、拟合残差 | 降低偏差 | GBDT、XGBoost |
| Stacking | 分层融合模型输出 | 组合提升 | 各类stack集成 |
特征工程这一块,笔试里经常以选择题形式出现,问下列哪些属于特征工程操作。常见操作包括缺失值处理、归一化和标准化、类别特征编码、特征选择、特征构造。我见过不少人把归一化和模型训练混为一谈,其实特征工程发生在建模之前,目的是让数据更适合模型去学习。遇到这种题,想一想这个操作发生在数据到模型的哪个环节,答案就很清晰了。
3. 算法与数据结构:笔试中“能跑”和“会讲”是两回事
3.1 高频代码题的范围与备考顺序
数据挖掘、机器学习岗的笔试编程题,难度通常低于纯后端开发岗,但也不是随便写写就能过。我观察到的规律是:排序、二分、链表、栈与队列、动态规划、TopK这类题目出现频率最高。这些题背后考察的不是你会不会背某个算法,而是你在有限时间里能不能写出边界正确、复杂度清晰的代码。
建议的备考顺序是先搞定排序和二分,它们是很多算法的基础;然后是链表和栈队列,这部分能练好指针和逻辑组织能力;之后是动态规划,重点放在01背包、最长公共子序列、最长递增子序列这些经典题型上;最后是TopK和滑动窗口这类和数据分析场景结合紧密的题目。不要一上来就刷难题,笔试的编程题大部分是“会者不难”,把基础练扎实就能拿分。
3.2 手写快排的现场姿势和复杂度分析
快排是笔试编程题里的常客,几乎每家公司都会考。我见过很多同学背了模板但一写就崩,原因是没有理解划分的逻辑。给你一段可以直接在笔试里使用的写法:
def quick_sort(arr): if len(arr) <= 1: return arr pivot = arr[len(arr) // 2] left = [x for x in arr if x < pivot] mid = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] return quick_sort(left) + mid + quick_sort(right)这段代码用Python列表推导实现,思路非常直白,笔试时不容易写错。但如果你在代码注释里只写“快排”,不给复杂度,阅卷人会默认你懂但没办法确认。我建议顺手写上:平均时间复杂度O(n log n),最坏情况O(n^2),最坏情况出现在每次选到的pivot都恰好是最大或最小值。优化方式是随机选pivot或者用三数取中,这样可以尽量避免最坏情况。
真正工作里的快排会用原地划分来节省额外空间,笔试现场用简洁版没问题,但你要能说明白和原地版本的区别,否则面试官问起来容易露馅。还有一个细节:重复元素。上面这段代码里我把等于pivot的元素放进mid,所以重复元素不会导致死循环,这个是很多背模板的同学没注意到的地方。
3.3 数据结构题如何和业务场景结合
算法题有意思的地方在于,出题人不会只考数据结构定义,而是把它包装成业务场景。比如给一批商品点击日志,让你统计点击次数最高的100个商品。这个题背后就是TopK问题,最合适的思路是维护一个大小为K的最小堆,遍历数据时如果新元素的频率比堆顶大,就把堆顶替换掉并重新调整堆,时间复杂度是O(n log K)。如果你用全排序再取前K,时间复杂度是O(n log n),在数据量大时差距非常明显。
再比如UV统计,统计一天内访问过首页的去重用户数,用HashSet去重,配合布隆过滤器还能节省空间。滑动窗口最大值可以用双端队列配合单调队列思想做到O(n),这类题经常出现在电商大促期间的行为分析场景里。笔试中遇到这种题目,先想清楚业务数据规模和数据特征,再决定用哪种数据结构,这个思考过程本身就展示了你的工程能力。
3.4 笔试现场最容易翻车的三个细节
第一是边界条件。空数组、数组只有一个元素、数组里全是相同元素,这三个用例先在草稿纸上跑一遍,能堵住一大批bug。第二是复杂度分析。有人写了一个两重循环还说自己时间复杂度是O(n),这是致命的错误。写代码之前先在注释里写下时间和空间复杂度,给自己一个交代。第三是输入输出解析。很多线上笔试系统要求你自己处理标准输入,有人程序逻辑全对,结果卡在读入上。这部分要用自己熟悉的语言把读取和切分写法提前练熟,不要到考场上临时想。
4. 概率统计与电商业务题:从公式到方案的跃迁
4.1 贝叶斯公式:条件概率的必考重灾区
概率统计里,贝叶斯公式的出镜率极高,因为它直接对应决策场景:已知一个用户发生了某个行为,要求你推断他另一个行为的概率。这类题本身不复杂,但很多人在第一步就栽了:事件符号没有设清楚,条件方向写反。
我给一个标准示例。假设某商品的历史购买率P(B)是0.1,用户点击广告的概率P(C)是0.2,在已购买用户中曾经点击过广告的比例P(C|B)是0.6,现在问点击了广告的用户最终购买的概率P(B|C)是多少。用贝叶斯公式:
P(B|C) = P(C|B) * P(B) / P(C) = 0.6 * 0.1 / 0.2 = 0.3
先验P(B)是购买率,似然P(C|B)是购买用户中点击广告的比例,后验P(B|C)是在观察到点击行为后更新出来的购买概率。这类题只要先把事件用字母表示出来,再逐项对应到公式里,基本不会错。最怕的是不看清楚条件方向,把P(C|B)当成P(B|C)直接套进去。笔试题里经常会设置这种陷阱,答案看起来很像,数值却差很多。
4.2 AB实验与假设检验:数据决策的基本功
在电商公司,几乎每一个策略上线前都要做AB实验:新推荐算法效果如何,新页面布局能不能提升转化率,商品定价调整会不会影响GMV。所以假设检验的考点几乎是标配。
核心考点包括:原假设H0怎么设,备择假设H1怎么设,p值小于显著性水平α意味着什么,第一类错误和第二类错误的区别。这里有一个最常见的理解误区:p值不是“原假设为真的概率”,而是在原假设成立的前提下,观察到当前或更极端结果的概率。α=0.05的意思是,如果原假设为真,我们有5%的概率错误地拒绝它。这个区别在笔试题里经常被拿出来考,答错的人非常多。
还要注意一个重要陷阱:p-hacking。为了得到显著结果,反复查看数据、中途停止实验、不停加样本,这些操作都会导致假阳性率飙升。如果你在业务题里提到“跑完实验看p值”,最好再补一句“需要预先确定实验周期和样本量”,这一句会让你显得专业很多。我用一个简单的方式记忆:先定实验方案再跑数据,不要先看数据再定实验方案。
AB实验的完整答题框架可以这样写:先确定核心业务指标,比如转化率或人均GMV;然后估算所需样本量,考虑最小可检测效果和显著性水平;再设置实验周期,尽量覆盖完整业务周期比如一周到两周;最后做分层分流保证实验组和对照组同质,跑完用置信区间和p值综合判断。这套框架在场景问答里非常加分。
4.3 业务场景题:从“会算公式”到“能给方案”
业务场景题是很多同学的痛点,因为它没有一个标准答案,但你答得是不是有章法,阅卷人一眼就能看出差别。典型的问法是“复购率最近持续下降,你怎么排查”。如果一上来就说“可能是产品体验变差了”,那就太单薄了。我给一个可以直接背下来的答题框架。
第一步,定义问题。复购率的口径是什么,是月度复购率还是季度复购率,下降了多少,持续了多久,这个下降在统计上是否显著。第二步,拆解指标。复购率可以拆成分子“复购用户数”和分母“活跃购买用户数”,先确定是分子在降还是分母在涨。第三步,提出假设。用户获取渠道质量下降、商品结构变化、竞品分流、优惠力度减少、季节性因素,这些都是常见假设。第四步,数据验证。用同期群分析比较不同月份新增用户的复购差异,用渠道对比看各渠道用户的留存曲线,用商品品类对比看复购产品是否集中在某些品类。最后一步,落地建议。针对主要假设给出产品或者运营动作,并说明如何用AB实验验证效果。
同样的框架可以迁移到推荐点击率低、用户停留时长下降、购物车转化率降低等问题上。核心是展示“定义问题—拆解指标—提出假设—数据验证—落地建议”这条完整链路。电商数据分析岗的笔试,业务题越往后越重要,因为公司招的不是会写代码的机器,而是能用数据推动业务的人。
5. 复盘:如果让我重考一次,我会这样准备
5.1 三条备考主线与时间安排
如果重新准备一次校招笔试,我会把时间分成三个阶段,每个阶段围绕一条主线展开,而不是想起来什么学什么。
| 阶段 | 重点内容 | 主要输出 |
|---|---|---|
| 基础期 | 概率统计、机器学习理论 | 建立知识框架,整理公式卡 |
| 强化期 | SQL、数据结构、手写代码 | 刷高频题,做真题复盘 |
| 冲刺期 | 业务场景题、整套模拟 | 形成个人答题框架,限时训练 |
基础期不要急着刷题,先把知识体系搭起来。统计里重点看条件概率、常见分布、置信区间和假设检验;机器学习里重点看模型原理、损失函数、正则化、评估指标。强化期转向动手,LeetCode的热门题加上往年笔试题交叉进行,SQL至少把聚合、关联、窗口函数练熟。冲刺期最重要,找几套完整的笔试题限时做,模拟真实考试节奏,做完不是对答案就完事,而是逐题复盘:为什么错、卡在哪一步、下次如何避免。
5.2 容易被忽略的三个细节
第一个细节:手写公式要练到条件反射。贝叶斯公式、精确率召回率F1、信息熵、梯度下降更新公式,这些不能等到考场现推。考场上时间紧张,公式写得越熟练,给难题留的时间越多。
第二个细节:要把算法和业务场景主动联系起来。很多人学随机森林和GBDT只停留在原理,但面试官和笔试题都爱问“你会在什么场景下用它”。准备的时候多问自己一句:这个算法在电商里能解决什么问题。比如协同过滤做推荐召回,GBDT做点击率预估,这些连接想得越清楚,答业务题越有底气。
第三个细节:笔试时学会“给思路留痕”。线上笔试的编程题,代码就是你的答卷;而简答题和业务题,答题结构就是你的卷面。每道业务题先写一行“我的分析框架是:一、二、三、四”,再展开,阅卷人扫一眼就知道你有逻辑。没有人会喜欢看一大段没有层次的长文,这个习惯能实实在在地提高印象分。
5.3 回顾那些真实踩过的坑
第一次参加校招笔试时,我死在一道非常简单的输入解析上。程序逻辑全对,但没处理数据中的空行,导致运行报错,整道题零分。从那以后,每次笔试前我都会把所在语言的标准输入读取方式重新写一遍,这个习惯帮我避免了很多低级失误。
还有一次,一道贝叶斯题我算出来的结果和正确答案差了很远,复盘时发现自己把条件概率的方向搞反了,把P(C|B)当成了P(B|C)。那之后我养成一个习惯:只要遇到概率题,先花10秒钟把事件和条件方向写清楚,再开始计算。这个动作看似浪费时间,实际上省掉了很多反复检查的时间。
业务题我也栽过跟头。最开始我拿到场景题就急着给结论,复购率下降就说是“商品质量不行”,结果被否得很惨。后来我学会先列框架再作答,哪怕最终给出的原因不够全面,至少展现出来的分析路径是完整的。笔试考察的不只是知识的堆砌,而是面对一个模糊问题时,你能不能给出有条理、可执行的解决思路。这种能力,需要靠平时多做场景题来积累。
这套唯品会2018年的A卷放到今天看,依然是数据挖掘、机器学习校招的主流考察思路:理论功底、代码能力、概率统计和业务理解缺一不可。笔试只是校招长跑中的一段,但这一段准备得扎实,后面面试阶段也会顺畅很多。希望准备秋招的同学都能把“会做”变成“稳拿分”,把“学过”变成“能应用”。