作者|Rebecca Vickery
編譯|VK
來源|Towards Datas Science
scikit-learn是2007年作為Googles Summer代碼項目開發的,現在被廣泛認為是最流行的機器學習Python庫。
為什么這個庫被認為是機器學習項目的最佳選擇之一,特別是在生產系統中,有許多原因。這些包括但不限於以下內容。
-
它對庫的開發有很高的支持和嚴格的管理,這意味着它是一個非常健壯的工具。
-
有一個清晰、一致的代碼風格,確保機器學習代碼易於理解和可復制,同時也大大降低了編寫機器學習模型的門檻。
-
它受到第三方工具的廣泛支持,因此可以豐富功能以適應各種用例。
如果你正在學習機器學習,那么Scikit learn可能是開始學習的最佳庫。它的簡單性意味着它相當容易掌握,通過學習如何使用它,你還可以很好地掌握典型的機器學習工作流中的關鍵步驟。
下面這篇文章是對該工具的初學者友好的介紹,應該能讓你對開發一個簡單的機器學習模型有足夠的了解。
要安裝Scikit的最新版本,請運行以下命令。
pip install scikit-learn
本文中的代碼示例運行在可以直接從Scikit-learn api導入的經典wine數據集上。
from sklearn.datasets import load_wine
X,y = load_wine(return_X_y=True)
Estimators
Scitkit學習庫提供了大量的預構建算法來執行有監督和無監督的機器學習。它們通常被稱為Estimators。
你為你的項目選擇的Estimators將取決於你擁有的數據集和你試圖解決的問題。Scikit學習文檔提供了如下所示的圖表,幫助你確定哪種算法適合你的任務。
Scikit learn之所以能如此直接地使用,是因為無論你使用的模型或算法是什么,用於模型訓練和預測的代碼結構都是相同的。
為了說明這一點,讓我們通過一個例子。
假設你正在處理一個回歸問題,並希望訓練一個線性回歸算法,並使用得到的模型進行預測。使用Scikit learn的第一步是調用logistic回歸Estimator並將其另存為對象。下面的示例調用該算法並將其保存為一個名為lr的對象。
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
下一步是根據一些訓練數據擬合模型。這是使用fit()方法執行的。我們在特征和目標數據調用lr.fit(),並將生成的模型另存為名為model的對象。在下面的例子中,我也用train方法將數據集分割成測試集。
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
model = lr.fit(X_train, y_train)
下一步,我們使用模型和predict()方法來預測以前看不到的數據。
predictions = model.predict(X_test)
如果我們現在要使用Scitkit learn執行不同的任務,比如說,我們想訓練一個隨機森林分類器。代碼看起來非常相似,並且具有相同的步驟數。
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier()
rf_model = rf.fit(X_train, y_train)
rf_predictions = rf_model.predict(X_test)
這種一致的代碼結構使得開發機器學習模型非常直接,而且生成的代碼具有很高的可讀性和可重復性。
預處理
在大多數實際的機器學習項目中,你使用的數據不一定准備好訓練模型。你很可能首先需要執行一些數據預處理和轉換步驟,例如處理缺失值、將類別數據轉換為數值或應用特征縮放。
scikitlearn有內置的方法來執行這些預處理步驟。例如,SimpleImputer()使用你選擇的方法填充缺少的值。
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy='mean')
X_train_clean = imputer.fit(X_train)
Scikit學習文檔在這里列出了數據預處理的完整選項。
評估
一旦一個模型被訓練過,你需要衡量這個模型在預測新數據方面有多好。此步驟稱為模型評估,你選擇的度量將由你嘗試解決的任務確定。例如,通常在回歸問題中,你可以選擇RMSE,而對於分類,你可以選擇F1分數。
所有Estimator都包含一個score()方法,該方法返回與所執行的機器學習任務最相關的默認度量。
Scikit learn還提供了一組度量函數,這些函數為模型提供了更詳細的評估。例如,對於分類任務,庫有一個分類報告,它提供精度、召回率、F1分數和總體准確度。
分類報告代碼和輸出如下所示。
from sklearn.metrics import classification_report
print(classification_report(rf_predictions, y_test))
模型優化
Scikit學習庫中的所有Estimator都包含一系列參數,其中有多個選項。為特定算法選擇的值將影響最終模型的性能。例如,使用RandomForestClassifier,可以將樹的最大深度設置為可能的任何值,並且根據你的數據和任務,此參數的不同值將產生不同的結果。
這種嘗試不同參數組合以找到最佳組合的過程稱為超參數優化。
Scikit learn提供了兩個工具來自動執行此任務,GridSearchCV實現了一種稱為窮舉網格搜索的技術,RandomizedSearchCV執行隨機參數優化。
下面的示例使用GridSearchCV為RandomForestClassifier查找最佳參數。輸出顯示在代碼下面。
param_grid = {
'n_estimators': [200, 500],
'max_features': ['auto', 'sqrt', 'log2'],
'max_depth' : [4,5,6,7,8],
'criterion' :['gini', 'entropy']
}
from sklearn.model_selection import GridSearchCV
CV = GridSearchCV(rf, param_grid, n_jobs= 1)
CV.fit(X_train, y_train)
print(CV.best_params_)
print(CV.best_score_)
管道
Scikit-learn包以管道的形式提供了更方便的代碼封裝形式。此工具使所有預處理任務都可以與分類器步驟鏈接在一起,因此只需對單個管道對象調用fit()或predict()即可執行工作流中的所有步驟。
這使得代碼具有很高的可讀性,並減少了機器學習工作流中的重復步驟。
為了創建管道,我們首先在下面的代碼中定義我稱為pipe的對象中的步驟。然后我們可以簡單地調用這個對象的fit來訓練模型。管道對象還可以用於對新數據進行預測。
from sklearn.pipeline import Pipeline
pipe = Pipeline([('imputer', SimpleImputer()), ('rf', RandomForestClassifier())])
pipeline_model = pipe.fit(X_train, y_train)
pipeline_model.score(X_test, y_test)
原文鏈接:https://towardsdatascience.com/a-beginners-guide-to-scikit-learn-14b7e51d71a4
歡迎關注磐創AI博客站:
http://panchuang.net/
sklearn機器學習中文官方文檔:
http://sklearn123.com/
歡迎關注磐創博客資源匯總站:
http://docs.panchuang.net/