💡 作者:韓信子@ShowMeAI
📘 機器學習實戰系列:https://www.showmeai.tech/tutorials/41
📘 本文位址:https://www.showmeai.tech/article-detail/295
📢 聲明:版權所有,轉載請聯系平台與作者并注明出處
📢 收藏ShowMeAI檢視更多精彩内容
我們在應用機器學習模型時,除了最終效果,也非常關注它們的性能。而機器學習模型的性能,不僅僅取決于我們的應用方式(特征多少、模型複雜度),也和硬體息息相關。
在本篇内容中,ShowMeAI 要給大家介紹到的是 Intel 針對 Scikit-Learn 機器學習工具庫做的加速不定,可以非常大程度加速我們的模型訓練與預測速度。
在我們的機器學習應用案例中,使用intel拓展加速的方式,僅僅花費原始模組化方式1/5的時間,可以完成一樣的任務達到一緻的效果。
💡 Scikit-Learn (SKlearn) 機器學習工具庫
Scikit-Learn (Sklearn) 是 Python 中最有用和最強大的機器學習庫。 它通過 Python 中的接口為機器學習和統計模組化提供了一系列有效工具,包括分類、回歸、聚類和降維。
- 📘 SKLearn 官網
- 📘 SKLearn Github
SKLearn 的快速使用方法也推薦大家檢視[ShowMeAI](https://www.showmeai.tech/)的文章和速查手冊:
- 機器學習實戰 | SKLearn入門與簡單應用案例
- 機器學習實戰 | SKLearn最全應用指南
- AI 垂直領域工具庫速查表 | Scikit-Learn 速查表
💡 面向 Scikit-Learn 的英特爾擴充
Scikit-Learn是一個大而全的工具庫,但它的性能并不總是最佳的,有時候一些 ML 算法可能需要數小時才能運作,時間成本很高。
面向 Scikit-Learn 的英特爾擴充(Intel(R) Extension for Scikit-learn)隻需在大家熟悉的模組化方法基礎上,添加幾行代碼,就能顯着提升性能,而且它也是開源的。
📌 scikit-learn-intelex 提速效果
通過 📘 scikit-learn-intelex 優化算法運作方式,可以獲得 1-3 個數量級的效率改進,最終取決于使用到的資料集和算法。
- Intel Extension for Scikit-Learn 提供了許多 Scikit-Learn 算法(下表)的優化實作,這些算法與原始版本一緻,有一樣的最終結果。
- 即使大家使用到了目前拓展不支援的算法或參數,工具包也會自動退回到原始 Scikit-Learn,保證大家無縫銜接,大部分代碼可以維持原來的形式,無需重寫代碼。
應用英特爾® Extension for Scikit-learn 可以對上述 Scikit-Learn 算法效率優化,具體的可以參考官網介紹。
💡 工具庫安裝&配置
Intel Extension for Scikit-Learn 支援 x86 架構上的 Linux、Windows 和 Mac 系統。 它可以使用 PyPI 或 Anaconda Cloud 下載下傳:
📌 從 PyPI 安裝
隻需在指令行運作 pip 指令進行安裝:
pip install scikit-learn-intelex
📌 從 Anaconda 安裝
◉ Conda-Forge方式:
сonda install scikit-learn-intelex -c conda-forge
◉ 英特爾管道:
conda install scikit-learn-intelex -c intel
◉ 預設方式:
conda install scikit-learn-intelex
📌 從容器安裝
請注意,正确通路連結需要 DockerHub 帳戶。
大家可以通過以下指令,将最新的英特爾® Scikit-Learn 擴充安裝為 Docker 容器:
docker pull intel/intel-optimized-ml:scikit-learn
💡 英特爾® Scikit-Learn 擴充使用方法:
📌 打更新檔 patch_sklearn
patch_sklearn
◉
patch
是一種保留 Scikit-Learn 庫存版本以供使用的方法,大家可以在代碼開頭添加它(
patch_sklearn()
函數調用),如下所示:
############### 在此處插入更新檔##########################
from sklearnex import patch_sklearn
patch_sklearn()
##################################################################
◉ 這個更新檔之後的所有import語句導入的來自
sklearn
的算法,都會優先導入Scikit-Learn優化版本
# Importing sklearn optimised version of LogisticRegression
from sklearn.linear_model import LogisticRegression
# Creating an object for model and fitting it on training data set
logmodel = LogisticRegression()
logmodel.fit(X_train_sm, y_train_sm)
# Predicting the Target variable
predicted = logmodel.predict(X_test)# Classification Report
report = metrics.classification_report(y_test, predicted)
🕯️ 注意:導入順序非常重要,請大家一定記得在導入Scikit-Learn工具庫之前打更新檔!
如果大家不想使用更新檔,可以随時通過 sklearnex.unpatch_sklearn()
取消intel的更新檔。
📌 其他替代方案
大家有很多替代方案,同樣可以啟用英特爾® Extension for Scikit-Learn優化:
◉ 在指令行直接使用拓展運作原始 Scikit-Learn 應用程式代碼擷取加速:
python -m sklearnex my_application.py
◉ 指定算法導入加速:
# 指定某個算法加速
from sklearnex import patch_sklearn
patch_sklearn("SVC")
# 指定若幹個算法加速
patch_sklearn(["SVC", "PCA"])
# 撤銷對于算法的加速更新檔
from sklearnex import unpatch_sklearn
unpatch_sklearn("SVC")
📌 檢視優化算法清單
# 可以直接檢視可加速算法清單
from sklearnex import get_patch_names
get_patch_names()
>>
['pca','kmeans','dbscan', 'distances','linear','ridge','elasticnet','lasso',
'logistic','log_reg','knn_classifier','nearest_neighbors',
'knn_regressor', 'random_forest_classifier','random_forest_regressor',
'train_test_split', 'fin_check','roc_auc_score', 'tsne', 'logisticregression',
'kneighborsclassifier', 'nearestneighbors','kneighborsregressor',
'randomrorestclassifier', 'randomforestregressor','svr', 'svc', 'nusvr',
'nusvc','set_config', 'get_config','config_context']
📌 全局更新檔
如果大家想使用全局更新檔來優化所有 Scikit-Learn 應用程式,無需任何額外操作,隻需要在指令行運作:
python sklearnex.glob patch_sklearn
💡 案例
我們用一個案例來說明一下,使用英特爾® Extension for Scikit-Learn,相比原始版本,有多大程度的提升,這裡使用到的業務場景是信用卡欺詐識别場景。
資料可以在 🏆 Kaggle場景資料 下載下傳,也可以在ShowMeAI 的百度網盤位址直接下載下傳。
🏆 實戰資料集下載下傳(百度網盤):公衆号『ShowMeAI研究中心』回複『實戰』,或者點選 這裡 擷取本文 [8] 面向 Scikit-Learn 的英特爾加速擴充更新檔 『creditcard 信用卡欺詐場景資料集』
⭐ ShowMeAI官方GitHub:https://github.com/ShowMeAI-Hub
📌 取消更新檔的原始版本
因為我們的電腦上進行了配置,intel優化的算法會全局生效,為了對比原始版本的sklearn速度,我們這裡使用
unpatch_sklearn()
函數取消更新檔,整個邏輯回歸模型訓練與測試花費了
35.5
秒。
################ Insert Patch here ############################
from sklearnex import unpatch_sklearn
unpatch_sklearn()
##########################################################
# 導入
from sklearn.linear_model import LogisticRegression
# 開始時間
start_time = time.time()
# 初始化模型并你和資料集
logmodel = LogisticRegression()
logmodel.fit(X_train_sm, y_train_sm)
# 測試集預估
predicted = logmodel.predict(X_test)
patched_time = time.time() - start_time
print("Time to calculate \033[1m logmodel.predict in Unpatched scikit-learn {:4.1f}\033[0m seconds".format(patched_time))
# 效果評估
report = metrics.classification_report(y_test, predicted)
print(f"Classification report for Logistic Regression with SMOTE:\n{report}\n")
運作結果截圖如下所示:
📌 添加更新檔的加速版本
下面是我們測試Intel優化版Logistic Regression算法, 代碼使用
patch_sklearn()
添加更新檔,最後 執行時間
7.1
秒,可以看到,隻花費了原始版本20%的時間,卻取得了完全一樣的效果!
💡 總結
- 優化常見 ML 算法的性能
- 減少 ML 訓練和推理時間
- 提供無縫體驗(隻需添加兩行代碼即可啟用加速)
參考資料
- 🏆 實戰資料集下載下傳(百度網盤):公衆号『ShowMeAI研究中心』回複『實戰』,或者點選 這裡 擷取本文 [8] 面向 Scikit-Learn 的英特爾加速擴充更新檔 『creditcard 信用卡欺詐場景資料集』
- ⭐ ShowMeAI官方GitHub:https://github.com/ShowMeAI-Hub
- 📘 SKLearn 官網:https://scikit-learn.org/stable/
- 📘 SKLearn Github:https://github.com/scikit-learn/scikit-learn
- 📘 scikit-learn-intelex:https://github.com/intel/scikit-learn-intelex
- 📘 機器學習實戰 | SKLearn入門與簡單應用案例:https://www.showmeai.tech/article-detail/202
- 📘 機器學習實戰 | SKLearn最全應用指南:https://www.showmeai.tech/article-detail/203
- 📘 AI 垂直領域工具庫速查表 | Scikit-Learn 速查表:https://www.showmeai.tech/article-detail/108