天天看點

如何使用 scikit-learn 庫進行機器學習的模組化和評估

作者:積極的python程式猿

什麼是 scikit-learn 庫

如何使用 scikit-learn 庫進行機器學習的模組化和評估

圖檔來源于網絡

scikit-learn 是一個基于 Python 語言的開源機器學習庫。它包含了大量的機器學習算法,如分類、回歸、聚類、降維等,同時還提供了模型選擇、資料預處理、模型評估等功能。scikit-learn 的優點在于簡單易用、豐富的功能和良好的文檔支援1。

如何安裝 scikit-learn 庫

scikit-learn 庫可以通過 pip 或者 conda 來安裝。使用 pip 直接安裝的指令是:

pip install scikit-learn
           

使用 conda 安裝的指令是:

conda install scikit-learn
           

安裝完成後,可以在 Python 中檢查一下版本,如果 import sklearn 不報錯,則表示安裝成功。

import sklearn
sklearn.__version__
           

如何使用 scikit-learn 庫進行機器學習的模組化和評估

scikit-learn 庫提供了統一的接口來使用不同的機器學習算法。一般來說,使用 scikit-learn 庫進行機器學習的模組化和評估需要以下幾個步驟:

  1. 擷取資料:可以使用 scikit-learn 自帶的資料集,也可以從其他來源導入資料。
  2. 資料預處理:對資料進行清洗、轉換、标準化、劃分等操作,使資料适合機器學習算法。
  3. 訓練模型:選擇合适的機器學習算法,并用訓練資料拟合模型。
  4. 模型評估:使用測試資料或者交叉驗證等方法,評估模型的性能和泛化能力。
  5. 模型優化:根據模型評估的結果,調整模型的參數或者選擇其他算法,以提高模型的效果。
  6. 預測結果:使用訓練好的模型,對新的資料進行預測或者分類。

下面我們以一個簡單的例子來說明如何使用 scikit-learn 庫進行機器學習的模組化和評估。我們将使用 scikit-learn 自帶的鸢尾花資料集(iris dataset),并通過邏輯回歸算法(logistic regression)實作對鸢尾花的分類。

擷取資料

scikit-learn 自帶了很多資料集,可以用來對算法進行測試分析,免去了自己再去找資料集的煩惱。scikit-learn 的自帶資料集有:

  • 鸢尾花資料集:load_iris()
  • 手寫數字資料集:load_digits()
  • 糖尿病資料集:load_diabetes()
  • 乳腺癌資料集:load_breast_cancer()
  • 波士頓房價資料集:load_boston()
  • 體能訓練資料集:load_linnerud()

在這裡,我們導入 scikit-learn 自帶的鸢尾花資料集:

# 導入 scikit-learn 的資料集
import sklearn.datasets as sk_datasets

# 加載鸢尾花資料集
iris = sk_datasets.load_iris()

# 擷取資料和标簽
iris_X = iris.data
iris_y = iris.target
           

如果你想檢視資料集對象的屬性和方法,可以使用 dir() 函數:

from sklearn.datasets import load_iris
dir(load_iris())
           

如果你想檢視資料集的描述,可以使用 DESCR 屬性:

from sklearn.datasets import load_iris
print(load_iris().DESCR)
           

鸢尾花資料集是一個常用的分類實驗資料集,由 R.A. Fisher 于 1936 年收集整理的。該資料集一共包含 4 個特征變量,1 個類别變量。共有 150 個樣本,鸢尾花分為三類。每個樣本的特征變量和類别變量如下表所示:

特征變量 類别變量
萼片長度 品種
萼片寬度 品種
花瓣長度 品種
花瓣寬度 品種

資料預處理

在機器學習中有一句名言:資料和特征決定了機器學習的上限,而模型和算法的應用隻是讓我們逼近這個上限。資料預處理階段是機器學習中不可缺少的一環,它會使得資料更加有效地被模型或者評估器識别。這個階段主要包括資料标準化和資料集劃分兩個部分。

資料标準化

與普通的資料挖掘不同,機器學習的資料還需要進行資料标準化,包括對樣本尺度歸一化、正則化等;此外還要根據資料特征進行特征二值化、one-hot 編碼等操作,這些工作簡單可複制,經過資料預處理的資料能夠更好地幫助我們進行特征處理。

當我們拿到一批原始的資料時,需要思考以下問題:

  • 對連續的數值型特征進行标準化,使得均值為 0,方差為 1。
  • 對類别型的特征進行 one-hot 編碼。
  • 将需要轉換成類别型資料的連續型資料進行二值化。
  • 為防止過拟合或者其他原因,選擇是否要将資料進行正則化。
  • 檢查有沒有缺失值,對缺失的特征選擇恰當方式進行彌補,使資料完整。

為了使得訓練資料的标準化規則與測試資料的标準化規則同步,preprocessing 中提供了很多的 Scaler。

from sklearn import preprocessing
           

區間縮放(Min-Max scaling)

區間縮放法是将原始資料中特征的取值區間轉換到 [0, 1] 範圍。公式如下:

xscaled​=xmax​−xmin​x−xmin​​​​

使用 preprocessing 庫的 MinMaxScaler 類對資料進行區間縮放的代碼如下:

from sklearn.preprocessing import MinMaxScaler

# 建立一個 MinMaxScaler 對象
scaler = MinMaxScaler(feature_range=(0, 1))

# 對 iris_X 進行區間縮放
iris_X = scaler.fit_transform(iris_X)
           

資料集劃分

資料集劃分是将資料集分為訓練集和測試集兩部分,訓練集用于拟合模型,測試集用于評估模型。一般來說,訓練集占資料集的 70%~80%,測試集占資料集的 20%~30%。資料集劃分的目的是為了檢驗模型的泛化能力,即模型對未知資料的預測能力。

使用 preprocessing 庫的 train_test_split 函數對資料進行劃分的代碼如下:

from sklearn.model_selection import train_test_split

# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(
    iris_X, iris_y, test_size=0.2, random_state=111
)
           

訓練模型

訓練模型是使用訓練集中的資料和标簽,通過機器學習算法來拟合一個模型,使得模型能夠盡可能地拟合資料的規律。scikit-learn 庫提供了多種機器學習算法,如線性回歸、邏輯回歸、決策樹、支援向量機、K 近鄰、樸素貝葉斯等。每種算法都有自己的優缺點和适用場景,需要根據具體的問題和資料來選擇合适的算法。

在這裡,我們選擇邏輯回歸算法來對鸢尾花進行分類。邏輯回歸算法是一種常用的分類算法,它可以處理二分類或者多分類問題。它的原理是使用一個 S 形函數(sigmoid function)将線性組合轉換為機率值,然後根據機率值來判斷類别。

使用 scikit-learn 庫的 linear_model 子產品中的 LogisticRegression 類來建立一個邏輯回歸模型,并用 fit 方法來訓練模型的代碼如下:

from sklearn.linear_model import LogisticRegression

# 建立一個邏輯回歸模型對象
log_reg = LogisticRegression()

# 用訓練集拟合模型
log_reg.fit(X_train, y_train)
           

模型評估

模型評估是使用測試集中的資料和标簽,通過一些名額來評估模型的性能和泛化能力。scikit-learn 庫提供了多種模型評估名額,如準确率、精确率、召回率、F1 值、AUC 值等。每種名額都有自己的含義和計算方法,需要根據具體的問題和目标來選擇合适的名額。

在這裡,我們選擇準确率作為模型評估名額。準确率是指模型預測正确的樣本數占總樣本數的比例。公式如下:

accuracy=TP+TNTP+TN+FP

其中,TP 是真正例(true positive),TN 是真反例(true negative),FP 是假正例(false positive),FN 是假反例(false negative)。

使用 scikit-learn 庫的 metrics 子產品中的 accuracy_score 函數來計算準确率的代碼如下:

from sklearn.metrics import accuracy_score

# 用測試集預測類别
y_pred = log_reg.predict(X_test)

# 計算準确率
accuracy = accuracy_score(y_test, y_pred)

# 列印準确率
print("The accuracy of the model is: {:.2f}%".format(accuracy * 100))
           

模型優化

模型優化是根據模型評估的結果,調整模型的參數或者選擇其他算法,以提高模型的效果。scikit-learn 庫提供了多種模型優化方法,如網格搜尋、随機搜尋、貝葉斯優化等。每種方法都有自己的優缺點和适用場景,需要根據具體的問題和資料來選擇合适的方法。

在這裡,我們選擇網格搜尋作為模型優化方法。網格搜尋是一種暴力搜尋方法,它會周遊給定的參數範圍,對每一種參數組合都進行訓練和評估,然後選擇最優的參數組合。

使用 scikit-learn 庫的 model_selection 子產品中的 GridSearchCV 類來進行網格搜尋的代碼如下:

from sklearn.model_selection import GridSearchCV

# 定義要搜尋的參數範圍
log_reg_params = {"C": [0.01, 0.1, 1, 10, 100]}

# 建立一個網格搜尋對象
grid_search = GridSearchCV(log_reg, log_reg_params, cv=10)

# 用訓練集進行網格搜尋
grid_search.fit(X_train, y_train)
           

網格搜尋完成後,可以使用 best_estimator_ 屬性來擷取最優的模型,使用 best_params_ 屬性來擷取最優的參數組合,使用 best_score_ 屬性來擷取最優的評分。

# 擷取最優的模型
best_log_reg = grid_search.best_estimator_

# 擷取最優的參數組合
best_log_reg_params = grid_search.best_params_

# 擷取最優的評分
best_log_reg_score = grid_search.best_score_

# 列印結果
print("The best model is: {}".format(best_log_reg))
print("The best parameters are: {}".format(best_log_reg_params))
print("The best score is: {:.2f}%".format(best_log_reg_score * 100))
           

預測結果

預測結果是使用訓練好的模型,對新的資料進行預測或者分類。scikit-learn 庫提供了 predict 方法來進行預測,它會傳回一個數組,表示每個樣本的預測類别。

使用 predict 方法來預測新資料的代碼如下:

# 建立一個新資料
new_data = [[5.0, 3.5, 1.5, 0.5]]

# 使用最優的模型進行預測
new_pred = best_log_reg.predict(new_data)

# 列印預測結果
print("The predicted class of the new data is: {}".format(new_pred))
           

總結

本文介紹了如何使用 scikit-learn 庫進行機器學習的模組化和評估。我們以鸢尾花資料集為例,使用邏輯回歸算法進行分類,并通過資料預處理、模型評估、模型優化等步驟來提高模型的效果。scikit-learn 庫是一個非常強大和易用的機器學習庫,它可以幫助我們快速地實作各種機器學習任務。如果你想學習更多關于 scikit-learn 庫的内容,可以參考官方文檔或者其他相關資料。

如何使用 scikit-learn 庫進行機器學習的模組化和評估

圖檔來源于網絡

繼續閱讀