欢迎来我的简书:呆鸟的译Py胡言
数据科学面试题
行为试题
与其它岗位的面试类似,数据科学面试也包括大量行为试题,面试官会考核求职者的软技能,了解求职者能否适应公司的企业文化。
-
请说明你以前做过的数据科学项目?
目的:了解求职者对相关知识的理解程度,曾做过什么样的贡献。测试描述工作内容的能力,以及能否把数据科学项目经历与对公司产生的影响联系起来。
应答思路:
- 介绍一个做过的产品与工程经验的数据项目,例如,提供数据分析并将分析结果产品化的数据项目。举例来说,通过主题提取技术识别文本数据集中的核心主题,说明主题识别的数据产品对促进公司业务增长产生了什么效果。
- 从业务目标角度,详细描述对这个数据项目的贡献和产出结果。面试官希望在了解该项目总体目标的同时,了解你做过什么。
- 要想讲好项目经验,需要多加演练。面试时经常会问到这个问题,准备两三个数据项目,要能说得生动、详实。
-
对以前的岗位,你喜欢什么?反感什么?
目的:判断你适不适合面试的岗位,了解你离职的原因。
应答思路:
- 充分理解岗位职能。通过HR联系人了解该岗位的信息。HR员工是获取信息的重要途径,通过他们可以了解到有关该岗位的职责、团队成员、发展历史及核心业务目标等诸多信息。
- 注意在讨论反感的事情时,要对事不要对人,表现出专业的素养。在讨论喜欢的事情时,仔细反思、论证哪些事情让你充满激情。比如,可以说喜欢的事情是从数据中分析出重要结果,汇报给管理层后能优化流程、促进业务。也可以说在公司里推行数据科学时可以学到新技术,同时又能让工作的效果更好。可以表示对公司没把数据科学作为战略核心的不满,也可以说公司高层的内耗,团队方向不清晰,但是一定要从积极地、有指向性的角度来说,千万不要带上个人色彩。
- 差:我就受不了数据科学家总是矮工程师一头,公司高管对企业发展方向一点头绪都没有!
- 好:我想在数据科学是企业战略核心、企业发展方向清晰的公司工作。
-
请说明,当必须说服别人认同你的观点时,你是怎么做的,效果如何?
目的:了解你如何坚守自己的立场,以及影响他人的能力。
应答思路: 举例说明你曾经成功地改变现状,量化这些改变带来的影响。如果可以的话,举出数据科学类的例子。此时,能够表现出沟通技巧与领导能力非常重要。
数学试题
数据科学家岗位的数学问题,不仅需要求职者能执行算法,还要能根据特定目的调整算法。
-
如何使用线性回归算法求解最优系数?(C3能源的数据科学家面试时曾问过这个问题)
原理:了解求职者对线性回归理论的理解程度,线性回归理论对很多数据科学岗位都十分重要,数据科学家不能把算法视为黑箱,不仅要能执行算法,还要能理解算法。这类问题(各种算法)测试求职者对算法的理解程度。
应答思路:简述每一步思路,列出方程式。描述思路的同时,还要详细说明解决方案。
答案:在最高水平上,系数是最小化残差平方和的函数。下一步,列出方程,说明什么是残差。想要更进一步的话,可以考虑如下内容: 1)用给定的线性回归模型,列出残差平方和的最小化目标,最好用线性代数(矩阵)表示法。 2)残差平方和是可求微分的凸函数,将微分设为0,求解该方程,可导出系数,解出最小化方程式。 3)第2条给出的解决方案使用多项式时间求解线性代数问题,需要说这种方式比较复杂;还有一种常见的解决方案,通过观测可以发现该方程式是凸性的,因此用梯度下降这样的数值算法求解效率会更高。
统计学试题
统计学知识对解决数据科学问题至关重要。统计推理能力和统计学理论测试十分常见。一定要牢记常用的统计学概念,比如I型错误、II型错误,熟练掌握各种概率分布概念。
- I型错误与II型错误的区别是什么?(Niraj,我们的校友就遇到了这个问题)
原理:测试统计学基本概念的掌握程度、统计学基础水平,评测怎么使用统计学专业术语沟通各方人员的能力。
应答思路:要有理有据,准确说明问题里的名词定义。
答案:I型错误又称“假阳性”,是对零假设的错误拒绝。II型错误又称“假阴性”,是对零假设的错误接受。可以通过举例或实际业务说明对这两个概念的理解。I型错误认为男人怀孕了;II型错误则认为孕妇没怀孕。欺诈监测业务对假阳性的容忍度特别高,客户不会因为收到提醒小心受骗的邮件发火;可要是真被骗了,系统却没监测到,这种假阴性就麻烦大了。
-
这是一家大型保险公司的数据科学面试题。将总体分为两组:暴脾气司机与好脾气司机。其中,暴脾气司机占总体的40%,好脾气司机占60%。暴脾气司机一年内发生3起事故的概率是15%,好脾气司机则是5%。已知张三去年发生了3起事故,a)他是暴脾气司机的概率是多少?b)他是好脾气司机的概率是多少?
原理:很多公司通过贝叶斯推理测试求职者的统计思维能力。说明贝叶斯概率与统计学的频率解释的区别,展示推理各种贝叶斯问题的能力,可以让面试官快速了解你对统计概念的掌握水平和心算能力。想要重温这些知识,请参考Springboard导师Will Kurt的博客(CountBayesie),里面有不少关于贝叶斯统计的好文章。
应答思路:了解求职者对贝叶斯概率的理解水平,要逻辑清晰、条理分明地说明所有假设与计算过程。
答案:首先,列出已知项: 暴脾气司机占总体的比例 = 40%或0.4 好脾气司机占总体的比例 = 60%或0.6 暴脾气司机一年内发生3起事故的概率 = 15%或0.15 好脾气司机一年内发生3起事故的概率 = 5%或0.05 需要理解贝叶斯方程式中先验条件与后验条件的概念。先验条件是在问题出现前给定的数据。某人在总体中属于暴脾气司机的概率就是给定的先验假设,不能改变。后验条件是根据贝叶斯定理的假设(P(A/B))得出的概率。
画出显示概率的维恩图:一年内发生3起事故的人一共有多少?这些人里有多少是暴脾气司机,多少不是?
# 先验条件 aggDriver = 0.4 nonAggDriver = 0.6 threeAccAggDriver = 0.15 threeAccNonAggDriver = 0.05 # 某人一年内发生3起事故,他是暴脾气司机的概率是多少? # 暴脾气司机占总体的比例乘以一年内发生3起事故的暴脾气司机的概率 A = (aggDriver * threeAccAggDriver) """分子(即A)加 好脾气司机占总体的比例乘以一年内发生3起事故的好脾气司机的概率。""" B = ((aggDriver * threeAccAggDriver) + (nonAggDriver * threeAccNonAggDriver)) """用一年内发生3起事故的暴脾气司机的概率 除以 一年内发生3起事故的好脾气与坏脾气司机的概率之和,得出后验概率""" posterior = (A/B) # 把小数转换为百分数 print ("{:.0f}%".format(posterior *100)) 复制代码
某人如果在一年内发生3起事故,此人是暴脾气司机的概率是67%(66.66%),这是后验概率。
某人如果在一年内发生3起事故,此人是好脾气司机的概率是1 - 0.6666 = 0.3333,即33%。
-
什么是概率分布类型(说明概率分布函数的推导)?用随机变量描述。 a. T分钟内,某餐馆进来K个客人的概率 b. 一群人中,身高至少为X英寸的概率 c. 两个六面骰子,点数和为Y的概率 d. 投掷N次硬币,人像朝上为K次的概率
原理:测试概率分布的知识及使用什么模型分析给定的数据。
应答思路:说明数据假设,详细说明某模型是如何适用于某个概率分布的。对概率分布进行可视化,向面试官说明为什么使用该模型对某个概率分布进行可视化。
答案: a. 泊松分布。假设每个客人的到店行为都是完全独立的,与其他人没有关系。
c. 根据公式
可以绘制出X轴是和,Y轴是概率的图形,说明概率质量函数与连续概率分布函数之间的关系。
d. 二项分布。P(k是抛N次硬币头像朝上的次数):
%matplotlib inline
import scipy, scipy.stats
import matplotlib as plot
x = scipy.linspace(0,10,11)
pmf = scipy.stats.binom.pmf(x,10,0.5)
import pylab
pylab.plot(x,pmf)
复制代码
注意,此图说明抛10次硬币5次头像朝上的几率为25%。
编程试题
面试数据科学岗位,尤其是数据工程师岗位,算法编程是必考项。这个环节可以参考软件工程师的面试,公司常用开发工具和编程综合理论是常考的内容。
-
SQL问题 — 给定交易表(Transaction_ID,Item_ID,Quantity,Purchase_Date(MM/DD/YY))和售价表(Item_ID,Price),请提供以下信息:
1)总收入
2)工作日(星期一至星期五)交易的总量、平均值与标准差,按购买量降序排列
3)工作日未交易的Item_ID数量
交易样表(表名为transactions):
Transaction_ID | Item_ID | Quantity | Purchase_Date |
---|---|---|---|
1 | 1 | 5 | 06/28/2016 |
2 | 2 | 3 | 06/27/2016 |
3 | 2 | 5 | 06/27/2016 |
4 | 2 | 1 | 06/26/2016 |
在SQL Fiddle中创建transactions表
CREATE TABLE transactions
(`Transaction_ID` int, `Item_ID` int, `Quantity` int, `Purchase_Date` datetime)
;
INSERT INTO transactions
(`Transaction_ID`, `Item_ID`, `Quantity`, `Purchase_Date`)
VALUES
(1, 1, 5, '2016-06-28 00:00:00'),
(2, 2, 3, '2016-06-27 00:00:00'),
(3, 2, 5, '2016-06-27 00:00:00'),
(4, 2, 1, '2016-06-26 00:00:00')
;
复制代码
价格样表(表名为prices):
Item_ID | Price |
---|---|
1 | $2 |
2 | $3 |
在SQL Fiddle中创建prices表
CREATE TABLE prices
(`Item_ID` int, `Price` varchar(2))
;
INSERT INTO prices
(`Item_ID`, `Price`)
VALUES
(1, 2),
(2, 3)
;
复制代码
原理:大型创业公司和成熟公司普遍使用SQL查询数据库。如果面试的是数据分析师,技术面试主要以SQL问题为主。懂得如何正确提取数据,对面试成功很重要。
应答思路:面试时,会让求职者在纸上写出代码,或使用HackerEarth等协同编码工具,这样面试官就可以在解释器中实时查看代码了。尽量在最短时间内,最有效的完成任务,并且尽量少犯错误。可以用 SQLFiddle等工具实战练习SQL查询技巧。
答案:
1)总收入
SELECT sum(a.quantity * b.price)
FROM transactions AS a
JOIN prices AS b ON a.item_ID = b.item_ID
复制代码
这段代码用于关联价格表与交易表,将每个产品的数量与价格相乘,进行汇总。计算得出总收入为37美元。
2)工作日交易的总量、平均值与标准差
SELECT DAYOFWEEK(purchase_date),
sum(quantity),
avg(quantity),
std(quantity)
FROM transactions
WHERE DAYOFWEEK(purchase_date) BETWEEN 2 AND 6
GROUP BY DAYOFWEEK(purchase_date)
ORDER BY 2 DESC
复制代码
这段查询代码使用MySQL的DAYOFWEEK函数,为日期返回从1到7的数字索引,其中,1对应星期日,7对应星期六。
3)Left Join VS GroupBy a. Left Join方法
SELECT count(distinct A.item_id)
FROM transactions A
LEFT JOIN
(
SELECT *
FROM transactions
WHERE DAYOFWEEK(purchase_date) BETWEEN 2 AND 6
) AS B
ON A.Item_ID = B.Item_ID
WHERE ISNULL(B.purchase_date)
复制代码
b. Groupby方法^3
SELECT COUNT(*)
FROM
(
SELECT item_ID
FROM transactions
WHERE DAYOFWEEK(Purchase_Date) BETWEEN 2 AND 6
Group By item_ID
) AS B
复制代码
两种方法都能计算出工作日未交易过的产品数量。
SQL答题技巧:
- 在写子查询语句前,首先把整个查询语句分解成几个小的查询语句。把整个问题分解成特定的中间表,先为中间表写好查询语句;
- 处理JOIN列的时候要小心。搞清楚是否要保留未匹配的行,如果保留,就要使用Left Join;
- 要是不知道准确的转换函数,就假设一个,将输入输出内容告诉面试官,然后继续下一步。
- 算法问题 — 从0开始,编写K近邻算法
原理:在规定时间内,写出算法背后的思想,并进行有效布署,这是评估数据开发能力的关键。这类问题一般会用来考核数据科学家的算法与技术实现能力,也会用来考核数据工程师的技术能力,通常会要求在给定条件下实现相应的算法。这个问题适用于各类算法,但大多数情况下以K近邻算法为主,因为这种算法比较容易实现。
应答思路:首先,要搞清楚问题。给定一个特征向量,找出该向量到所有其它已知向量的欧式距离,并找出最接近的K个向量中的大多数向量属于哪一类。这个问题测试对矩阵计算的理解,还测试处理向量和矩阵的方法。回答这个问题,要从核对输入输出样本集开始,动手推导答案。另外,还要注意时空复杂度。下面的方案中,每个预测都是关于的时间复杂度,其中,N是训练数据的行数。
给出解决方案。写清楚语法很重要,还有要注意避免各种让代码不能正常编译的错误,但最重要的是说清楚算法的逻辑,要证明你能将算法应用到计算机科学层面。
import collections
import numpy as np
class NearNeighbor(object):
def __int__():
pass
def fit(X,y):
self.X = X # NxM numpy矩阵
self.y = y # Nx1 Numpy向量
def predict(X_test,k): # X_test是1xN向量的输出
X_test_matrix = array([X_test,] * self.X.shape[0])
# 将X_test复制为N行
Distance_vector = np.sqrt(np.sum(abs(X_test_matrix - self.X)) ** 2,axis = 1)
# 此行是为了获取每个训练向量的距离
# 注意这里是使用**2和np.sum获取距离
Sort_index = np.argsort[Distance_vector]
Close_k_Classes = y[Sort_index][0:k] # 提取一组K个最邻近的向量
return collections.Counter(Closest_k_Class).most_common()[0][0]
# 返回出现最多的类
复制代码
解决方案:
其它的编程问题可能与大数据相关,比如,应聘岗位需要分析超大规模数据集,就会问到MapReduce。一般会包括,如何利用大规模数据集,查找事件流中的最频繁事件。
- 如何在Hadoop上使用MapReduce实现字数统计?
原理:如果在简历中提及有使用Hadoop或大数据工具的相关经验,或应聘的公司有处理大规模数据集的需求,就问会这方面的问题。拥有超过百万用户规模数据的财富500强大公司或技术型创业公司,会考核求职者处理大数据的能力。求职者要证明自己具备MapReduce的工作或实战经验。要学习MapReduce,可以到Horton网站查找相关资源。
应答思路:这个问题主要测试求职者对Hadoop里MapReduce框架的了解程度,一般用Java实现。尽管字数统计是个很常见的问题,但懂得怎么使用Java的Hadoop框架实现这个功能是测试的重点。
答案:驱动代码设置作业和配置。如果数据来自于HDFS(Hadoop分布式文件系统),输出结果也要保存到HDFS,这时需要将作业的输入/输出路径添加到对应的目录。然后,Mapper作业会提取文件中的每一行内容,并将每个单词的键值设为1。注意在Mapper和Reducer间传递的数据必须使用Hadoop数据结构,如Text和IntWritables,这样做是因为序列化字节数组比Strings和Ints这样的原始类型更加高效。接着,将Mapper的输出采集到Executor里,执行Combiner任务。Combiner是本地聚合器,能减少Mapper和Reducer之间发送的数据量,这是个可选配置。
所有Mapper都完成后,才会进入混洗阶段。如果发现Reducer运行到33%时卡住了,就说明混洗阶段正在等待Mapper完成任务。在混洗阶段,当所有的键都发送到Reducer后,Reducer才开始进入排序阶段。之后,执行Reduce逻辑,并将输出结果写到另一个HDFS文件里。
常见的后续问题是估算这种算法的时间复杂性,还要注意系统在机器之间写入与通信的数据量。别忽略冗余的问题,比如,Hadoop系统经常会在机器出现故障时生成多个数据副本。
场景试题
- 假如你是一家鞋品电子商务公司的数据科学家,如何搭建一个鞋品访客推荐系统?(Verizon公司面试数据科学家时问过这个问题)
原理:这个问题旨在测试求职者提交整体产品的思路。情景问题不测试各领域的知识细节,但是需要求职者描述从开始规划到交付产品的各个环节,目的是要了解求职者哪些方面的知识存在不足。这个问题除了评估求职者设计产品的全面知识,还要测试求职者的团队管理能力与协同能力。
面试官经常会问数据科学家这个问题,数据工程师或数据分析师只要回答这种情景问题的部分内容就可以了。一般情况下,会问数据工程师如何实现相关算法,而不用考虑算法本身;还会问数据分析师查询哪些数据以确定用户对鞋品的历史偏好。
应答思路:坦诚地说明自己哪些方面比较拿手,哪些方面不太熟悉,但重点要说明有经验的内容,如果有不熟悉的内容,也别不好意思,该问就问。尽量把技术知识与业务成果联系起来,说明做出选择的思路和假设。如果能提出更好地解决方案,别犹豫,多提问,一定要把问题理解透彻。
答案:将这个问题分解为数据科学与数据开发两部分。
先探讨数据科学部分,对于没有多少用户历史数据的新公司,可以用近似项目法解决。如果其它项目和鞋品的数据差异过大,可以考虑用矩阵分解技术降维处理。
假设有鞋品评级等用户偏好历史数据,可以用协同过滤类型法。特别要说明生成矩阵的行和列。然后,再讨论用哪种相似性指标,比如,欧式距离,相似度或余弦距离。
解释完算法,就可以说明数据开发部分了。要提出能拓展到百万量级的用户/鞋品数据工程基础架构,还要能实时生成推荐信息。例如,将用户数据以数据流的形式传输到S3存储桶。设计该系统要基于所有个体用户,可以设计成每晚进行矩阵分析,预计算整个数据集的推荐信息,将结果存储在Redis这样的内存数据库里。然后,构建REST API查询数据库,对每个给定的用户标识进行响应式推荐。
- Change.org在Facebook上每分享一次请愿书有多少货币价值?
原理:本题旨在了解求职者对业务的理解,以及将复杂问题分解为基础概念,再根据有效数据将这些概念转换为可分析模块的能力。这个测试可以看出求职者对公司数据架构的了解,还有沟通业务数据分析结果的水平。
应答思路:仔细研究应聘公司,特别是其盈利模式。了解该公司使用哪些重点指标跟踪绩效,搞明白该公司如何实现盈收。问清楚要解决的问题,提出假设。回答问题时,别紧张、要自信,像给平时给领导汇报工作一样就可以了。
答案:回答这个问题要对Change.org的业务有一定了解。分享一次请愿书可以通过两种方式产生收入:
1)非注册用户点击广告,比如,签署付费请愿书
2)注册用户在其生命周期内点击广告
第一步先找出求解这两种方式产出价值的方法。诀窍是把一个大问题拆分成多个小问题,简化价值计算方程: 分享一次的价值 = 点击一次广告的预期收益 + 新注册用户分享每次活动的平均数量 * 新注册用户的生命周期价值
点击一次广告的预期收益 = 点击广告的几率 * 平均每次点击向发布者收取的费用
点击一次广告的几率根据历史数据在时间窗口(一年或一个月)内的平均转化率得出,类似值通过每次点击的平均成本得出。
计算生命周期价值有点麻烦,要得出整个生命周期内用户产生的总收益,通常使用队列分析或保留分析等方法。按指定月份对注册用户进行分组,查看注册后十二个月内用户点击广告的次数。根据十二个不同队列月份,得出用户生命周期的平均收益。至此,可以将分析时限设置为任意时段,其因果关系可忽略不计,即由于初次分享且注册用户不管怎样都会在该时间窗口之外注册,因此,不能认为是分享行为带来的收入。
将求出的生命周期价值代入原始公式,就能得出分享一次请愿书的价值。还可以考虑更多元素,例如新注册用户分享自己的内容带来其他用户加入而产生的收益。要在答案里加入更多元素的话,注意不要冲淡核心信息。专注回答最初的问题,就算有不同的想法,留着最后再说。
- 给定一组分好类的新闻,如体育、政治、经济等类别,怎样为新文章分类?
原理:目的在于测试求职者对数据科学方法论的理解,了解求职者处理非结构化文本数据的经验,这是了解求职者有没有能力与信心处理复杂数据的重要测试。
应答思路:说明怎么组织文本,以及如何看待分类系统。
基本思路:
1)探索数据,理解关键元素 a. 绘制训练集里的新闻分布,确定是否存在标签失衡。 b. 查看文本,识别异常,如非英文文本,重度缩写及拼写错误。 c. 主题提取,识别指定的潜在主题关键字,查找与标记类别的关联性。注意,使用潜在主题的关键字比使用全部单词能更好地体现关联性。
2)通过清理文本得出训练集。删除标点符号、缩写和Unicode字符这种信息量少的元素。还可以通过转换小写字母、词形还原与词干提取进一步清理数据。
3)使用TF-IDF矢量器把数据转换为TF-IDF指标的标准词袋模型,使用TF-IDF上下限缩减词汇量。
4)构建数据管道,训练不同模型,比较AUC,F1分值,精确度和召回度等指标的性能。还可以使用栅格搜索实现自动交叉验证。
5)获得最优化模型后,用Python的Pickled或Java的POJO把该模型发布到生产环境。这个模型还可处理其它新文章,使用和第2、3步相同的流程进行清理即可。
- 设计评估网页设计替代方案的实验。假设没有其它实验结果支持,也没有采集用户行为知识。讨论这一结论可能导致的潜在问题,以及如何避免这些问题。
原理:网络公司大多会测试这个问题,因为优化网站争取更好的业绩是他们的生存之本。比如,Facebook就经常优化主页,刺激用户发布更多帖子。数据科学家的职责是帮助产品经理设计实验,解释实验结果。这个问题旨在了解求职者对这个主题的认知水平。
解决方案:列出改版的本质和选择网站版本的决定性指标。例如,点击率与Facebook的平均分享次数。
接下来确定达到统计显著性(例如95%)的必要样本和访问次数。可以使用卡方检验(使用是否点击这样的二项式随机变量)或Z检验(使用正态分布随机变量)。然后,评估P值,确定B检验的指标与基准A检验的指标是否在统计上有显著不同,如果存在显著不同,且新版指标优于基准指标,则新版网站是最好的选择。
回答问题时,要考虑的问题:
1)识别因页面交互产生的潜在偏差。和产品经理交流,探讨有没有可能随机样本无法测试出改版的本质。
2)对两个访客随机样本进行A/A测试,检查选择的分布和指标是否未具备统计显著差异。这是为了保证A/B测试的公平性。A/A测试可确保受众没有特定的偏置或偏差,并且确保A/B测试中随机选择的统计相关性。
3)假如评估指标中显著异常值,这样的话,平均值就不宜作为评估指标,此时,分布也可能会出现高度偏差。虽然根据中心极限定理可以假设平均值作为比较指标,但有时这种假设也可能不成立。因此,要核查指标,确保在对比不同方案时,转换率或用户分享次数的平均值是理想的指标。如果某个用户的分享次数多达几千次,使用每个用户的分享率就不是最佳的性能指标了。
总之,案例问题旨在测试求职者的经验和数据科学各领域的知识。目的是了解求职者的能力是否具有局限性。遇到这种问题时,尽量充分展示分析各类问题的能力。
面试提示
1)穿着得体。去创业公司面试,穿件衬衫就够了。去银行面试,最好穿西装,打领带。要是不确定穿什么合适,就提前问一下人力资源的人。
2)面试前,了解一下面试官和公司,想清楚要问的问题。
3)精神饱满。吃饱喝足,锻炼身体,尽量提前做好准备。
4)回答问题要详细,思路要清晰。
5)微笑,信心。用各种方式减缓压力,做做瑜伽、伸伸懒腰、读点闲书 — 尽可能保持巅峰状态。
结论
数据科学面试是个多面兽,求职者会面对各种挑战,现场编程、设计算法、统计知识、数学问题、领导能力、沟通技巧、说服力和影响力,真是不胜其烦。
数据科学面试很难,好在我们总结了求职成功者和招聘经理的想法与理念,将之整理成系统、可行的思路供大家参考。