歡迎來個人簡書:呆鳥的譯Py胡言python
與其它崗位的面試相似,數據科學麪試也包括大量行爲試題,面試官會考覈求職者的軟技能,瞭解求職者可否適應公司的企業文化。mysql
請說明你之前作過的數據科學項目?面試
目的:瞭解求職者對相關知識的理解程度,曾作過什麼樣的貢獻。測試描述工做內容的能力,以及可否把數據科學項目經歷與對公司產生的影響聯繫起來。算法
應答思路:sql
對之前的崗位,你喜歡什麼?反感什麼?數據庫
目的:判斷你適不適合面試的崗位,瞭解你離職的緣由。編程
應答思路:數組
請說明,當必須說服別人認同你的觀點時,你是怎麼作的,效果如何?網絡
目的:瞭解你如何堅守本身的立場,以及影響他人的能力。數據結構
應答思路: 舉例說明你曾經成功地改變現狀,量化這些改變帶來的影響。若是能夠的話,舉出數據科學類的例子。此時,可以表現出溝通技巧與領導能力很是重要。
數據科學家崗位的數學問題,不只須要求職者能執行算法,還要能根據特定目的調整算法。
如何使用線性迴歸算法求解最優係數?(C3能源的數據科學家面試時曾問過這個問題)
原理:瞭解求職者對線性迴歸理論的理解程度,線性迴歸理論對不少數據科學崗位都十分重要,數據科學家不能把算法視爲黑箱,不只要能執行算法,還要能理解算法。這類問題(各類算法)測試求職者對算法的理解程度。
應答思路:簡述每一步思路,列出方程式。描述思路的同時,還要詳細說明解決方案。
答案:在最高水平上,係數是最小化殘差平方和的函數。下一步,列出方程,說明什麼是殘差。想要更進一步的話,能夠考慮以下內容: 1)用給定的線性迴歸模型,列出殘差平方和的最小化目標,最好用線性代數(矩陣)表示法。 2)殘差平方和是可求微分的凸函數,將微分設爲0,求解該方程,可導出係數,解出最小化方程式。 3)第2條給出的解決方案使用多項式時間求解線性代數問題,須要說這種方式比較複雜;還有一種常見的解決方案,經過觀測能夠發現該方程式是凸性的,所以用梯度降低這樣的數值算法求解效率會更高。
統計學知識對解決數據科學問題相當重要。統計推理能力和統計學理論測試十分常見。必定要牢記經常使用的統計學概念,好比I型錯誤、II型錯誤,熟練掌握各類機率分佈概念。
原理:測試統計學基本概念的掌握程度、統計學基礎水平,評測怎麼使用統計學專業術語溝通各方人員的能力。
應答思路:要有理有據,準確說明問題裏的名詞定義。
答案: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起事故,他是暴脾氣司機的可能性是多少?」畫出顯示機率的維恩圖:一年內發生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. 泊松分佈。假設每一個客人的到店行爲都是徹底獨立的,與其餘人沒有關係。
b. 正態分佈。注意,在連續分佈中,精確到X英寸的可能性爲零。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答題技巧:
原理:在規定時間內,寫出算法背後的思想,並進行有效佈署,這是評估數據開發能力的關鍵。這類問題通常會用來考覈數據科學家的算法與技術實現能力,也會用來考覈數據工程師的技術能力,一般會要求在給定條件下實現相應的算法。這個問題適用於各種算法,但大多數狀況下以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或大數據工具的相關經驗,或應聘的公司有處理大規模數據集的需求,就問會這方面的問題。擁有超過百萬用戶規模數據的財富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系統常常會在機器出現故障時生成多個數據副本。
原理:這個問題旨在測試求職者提交總體產品的思路。情景問題不測試各領域的知識細節,可是須要求職者描述從開始規劃到交付產品的各個環節,目的是要了解求職者哪些方面的知識存在不足。這個問題除了評估求職者設計產品的全面知識,還要測試求職者的團隊管理能力與協同能力。
面試官常常會問數據科學家這個問題,數據工程師或數據分析師只要回答這種情景問題的部份內容就能夠了。通常狀況下,會問數據工程師如何實現相關算法,而不用考慮算法自己;還會問數據分析師查詢哪些數據以肯定用戶對鞋品的歷史偏好。
應答思路:坦誠地說明本身哪些方面比較拿手,哪些方面不太熟悉,但重點要說明有經驗的內容,若是有不熟悉的內容,也別很差意思,該問就問。儘可能把技術知識與業務成果聯繫起來,說明作出選擇的思路和假設。若是能提出更好地解決方案,別猶豫,多提問,必定要把問題理解透徹。
答案:將這個問題分解爲數據科學與數據開發兩部分。
先探討數據科學部分,對於沒有多少用戶歷史數據的新公司,能夠用近似項目法解決。若是其它項目和鞋品的數據差別過大,能夠考慮用矩陣分解技術降維處理。
假設有鞋品評級等用戶偏好歷史數據,能夠用協同過濾類型法。特別要說明生成矩陣的行和列。而後,再討論用哪一種類似性指標,好比,歐式距離,類似度或餘弦距離。
解釋完算法,就能夠說明數據開發部分了。要提出能拓展到百萬量級的用戶/鞋品數據工程基礎架構,還要能實時生成推薦信息。例如,將用戶數據以數據流的形式傳輸到S3存儲桶。設計該系統要基於全部個體用戶,能夠設計成每晚進行矩陣分析,預計算整個數據集的推薦信息,將結果存儲在Redis這樣的內存數據庫裏。而後,構建REST API查詢數據庫,對每一個給定的用戶標識進行響應式推薦。
原理:本題旨在瞭解求職者對業務的理解,以及將複雜問題分解爲基礎概念,再根據有效數據將這些概念轉換爲可分析模塊的能力。這個測試能夠看出求職者對公司數據架構的瞭解,還有溝通業務數據分析結果的水平。
應答思路:仔細研究應聘公司,特別是其盈利模式。瞭解該公司使用哪些重點指標跟蹤績效,搞明白該公司如何實現盈收。問清楚要解決的問題,提出假設。回答問題時,別緊張、要自信,像給平時給領導彙報工做同樣就能夠了。
答案:回答這個問題要對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把該模型發佈到生產環境。這個模型還可處理其它新文章,使用和第二、3步相同的流程進行清理便可。
原理:網絡公司大多會測試這個問題,由於優化網站爭取更好的業績是他們的生存之本。好比,Facebook就常常優化主頁,刺激用戶發佈更多帖子。數據科學家的職責是幫助產品經理設計實驗,解釋實驗結果。這個問題旨在瞭解求職者對這個主題的認知水平。
解決方案:列出改版的本質和選擇網站版本的決定性指標。例如,點擊率與Facebook的平均分享次數。
接下來肯定達到統計顯著性(例如95%)的必要樣本和訪問次數。可使用卡方檢驗(使用是否點擊這樣的二項式隨機變量)或Z檢驗(使用正態分佈隨機變量)。而後,評估P值,肯定B檢驗的指標與基準A檢驗的指標是否在統計上有顯著不一樣,若是存在顯著不一樣,且新版指標優於基準指標,則新版網站是最好的選擇。
回答問題時,要考慮的問題:
1)識別因頁面交互產生的潛在誤差。和產品經理交流,探討有沒有可能隨機樣本沒法測試出改版的本質。
2)對兩個訪客隨機樣本進行A/A測試,檢查選擇的分佈和指標是否未具有統計顯著差別。這是爲了保證A/B測試的公平性。A/A測試可確保受衆沒有特定的偏置或誤差,而且確保A/B測試中隨機選擇的統計相關性。
3)假如評估指標中顯著異常值,這樣的話,平均值就不宜做爲評估指標,此時,分佈也可能會出現高度誤差。雖然根據中心極限定理能夠假設平均值做爲比較指標,但有時這種假設也可能不成立。所以,要覈查指標,確保在對比不一樣方案時,轉換率或用戶分享次數的平均值是理想的指標。若是某個用戶的分享次數多達幾千次,使用每一個用戶的分享率就不是最佳的性能指標了。
總之,案例問題旨在測試求職者的經驗和數據科學各領域的知識。目的是瞭解求職者的能力是否具備侷限性。遇到這種問題時,儘可能充分展現分析各種問題的能力。
1)穿着得體。去創業公司面試,穿件襯衫就夠了。去銀行面試,最好穿西裝,打領帶。要是不肯定穿什麼合適,就提早問一下人力資源的人。
2)面試前,瞭解一下面試官和公司,想清楚要問的問題。
3)精神飽滿。吃飽喝足,鍛鍊身體,儘可能提早作好準備。
4)回答問題要詳細,思路要清晰。
5)微笑,信心。用各類方式減緩壓力,作作瑜伽、伸伸懶腰、讀點閒書 — 儘量保持巔峯狀態。
數據科學麪試是個多面獸,求職者會面對各類挑戰,現場編程、設計算法、統計知識、數學問題、領導能力、溝通技巧、說服力和影響力,真是不勝其煩。
數據科學麪試很難,好在咱們總結了求職成功者和招聘經理的想法與理念,將之整理成系統、可行的思路供你們參考。