Scikit Learn建模流程



本章介紹Sklearn中涉及的建模過程。讓我們詳細瞭解一下,並從資料集載入開始。

資料集載入

資料的集合稱為資料集。它包含以下兩個組成部分:

特徵 - 資料的變數稱為其特徵。它們也稱為預測變數、輸入或屬性。

  • 特徵矩陣 - 如果有多個特徵,則它是特徵的集合。

  • 特徵名稱 - 它是所有特徵名稱的列表。

響應 - 它是輸出變數,基本上取決於特徵變數。它們也稱為目標、標籤或輸出。

  • 響應向量 - 用於表示響應列。通常,我們只有一個響應列。

  • 目標名稱 - 它表示響應向量可能取的值。

Scikit-learn有一些示例資料集,例如用於分類的irisdigits,以及用於迴歸的波士頓房價

示例

以下是如何載入iris資料集的示例:

from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
y = iris.target
feature_names = iris.feature_names
target_names = iris.target_names
print("Feature names:", feature_names)
print("Target names:", target_names)
print("\nFirst 10 rows of X:\n", X[:10])

輸出

Feature names: ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
Target names: ['setosa' 'versicolor' 'virginica']
First 10 rows of X:
[
   [5.1 3.5 1.4 0.2]
   [4.9 3. 1.4 0.2]
   [4.7 3.2 1.3 0.2]
   [4.6 3.1 1.5 0.2]
   [5. 3.6 1.4 0.2]
   [5.4 3.9 1.7 0.4]
   [4.6 3.4 1.4 0.3]
   [5. 3.4 1.5 0.2]
   [4.4 2.9 1.4 0.2]
   [4.9 3.1 1.5 0.1]
]

分割資料集

為了檢查模型的準確性,我們可以將資料集分成兩部分:訓練集測試集。使用訓練集訓練模型,使用測試集測試模型。之後,我們可以評估模型的效能。

示例

下面的示例將資料按70:30的比例分割,即70%的資料將用作訓練資料,30%的資料將用作測試資料。資料集與上面的示例一樣是iris資料集。

from sklearn.datasets import load_iris
iris = load_iris()

X = iris.data
y = iris.target

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(
   X, y, test_size = 0.3, random_state = 1
)

print(X_train.shape)
print(X_test.shape)

print(y_train.shape)
print(y_test.shape)

輸出

(105, 4)
(45, 4)
(105,)
(45,)

如上例所示,它使用scikit-learn的train_test_split()函式分割資料集。此函式具有以下引數:

  • X, y - 這裡,X特徵矩陣,y是響應向量,需要分割。

  • test_size - 這表示測試資料與給定總資料的比率。在上例中,我們為X的150行設定了test_data = 0.3。它將生成150*0.3 = 45行的測試資料。

  • random_state - 用於保證分割始終相同。這在需要可重複結果的情況下非常有用。

訓練模型

接下來,我們可以使用資料集來訓練一些預測模型。如前所述,scikit-learn具有廣泛的機器學習 (ML) 演算法,這些演算法具有用於擬合、預測準確性、召回率等的統一介面。

示例

在下面的示例中,我們將使用KNN(K近鄰)分類器。不必深入瞭解KNN演算法的細節,因為會有單獨的章節介紹它。此示例用於讓您瞭解實現部分。

from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
y = iris.target
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
   X, y, test_size = 0.4, random_state=1
)
from sklearn.neighbors import KNeighborsClassifier
from sklearn import metrics
classifier_knn = KNeighborsClassifier(n_neighbors = 3)
classifier_knn.fit(X_train, y_train)
y_pred = classifier_knn.predict(X_test)
# Finding accuracy by comparing actual response values(y_test)with predicted response value(y_pred)
print("Accuracy:", metrics.accuracy_score(y_test, y_pred))
# Providing sample data and the model will make prediction out of that data

sample = [[5, 5, 3, 2], [2, 4, 3, 5]]
preds = classifier_knn.predict(sample)
pred_species = [iris.target_names[p] for p in preds] print("Predictions:", pred_species)

輸出

Accuracy: 0.9833333333333333
Predictions: ['versicolor', 'virginica']

模型持久化

訓練模型後,最好將模型持久化以備將來使用,這樣就不需要反覆重新訓練。這可以使用joblib包的dumpload功能來完成。

考慮下面的示例,我們將儲存上面訓練的模型(classifier_knn)以備將來使用:

from sklearn.externals import joblib
joblib.dump(classifier_knn, 'iris_classifier_knn.joblib')

以上程式碼會將模型儲存到名為iris_classifier_knn.joblib的檔案中。現在,可以使用以下程式碼從檔案中重新載入該物件:

joblib.load('iris_classifier_knn.joblib')

資料預處理

由於我們處理的是大量原始資料,在將資料輸入機器學習演算法之前,我們需要將其轉換為有意義的資料。此過程稱為資料預處理。Scikit-learn為此目的提供了名為preprocessing的包。preprocessing包具有以下技術:

二值化

當我們需要將數值轉換為布林值時,使用此預處理技術。

示例

import numpy as np
from sklearn import preprocessing
Input_data = np.array(
   [2.1, -1.9, 5.5],
   [-1.5, 2.4, 3.5],
   [0.5, -7.9, 5.6],
   [5.9, 2.3, -5.8]]
)
data_binarized = preprocessing.Binarizer(threshold=0.5).transform(input_data)
print("\nBinarized data:\n", data_binarized)

在上例中,我們使用的閾值 = 0.5,因此,所有大於0.5的值將轉換為1,所有小於0.5的值將轉換為0。

輸出

Binarized data:
[
   [ 1. 0. 1.]
   [ 0. 1. 1.]
   [ 0. 0. 1.]
   [ 1. 1. 0.]
]

均值移除

此技術用於從特徵向量中消除均值,以便每個特徵都以零為中心。

示例

import numpy as np
from sklearn import preprocessing
Input_data = np.array(
   [2.1, -1.9, 5.5],
   [-1.5, 2.4, 3.5],
   [0.5, -7.9, 5.6],
   [5.9, 2.3, -5.8]]
)

#displaying the mean and the standard deviation of the input data
print("Mean =", input_data.mean(axis=0))
print("Stddeviation = ", input_data.std(axis=0))
#Removing the mean and the standard deviation of the input data

data_scaled = preprocessing.scale(input_data)
print("Mean_removed =", data_scaled.mean(axis=0))
print("Stddeviation_removed =", data_scaled.std(axis=0))

輸出

Mean = [ 1.75 -1.275 2.2 ]
Stddeviation = [ 2.71431391 4.20022321 4.69414529]
Mean_removed = [ 1.11022302e-16 0.00000000e+00 0.00000000e+00]
Stddeviation_removed = [ 1. 1. 1.]

縮放

我們使用此預處理技術來縮放特徵向量。特徵向量的縮放很重要,因為特徵不應該人為地過大或過小。

示例

import numpy as np
from sklearn import preprocessing
Input_data = np.array(
   [
      [2.1, -1.9, 5.5],
      [-1.5, 2.4, 3.5],
      [0.5, -7.9, 5.6],
      [5.9, 2.3, -5.8]
   ]
)
data_scaler_minmax = preprocessing.MinMaxScaler(feature_range=(0,1))
data_scaled_minmax = data_scaler_minmax.fit_transform(input_data)
print ("\nMin max scaled data:\n", data_scaled_minmax)

輸出

Min max scaled data:
[
   [ 0.48648649 0.58252427 0.99122807]
   [ 0. 1. 0.81578947]
   [ 0.27027027 0. 1. ]
   [ 1. 0.99029126 0. ]
]

標準化

我們使用此預處理技術來修改特徵向量。特徵向量的標準化是必要的,以便可以以共同的尺度測量特徵向量。標準化有以下兩種型別:

L1標準化

也稱為最小絕對偏差。它以這樣的方式修改值,使得每一行的絕對值之和始終保持為1。以下示例顯示了在輸入資料上實現L1標準化的示例。

示例

import numpy as np
from sklearn import preprocessing
Input_data = np.array(
   [
      [2.1, -1.9, 5.5],
      [-1.5, 2.4, 3.5],
      [0.5, -7.9, 5.6],
      [5.9, 2.3, -5.8]
   ]
)
data_normalized_l1 = preprocessing.normalize(input_data, norm='l1')
print("\nL1 normalized data:\n", data_normalized_l1)

輸出

L1 normalized data:
[
   [ 0.22105263 -0.2 0.57894737]
   [-0.2027027 0.32432432 0.47297297]
   [ 0.03571429 -0.56428571 0.4 ]
   [ 0.42142857 0.16428571 -0.41428571]
]

L2標準化

也稱為最小二乘法。它以這樣的方式修改值,使得每一行的平方和始終保持為1。以下示例顯示了在輸入資料上實現L2標準化的示例。

示例

import numpy as np
from sklearn import preprocessing
Input_data = np.array(
   [
      [2.1, -1.9, 5.5],
      [-1.5, 2.4, 3.5],
      [0.5, -7.9, 5.6],
      [5.9, 2.3, -5.8]
   ]
)
data_normalized_l2 = preprocessing.normalize(input_data, norm='l2')
print("\nL1 normalized data:\n", data_normalized_l2)

輸出

L2 normalized data:
[
   [ 0.33946114 -0.30713151 0.88906489]
   [-0.33325106 0.53320169 0.7775858 ]
   [ 0.05156558 -0.81473612 0.57753446]
   [ 0.68706914 0.26784051 -0.6754239 ]
]
廣告