# 附錄 B、機器學習項目清單
> 譯者:[@qiwihui](https://github.com/qiwihui)
此清單可以指導你完成機器學習項目。主要有八個步驟:
1. 將問題框架化并且關注重點。
2. 獲取數據。
3. 探索數據以洞悉數據。
4. 準備數據以更好地將基礎數據模式暴露給機器學習算法。
5. 探索多種不同的模型并列出最好的那些。
6. 微調模型并將它們組合成一個很好的解決方案。
7. 展示你的解決方案。
8. 啟動,監督并維護你的系統。
顯然,你應該根據你的需求調整此清單。
## 將問題框架化并且關注重點
1. 用業務術語定義目標。
2. 你的解決方案將如何使用?
3. 目前的解決方案/解決方法(如果有的話)是什么?
4. 你應該如何解決這個問題(監督/非監督,在線/離線等)?
5. 如何度量模型的表現?
6. 模型的表現是否和業務目標一致?
7. 達到業務目標所需的最低性能是多少?
8. 類似的問題如何解決?是否可以復用經驗或工具?
9. 人員是否專業?
10. 你如何動手解決問題?
11. 列出目前你(或者其他人)所做的假設。
12. 如果可能,驗證假設。
## 獲取數據
注意:盡可能自動化,以便你輕松獲取新數據。
1. 列出你需要的數據和數據量。
2. 查找并記錄你可以獲取該數據的位置。
3. 檢查它將占用多少存儲空間。
4. 檢查法律義務并在必要時獲取授權。
5. 獲取訪問權限。
6. 創建工作目錄(擁有足夠的存儲空間)。
7. 獲取數據。
8. 將數據轉換為你可以輕松操作的格式(不更改數據本身)。
9. 確保刪除或保護敏感信息(比如,匿名)。
10. 檢查數據的大小和類型(時間序列,樣本,地理信息等)。
11. 抽樣出測試集,將它放在一邊,以后不需要關注它(沒有數據窺探!)。
## 探索數據
注意:嘗試從領域專家那獲取有關這些步驟的見解。
1. 創建用于探索的數據副本(如有必要,將其取樣為可管理的大小)。
2. 創建一個 Jupyter 筆記本來記錄你的數據探索。
3. 研究每個屬性及其特征:
- 名稱;
- 類型(分類,整數/浮點數,有界/無界,文本,結構化數據等);
- 缺失數據的百分比;
- 噪聲點和它的類型(隨機點,異常點,舍入誤差等);
- 對任務可能有用嗎?
- 分布類型(高斯分布,均勻分布,對數分布等)。
4. 對于監督學習任務,確定目標屬性。
5. 可視化數據。
6. 研究屬性間的相關性。
7. 研究怎如何手動解決問題。
8. 確定你想要應用的有效的轉換。
9. 確定有用的額外數據。
10. 記錄你所學到的知識。
## 準備數據
注意:
- 處理數據副本(保持原始數據集完整)。
- 為你應用的所有數據轉換編寫函數,原因有五:
- 你可以在下次獲得新數據集時輕松準備數據
- 你可以在未來的項目中應用這些轉換
- 用來清洗和準備測試數據集
- 一旦項目上線你可以用來清洗和準備新的數據集
- 為了便于將你的準備選擇視為超參數
1. 數據清洗:
- 修正或移除異常值(可選)。
- 填補缺失值(比如用零,平均值,中位數等)或者刪除所在行(或者列)。
2. 特征提取(可選):
- 丟棄不提供有用信息的屬性;
3. 適當的特征工程:
- 連續特征離散化。
- 分解特征(比如分類,日期/時間等)。
- 對特征添加有益的轉換(比如 log(x),sqrt(x),x^2 等)
- Aggregate features into promising new features. 將一些特征融合為有益的新特征
4. 特征縮放:標準化或者正規化特征。
## 列出有用模型
注意:
- 如果數據量巨大,你可能需要采樣出較小的訓練集,以便在合理的時間內訓練許多不同的模型(請注意,這會對諸如大型神經網絡或隨機森林等復雜模型進行處罰)。
- 再次嘗試盡可能自動化這些步驟。
1. 使用標準參數訓練許多快速、粗糙的模型(比如線性模型,樸素貝葉斯模型,支持向量機模型,隨機森林模型,神經網絡等)。
2. 衡量并比較他們的表現。
- 對于每個模型,使用 N 折交叉驗證法,并且計算基于 N 折交叉驗證的均值與方差。
3. 分析每種算法的最重要變量。
4. 分析模型產生的錯誤類型。
- 人們用什么數據來避免這些錯誤?
5. 進行一輪快速的特征提取和特征工程。
6. 對之前的五個步驟進行一兩次的快速迭代。
7. 列出前三到五名最有用的模型,由其是產生不同類型錯誤的模型。
## 微調系統
注意:
- 這一步你將會使用盡可能多的數據,特別是當你微調結束時。
- 像之前一樣盡可能自動化。
1. 使用交叉驗證方法調節超參數
- 要像調節超參數那樣對待數據轉換的過程,特別是當你不知如何下手的時候(比如,我應該是用零或中值替換缺失值嗎?或者直接丟棄它們?)
- 除非要探索的超參數值非常少,否則最好使用隨機搜索而非網格搜索。如果訓練的時間很長,你應該使用貝葉斯優化方法(比如,使用在 [Jasper Snoek,Hugo Larochelle 和 Ryan Adams 的論文](https://arxiv.org/pdf/1206.2944.pdf)中描述的,用高斯處理先驗)
2. 嘗試集成方法,結合最佳模型通常比單獨運行它們更好。
3. 一旦你對最終的模型有自信,請在測試集上測量其性能以估計泛化誤差。
> 在測量泛化誤差后不要調整模型:你會開始過度擬合測試集的。
## 展示你的解決方案
1. 將你做的工作整理成文檔。
2. 制作精美的演示。
- 確保你首先突出重點。
3. 解釋你的解決方案實現業務目標的原因。
4. 不要忘記展示在這過程中你注意到的有趣的點。
- 描述哪些有效,哪些無效。
-列出你的假設和系統的限制。
5. 確保通過精美的可視化或易于記憶的陳述來傳達你的主要發現(例如,“收入中位數是房價的第一預測因子”)。
## 啟動
1. 準備好生產解決方案(插入生產數據輸入,編寫單元測試等)。
2. 編寫監控代碼以定期檢查系統的實時性能,并在信號丟失時觸發警報。
- 謹防模型退化:隨著數據的進入,模型往往會“腐爛”。
- 評估模型可能需要大量的人力(比如,通過眾包服務可以解決這個問題)
- 同時監控輸入數據的質量(例如,一個有故障的傳感器發送隨機數據,或者另外一個團隊的輸出變得陳舊),這對于在線學習系統尤其重要。
3. 定期在新數據上重新訓練模型(盡可能自動化)。