路線圖#

本文件的目的#

本文件列出了核心貢獻者有興趣在 scikit-learn 中開發的一般方向。這裡列出的項目並不代表承諾一定會實現,因為資源有限。相反地,這表示歡迎針對這些主題提供協助。

目的聲明:2018 年的 Scikit-learn#

在 Scikit-learn 創立十一年後,機器學習的世界發生了很大變化。主要的變化包括:

  • 計算工具:GPU 的利用、Scala/Spark 等分散式程式設計框架。

  • 用於實驗、處理和資料管理的高階 Python 函式庫:Jupyter Notebook、Cython、Pandas、Dask、Numba…

  • 機器學習研究重點的變化:人工智慧應用程式(其中輸入結構是關鍵),包括深度學習、表徵學習、強化學習、領域轉移等。

過去十年更細微的變化是,由於機器學習興趣的變化,機器學習的博士生更有可能貢獻於 PyTorch、Dask 等,而不是 Scikit-learn,因此我們的貢獻者群體與十年前非常不同。

Scikit-learn 在實務中仍然非常受歡迎,可以用於嘗試標準的機器學習技術,特別是在實驗科學和資料科學中的應用。我們現在提供的許多功能都非常成熟。但維護成本可能很高,因此我們無法包含任意的新實作。然而,Scikit-learn 對於定義可互通的機器學習元件(核心函式庫外部)的 API 框架也至關重要。

因此,我們在這個時代的主要目標是::

  • 繼續在目前範圍內(即,主要與欄和列順序無關的矩形資料;預測具有簡單結構的目標)維護高品質、文件完善的標準資料處理和機器學習工具集合。

  • 改善使用者開發和發布外部元件的便利性

  • 改善與現代資料科學工具(例如 Pandas、Dask)和基礎架構(例如分散式處理)的互通性

許多更細微的目標可以在議題追蹤器上的 API 標籤下找到。

架構/一般目標#

清單編號不是為了表示優先順序,而是為了讓參考特定點更容易。請僅在底部新增新條目。請注意,劃掉的條目已完成,我們會在處理這些問題時嘗試保持文件更新。

  1. 改進 Pandas DataFrames 的處理

    • 記錄目前的處理方式

  2. 改進類別特徵的處理

    • 基於樹狀結構的模型應能夠處理連續和類別特徵 #29437

    • 處理類別和連續變數的混合

  3. 改進遺失資料的處理

    • 透過實作常見測試,確保 Meta 估計器對遺失資料採取寬鬆態度。

    • 用於使資料集部分遺失的截斷取樣產生器 #6284

  4. 更具教學性的文件

    • scikit-learn 中新增了越來越多的選項。因此,文件內容很擁擠,這讓初學者難以了解全貌。可以優先處理資訊方面的一些工作。

  5. 傳遞不是 (X, y) 的資訊:特徵屬性

    • 每個特徵的處理(例如「這是名義/序數/英文文字?」)也不應該需要提供給估計器建構函式,理想情況下,應該作為 X 的元資料提供。#8480

  6. 傳遞不是 (X, y) 的資訊:目標資訊

    • 當資料分割/取樣時,我們在將完整的類別集合傳遞到所有元件時遇到問題。#6231 #8100

    • 我們無法處理類別和連續目標的混合。

  7. 讓外部使用者更容易編寫與 Scikit-learn 相容的元件

    • 更獨立地執行 scikit-learn-contrib 或類似資源

  8. 支援重新取樣和樣本縮減

    • 允許對多數類別進行子取樣(在管道中?)。#3855

  9. 改善互動式開發的介面

    • 透過 estimator_html_repr 改善估計器的 HTML 可視化。

    • 加入更多繪圖工具,而不僅僅是作為範例。

  10. 改善模型診斷和基本推論的工具

    • 開發「特徵重要性」的統一介面

    • 在擬合時,有更好的方法來處理驗證集

  11. 使用傳導式估計器選擇超參數的更好工具

    • 網格搜尋和交叉驗證不適用於大多數叢集任務。基於穩定性的選擇更相關。

  12. 更好地支援手動和自動管線建置

    • 更容易建構複雜的管線和有效的搜尋空間 #7608 #5082 #8243

    • 提供常見估計器的搜尋範圍?

    • 參見 searchgrid

  13. 改進擬合的追蹤

    • Verbose 不太友善,應該使用標準記錄函式庫 #6929#78

    • 回呼或類似系統將有助於記錄和提前停止

  14. 分散式平行處理

    • 接受符合 __array_function__ 的資料

  15. 更多核心外作業的方法

    • Dask 可輕鬆實現核心外運算。雖然 Dask 模型可能無法適用於所有機器學習演算法,但大多數機器學習的資料量小於 ETL,因此我們或許可以在僅支援一部分模式的情況下,適應非常大規模的運算。

  16. 某些估計器的向後相容去/序列化

    • 目前,序列化(使用 Pickle)會在不同版本之間中斷。雖然我們可能無法解決 Pickle 在安全性等方面的其他限制,但最好能從 1.0 版本開始提供跨版本安全。注意:Gael 和 Olivier 認為這可能會造成沉重的維護負擔,我們應該管理權衡。以下一點提出了一種可能的替代方案。

  17. 模型生命週期管理的文件和工具

    • 記錄模型部署和生命週期的良好實務:在部署模型之前:快照程式碼版本(numpy、scipy、scikit-learn、自訂程式碼存放庫)、訓練指令碼和如何擷取歷史訓練資料的別名 + 快照一個小的驗證集副本 + 快照該驗證集上的預測(分類器的預測機率)。

    • 記錄和提供工具,以便輕鬆管理 scikit-learn 版本的升級

      • 嘗試載入舊的 Pickle,如果可行,請使用驗證集預測快照來偵測序列化的模型是否仍執行相同行為;

      • 如果 joblib.load/pickle.load 無法運作,請使用版本控制的訓練指令碼 + 歷史訓練集來重新訓練模型,並使用驗證集預測快照來斷言是否可以恢復先前的預測效能:如果不是這種情況,則可能是 scikit-learn 中存在需要回報的錯誤。

  18. scikit-learn 中的所有內容可能都應符合我們的 API 合約。我們仍在決定一些相關問題。

    • Pipeline <pipeline.Pipeline>FeatureUnion 會修改其在擬合中的輸入參數。修正這個問題需要我們充分掌握它們的使用案例,以確保維持所有目前的功能。#8157 #7382

  19. (選用)改善 scikit-learn 常見測試套件,以確保(至少對於經常使用的模型)在不同版本中具有穩定的預測(待討論);

    • 擴展文件以提及如何在無 Python 環境中部署模型,例如 ONNX。並使用上述最佳實務來評估 scikit-learn 和 ONNX 預測函式在驗證集上的預測一致性。

    • 記錄檢測已部署模型的時間分佈漂移的良好實務,以及在不導致災難性預測效能衰退的情況下,重新訓練新資料的良好實務。