Scikit Learn 简明教程
Scikit Learn - Modelling Process
本章介绍 Sklearn 中涉及的建模流程。让我们详细了解一下并从加载数据集开始。
Dataset Loading
一个数据集合称为数据集。它具有以下两个组成部分:
Features - 数据变量称为其特征。它们也称为预测变量、输入或属性。
-
Feature matrix - 如果有多个特征,则称为特征集合。
-
Feature Names - 它是所有特征名称的列表。
Response - 它是输出变量,基本上取决于特征变量。它们也称为目标、标签或输出。
-
Response Vector - 用它来表示响应列。通常,我们只有一个响应列。
-
Target Names - 它表示响应向量可能取的值。
Scikit-learn 有几个示例数据集,如 iris 和 digits 用于分类, Boston house prices 用于回归。
Example
以下是一个加载 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])
Output
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]
]
Splitting the dataset
要检查我们模型的准确性,我们可以将数据集分成两部分- a training set 和 a testing set 。使用训练集训练模型,使用测试集测试模型。然后,我们可以评估我们的模型表现如何。
Example
以下示例将以 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)
Output
(105, 4)
(45, 4)
(105,)
(45,)
如上例所示,它使用 scikit-learn 的 train_test_split() 函数来分割数据集。该函数具有以下参数:
-
X, y - 在这里, X 是 feature matrix ,y 是 response vector ,需要分割。
-
test_size - 它表示测试数据与给定总数据的比率。正如在上面的示例中,我们在 X 的 150 行中设置 test_data = 0.3 。它会产生 150*0.3 = 45 行的测试数据。
-
random_size - 用它来确保分割始终相同。这在需要可重复结果的情况下很有用。
Train the Model
接下来,我们可以使用我们的数据集来训练一些预测模型。正如所讨论的,scikit-learn 具有各种 Machine Learning (ML) algorithms ,它们具有用于拟合、预测准确率、召回率等的统一接口。
Example
在下面的示例中,我们将使用 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)
Model Persistence
一旦你训练了模型,那么最好让该模型持久化以便于将来使用,这样我们就无需一遍遍地重新训练它。这可以通过 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')
Preprocessing the Data
由于我们正在处理大量数据,并且该数据处于原始形式,因此在将该数据输入机器学习算法之前,我们需要将其转换为有意义的数据。这个过程称为数据预处理。Scikit-learn 为此目的有一个名为 preprocessing 的包。 preprocessing 包具有以下技术:
Binarisation
当我们需要将数值转换为布尔值时,使用此预处理技术。
Example
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)
在上述示例中,我们使用了 threshold value = 0.5 这就是为什么所有高于 0.5 的值都将转换为 1,所有低于 0.5 的值都将转换为 0。
Mean Removal
此技术用于从特征向量中消除平均值,以便每个特征都以零为中心。
Example
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))
Scaling
我们使用此预处理技术来缩放特征向量。特征向量的缩放很重要,因为特征不应人为地过大或过小。
Example
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)
Normalisation
我们使用此预处理技术来修改特征向量。需要对特征向量进行归一化,以便可以按照常见比例测量特征向量。有两种归一化类型,如下所示:
Example
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)
Output
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]
]