ScikitLearn-モデリングプロセス

この章では、Sklearnに関連するモデリングプロセスについて説明します。同じことについて詳しく理解し、データセットの読み込みから始めましょう。

データセットの読み込み

データのコレクションはデータセットと呼ばれます。次の2つの要素があります-

Features−データの変数はその特徴と呼ばれます。これらは、予測子、入力、または属性とも呼ばれます。

  • Feature matrix −複数ある場合の機能のコレクションです。

  • Feature Names −これは機能のすべての名前のリストです。

Response−基本的に特徴変数に依存するのは出力変数です。これらは、ターゲット、ラベル、または出力とも呼ばれます。

  • Response Vector−応答列を表すために使用されます。通常、応答列は1つだけです。

  • Target Names −応答ベクトルがとる可能性のある値を表します。

Scikit-learnには次のようなデータセットの例がいくつかあります iris そして digits 分類と Boston house prices 回帰用。

以下はロードする例です 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]
]

データセットの分割

モデルの精度を確認するために、データセットを2つの部分に分割できます-a training set そして a testing set。トレーニングセットを使用してモデルをトレーニングし、テストセットを使用してモデルをテストします。その後、モデルのパフォーマンスを評価できます。

次の例では、データを70:30の比率に分割します。つまり、70%のデータをトレーニングデータとして使用し、30%をテストデータとして使用します。データセットは、上記の例のようにアイリスデータセットです。

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,)

上記の例に見られるように、 train_test_split()データセットを分割するscikit-learnの機能。この関数には次の引数があります-

  • X, y −ここで、 X それは feature matrix yは response vector、分割する必要があります。

  • test_size−これは、与えられたデータの合計に対するテストデータの比率を表します。上記の例のように、test_data = 0.3 Xの150行の場合。150*​​ 0.3 = 45行のテストデータが生成されます。

  • random_size−分割が常に同じになることを保証するために使用されます。これは、再現性のある結果が必要な状況で役立ちます。

モデルをトレーニングする

次に、データセットを使用して予測モデルをトレーニングできます。すでに説明したように、scikit-learnにはさまざまな種類がありますMachine Learning (ML) algorithms フィッティング、精度の予測、再現率などのための一貫したインターフェースを備えています。

以下の例では、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']

モデルの永続性

モデルをトレーニングしたら、モデルを将来使用するために永続化して、何度も再トレーニングする必要がないようにすることが望ましいです。それはの助けを借りて行うことができますdump そして load の特徴 joblib パッケージ。

上記のトレーニング済みモデル(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)

上記の例では、 threshold value = 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. ]
]

正規化

この前処理手法を使用して、特徴ベクトルを変更します。特徴ベクトルを共通のスケールで測定できるように、特徴ベクトルの正規化が必要です。正規化には次の2種類があります-

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 ]
]