
- Scikit Learn教程
- Scikit Learn - 首頁
- Scikit Learn - 簡介
- Scikit Learn建模流程
- Scikit Learn - 資料表示
- Scikit Learn - 估計器API
- Scikit Learn - 約定
- Scikit Learn - 線性模型
- Scikit Learn - 擴充套件線性模型
- 隨機梯度下降
- Scikit Learn - 支援向量機
- Scikit Learn - 異常檢測
- Scikit Learn - K近鄰演算法
- Scikit Learn - KNN學習
- 樸素貝葉斯分類
- Scikit Learn - 決策樹
- 隨機決策樹
- Scikit Learn - 整合方法
- Scikit Learn - 聚類方法
- 聚類效能評估
- 使用PCA進行降維
- Scikit Learn有用資源
- Scikit Learn - 快速指南
- Scikit Learn - 有用資源
- Scikit Learn - 討論
Scikit Learn建模流程
本章介紹Sklearn中涉及的建模過程。讓我們詳細瞭解一下,並從資料集載入開始。
資料集載入
資料的集合稱為資料集。它包含以下兩個組成部分:
特徵 - 資料的變數稱為其特徵。它們也稱為預測變數、輸入或屬性。
特徵矩陣 - 如果有多個特徵,則它是特徵的集合。
特徵名稱 - 它是所有特徵名稱的列表。
響應 - 它是輸出變數,基本上取決於特徵變數。它們也稱為目標、標籤或輸出。
響應向量 - 用於表示響應列。通常,我們只有一個響應列。
目標名稱 - 它表示響應向量可能取的值。
Scikit-learn有一些示例資料集,例如用於分類的iris和digits,以及用於迴歸的波士頓房價。
示例
以下是如何載入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包的dump和load功能來完成。
考慮下面的示例,我們將儲存上面訓練的模型(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 ] ]