Pythonを使用したAI–教師あり学習:分類
この章では、教師あり学習-分類の実装に焦点を当てます。
分類手法またはモデルは、観測値から何らかの結論を得ようとします。分類問題では、「黒」、「白」、「教育」、「非教育」などの分類された出力があります。分類モデルを構築する際、データポイントと対応するラベルを含むトレーニングデータセットが必要です。たとえば、画像が車の画像であるかどうかを確認したい場合です。これを確認するために、「車」と「車なし」に関連する2つのクラスを持つトレーニングデータセットを作成します。次に、トレーニングサンプルを使用してモデルをトレーニングする必要があります。分類モデルは、主に顔認識、スパム識別などで使用されます。
Pythonで分類子を作成する手順
Pythonで分類子を構築するには、Python3と機械学習のツールであるScikit-learnを使用します。次の手順に従って、Pythonで分類子を作成します-
ステップ1-Scikit-learnをインポートする
これは、Pythonで分類子を構築するための非常に最初のステップになります。このステップでは、Pythonで最高の機械学習モジュールの1つであるScikit-learnと呼ばれるPythonパッケージをインストールします。次のコマンドは、パッケージのインポートに役立ちます-
Import Sklearn
ステップ2-Scikit-learnのデータセットをインポートする
このステップでは、機械学習モデルのデータセットの操作を開始できます。ここでは、the 乳がんウィスコンシン診断データベース。データセットには、乳がん腫瘍に関するさまざまな情報と、malignant または benign。データセットには、569個の腫瘍に関する569個のインスタンスまたはデータがあり、腫瘍の半径、テクスチャ、滑らかさ、面積など、30個の属性または特徴に関する情報が含まれています。次のコマンドを使用して、Scikit-learnの乳がんデータセットをインポートできます-
from sklearn.datasets import load_breast_cancer
ここで、次のコマンドはデータセットをロードします。
data = load_breast_cancer()
以下は重要な辞書キーのリストです-
- 分類ラベル名(target_names)
- 実際のラベル(ターゲット)
- 属性/機能名(feature_names)
- 属性(データ)
これで、次のコマンドを使用して、重要な情報セットごとに新しい変数を作成し、データを割り当てることができます。つまり、次のコマンドでデータを整理できます。
label_names = data['target_names']
labels = data['target']
feature_names = data['feature_names']
features = data['data']
ここで、わかりやすくするために、次のコマンドを使用して、クラスラベル、最初のデータインスタンスのラベル、機能名、および機能の値を出力できます。
print(label_names)
上記のコマンドは、それぞれ悪性および良性のクラス名を出力します。以下の出力として表示されます-
['malignant' 'benign']
ここで、以下のコマンドは、それらがバイナリ値0および1にマップされていることを示します。ここで、0は悪性癌を表し、1は良性癌を表します。次の出力が表示されます-
print(labels[0])
0
以下に示す2つのコマンドは、機能名と機能値を生成します。
print(feature_names[0])
mean radius
print(features[0])
[ 1.79900000e+01 1.03800000e+01 1.22800000e+02 1.00100000e+03
1.18400000e-01 2.77600000e-01 3.00100000e-01 1.47100000e-01
2.41900000e-01 7.87100000e-02 1.09500000e+00 9.05300000e-01
8.58900000e+00 1.53400000e+02 6.39900000e-03 4.90400000e-02
5.37300000e-02 1.58700000e-02 3.00300000e-02 6.19300000e-03
2.53800000e+01 1.73300000e+01 1.84600000e+02 2.01900000e+03
1.62200000e-01 6.65600000e-01 7.11900000e-01 2.65400000e-01
4.60100000e-01 1.18900000e-01]
上記の出力から、最初のデータインスタンスは、半径が1.7990000e +01の悪性腫瘍であることがわかります。
ステップ3-データをセットに整理する
このステップでは、データをトレーニングセットとテストセットの2つの部分に分割します。見えないデータでモデルをテストする必要があるため、データをこれらのセットに分割することは非常に重要です。データをセットに分割するために、sklearnにはtrain_test_split()関数。次のコマンドを使用して、これらのセットのデータを分割できます-
from sklearn.model_selection import train_test_split
上記のコマンドは、 train_test_splitsklearnの関数と以下のコマンドは、データをトレーニングデータとテストデータに分割します。以下の例では、データの40%をテストに使用し、残りのデータをモデルのトレーニングに使用します。
train, test, train_labels, test_labels = train_test_split(features,labels,test_size = 0.40, random_state = 42)
ステップ4-モデルの構築
このステップでは、モデルを作成します。モデルの構築には、ナイーブベイズアルゴリズムを使用します。次のコマンドを使用してモデルを構築できます-
from sklearn.naive_bayes import GaussianNB
上記のコマンドはGaussianNBモジュールをインポートします。次のコマンドは、モデルを初期化するのに役立ちます。
gnb = GaussianNB()
gnb.fit()を使用してモデルをデータに適合させることにより、モデルをトレーニングします。
model = gnb.fit(train, train_labels)
ステップ5-モデルとその精度を評価する
このステップでは、テストデータを予測してモデルを評価します。次に、その精度も調べます。予測を行うには、predict()関数を使用します。次のコマンドは、これを行うのに役立ちます-
preds = gnb.predict(test)
print(preds)
[1 0 0 1 1 0 0 0 1 1 1 0 1 0 1 0 1 1 1 0 1 1 0 1 1 1 1 1 1
0 1 1 1 1 1 1 0 1 0 1 1 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 0
0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 1 1 1 1 1 1 0 1 1 0 0 0 0
0 1 1 1 1 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 0 1 1 0 1 1 0 0 0
1 1 1 0 0 1 1 0 1 0 0 1 1 0 0 0 1 1 1 0 1 1 0 0 1 0 1 1 0
1 0 0 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0
1 1 0 1 1 1 1 1 1 0 0 0 1 1 0 1 0 1 1 1 1 0 1 1 0 1 1 1 0
1 0 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1 0 0 1 1 0 1]
上記の一連の0と1は、悪性と良性の腫瘍クラスの予測値です。
さて、2つの配列を比較することによって test_labels そして preds、モデルの精度を確認できます。を使用しますaccuracy_score()精度を決定する関数。これについては、次のコマンドを検討してください-
from sklearn.metrics import accuracy_score
print(accuracy_score(test_labels,preds))
0.951754385965
結果は、単純ベイズ分類器が95.17%正確であることを示しています。
このようにして、上記の手順を使用して、Pythonで分類子を構築できます。
Pythonで分類子を構築する
このセクションでは、Pythonで分類子を作成する方法を学習します。
単純ベイズ分類器
ナイーブベイズは、ベイズの定理を使用して分類器を構築するために使用される分類手法です。予測子は独立していることが前提です。簡単に言うと、クラス内の特定の機能の存在は、他の機能の存在とは無関係であると想定しています。単純ベイズ分類器を構築するには、scikitlearnと呼ばれるPythonライブラリを使用する必要があります。名前の付いたナイーブベイズモデルには3つのタイプがありますGaussian, Multinomial and Bernoulli scikitlearnパッケージの下。
ナイーブベイズ機械学習分類器モデルを構築するには、次の&minusが必要です。
データセット
Breast Cancer Wisconsin DiagnosticDatabaseという名前のデータセットを使用します。データセットには、乳がん腫瘍に関するさまざまな情報と、malignant または benign。データセットには、569個の腫瘍に関する569個のインスタンスまたはデータがあり、腫瘍の半径、テクスチャ、滑らかさ、面積など、30個の属性または特徴に関する情報が含まれています。このデータセットはsklearnパッケージからインポートできます。
ナイーブベイズモデル
ナイーブベイズ分類器を構築するには、ナイーブベイズモデルが必要です。前に述べたように、名前が付けられたナイーブベイズモデルには3つのタイプがありますGaussian, Multinomial そして Bernoulliscikitlearnパッケージの下。ここで、次の例では、ガウスナイーブベイズモデルを使用します。
上記を使用して、腫瘍情報を使用して腫瘍が悪性か良性かを予測するナイーブベイズ機械学習モデルを構築します。
まず、sklearnモジュールをインストールする必要があります。次のコマンドを使用して実行できます-
Import Sklearn
次に、Breast Cancer Wisconsin DiagnosticDatabaseという名前のデータセットをインポートする必要があります。
from sklearn.datasets import load_breast_cancer
ここで、次のコマンドはデータセットをロードします。
data = load_breast_cancer()
データは次のように整理できます-
label_names = data['target_names']
labels = data['target']
feature_names = data['feature_names']
features = data['data']
ここで、わかりやすくするために、次のコマンドを使用して、クラスラベル、最初のデータインスタンスのラベル、機能名、および機能の値を出力できます。
print(label_names)
上記のコマンドは、それぞれ悪性および良性のクラス名を出力します。以下の出力として表示されます-
['malignant' 'benign']
ここで、以下のコマンドは、それらがバイナリ値0および1にマップされていることを示します。ここで、0は悪性癌を表し、1は良性癌を表します。以下の出力として表示されます-
print(labels[0])
0
次の2つのコマンドは、機能名と機能値を生成します。
print(feature_names[0])
mean radius
print(features[0])
[ 1.79900000e+01 1.03800000e+01 1.22800000e+02 1.00100000e+03
1.18400000e-01 2.77600000e-01 3.00100000e-01 1.47100000e-01
2.41900000e-01 7.87100000e-02 1.09500000e+00 9.05300000e-01
8.58900000e+00 1.53400000e+02 6.39900000e-03 4.90400000e-02
5.37300000e-02 1.58700000e-02 3.00300000e-02 6.19300000e-03
2.53800000e+01 1.73300000e+01 1.84600000e+02 2.01900000e+03
1.62200000e-01 6.65600000e-01 7.11900000e-01 2.65400000e-01
4.60100000e-01 1.18900000e-01]
上記の出力から、最初のデータインスタンスは、主半径が1.7990000e +01である悪性腫瘍であることがわかります。
見えないデータでモデルをテストするには、データをトレーニングデータとテストデータに分割する必要があります。それは次のコードの助けを借りて行うことができます-
from sklearn.model_selection import train_test_split
上記のコマンドは、 train_test_splitsklearnの関数と以下のコマンドは、データをトレーニングデータとテストデータに分割します。以下の例では、データの40%をテストに使用しており、リマイニングデータはモデルのトレーニングに使用されます。
train, test, train_labels, test_labels =
train_test_split(features,labels,test_size = 0.40, random_state = 42)
現在、次のコマンドを使用してモデルを構築しています-
from sklearn.naive_bayes import GaussianNB
上記のコマンドは、 GaussianNBモジュール。次に、以下のコマンドを使用して、モデルを初期化する必要があります。
gnb = GaussianNB()
を使用してモデルをデータに適合させてトレーニングします gnb.fit()。
model = gnb.fit(train, train_labels)
ここで、テストデータを予測してモデルを評価すると、次のように実行できます。
preds = gnb.predict(test)
print(preds)
[1 0 0 1 1 0 0 0 1 1 1 0 1 0 1 0 1 1 1 0 1 1 0 1 1 1 1 1 1
0 1 1 1 1 1 1 0 1 0 1 1 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 0
0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 1 1 1 1 1 1 0 1 1 0 0 0 0
0 1 1 1 1 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 0 1 1 0 1 1 0 0 0
1 1 1 0 0 1 1 0 1 0 0 1 1 0 0 0 1 1 1 0 1 1 0 0 1 0 1 1 0
1 0 0 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0
1 1 0 1 1 1 1 1 1 0 0 0 1 1 0 1 0 1 1 1 1 0 1 1 0 1 1 1 0
1 0 0 1 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1 0 0 1 1 0 1]
上記の一連の0と1は、腫瘍クラス、つまり悪性と良性の予測値です。
さて、2つの配列を比較することによって test_labels そして preds、モデルの精度を確認できます。を使用しますaccuracy_score()精度を決定する関数。次のコマンドを検討してください-
from sklearn.metrics import accuracy_score
print(accuracy_score(test_labels,preds))
0.951754385965
結果は、単純ベイズ分類器が95.17%正確であることを示しています。
これは、ナイーブベイズガウスモデルに基づく機械学習分類器でした。
サポートベクターマシン(SVM)
基本的に、サポートベクターマシン(SVM)は、回帰と分類の両方に使用できる教師あり機械学習アルゴリズムです。SVMの主な概念は、各データ項目をn次元空間の点としてプロットし、各特徴の値を特定の座標の値にすることです。ここで、nは私たちが持つであろう機能です。以下は、SVMの概念を理解するための簡単なグラフィック表現です。
上の図には、2つの機能があります。したがって、最初に、これら2つの変数を2次元空間にプロットする必要があります。各点には、サポートベクターと呼ばれる2つの座標があります。この行は、データを2つの異なる分類されたグループに分割します。この行が分類子になります。
ここでは、scikit-learnとirisデータセットを使用してSVM分類器を構築します。Scikitlearnライブラリにはsklearn.svmモジュールであり、分類用のsklearn.svm.svcを提供します。4つの特徴に基づいてアヤメ植物のクラスを予測するSVM分類器を以下に示します。
データセット
それぞれ50インスタンスの3つのクラスを含むアイリスデータセットを使用します。各クラスはアイリス植物のタイプを参照します。各インスタンスには、がく片の長さ、がく片の幅、花びらの長さ、花びらの幅の4つの機能があります。4つの特徴に基づいてアヤメ植物のクラスを予測するSVM分類器を以下に示します。
カーネル
これはSVMで使用される手法です。基本的に、これらは低次元の入力空間を取り、それを高次元の空間に変換する関数です。分離不可能な問題を分離可能な問題に変換します。カーネル関数は、線形、多項式、rbf、およびシグモイドのいずれかです。この例では、線形カーネルを使用します。
次のパッケージをインポートしましょう-
import pandas as pd
import numpy as np
from sklearn import svm, datasets
import matplotlib.pyplot as plt
ここで、入力データをロードします-
iris = datasets.load_iris()
最初の2つの機能を採用しています-
X = iris.data[:, :2]
y = iris.target
元のデータを使用してサポートベクターマシンの境界をプロットします。プロットするメッシュを作成しています。
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
h = (x_max / x_min)/100
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
np.arange(y_min, y_max, h))
X_plot = np.c_[xx.ravel(), yy.ravel()]
正則化パラメーターの値を指定する必要があります。
C = 1.0
SVM分類器オブジェクトを作成する必要があります。
Svc_classifier = svm_classifier.SVC(kernel='linear',
C=C, decision_function_shape = 'ovr').fit(X, y)
Z = svc_classifier.predict(X_plot)
Z = Z.reshape(xx.shape)
plt.figure(figsize = (15, 5))
plt.subplot(121)
plt.contourf(xx, yy, Z, cmap = plt.cm.tab10, alpha = 0.3)
plt.scatter(X[:, 0], X[:, 1], c = y, cmap = plt.cm.Set1)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.xlim(xx.min(), xx.max())
plt.title('SVC with linear kernel')
ロジスティック回帰
基本的に、ロジスティック回帰モデルは、教師あり分類アルゴリズムファミリーのメンバーの1つです。ロジスティック回帰は、ロジスティック関数を使用して確率を推定することにより、従属変数と独立変数の間の関係を測定します。
ここで、従属変数と独立変数について話す場合、従属変数は予測するターゲットクラス変数であり、反対側では、独立変数はターゲットクラスを予測するために使用する機能です。
ロジスティック回帰では、確率を推定することは、イベントの発生の可能性を予測することを意味します。たとえば、店のオーナーは、店に入った顧客が(たとえば)プレイステーションを購入するかどうかを予測したいと考えています。店主がプレイステーションを購入するかどうかなど、発生の可能性を予測するために観察する、顧客の多くの特徴(性別、年齢など)があります。ロジスティック関数は、さまざまなパラメーターを使用して関数を作成するために使用されるシグモイド曲線です。
前提条件
ロジスティック回帰を使用して分類器を構築する前に、システムにTkinterパッケージをインストールする必要があります。からインストールできますhttps://docs.python.org/2/library/tkinter.html。
ここで、以下のコードを使用して、ロジスティック回帰を使用して分類器を作成できます。
まず、いくつかのパッケージをインポートします-
import numpy as np
from sklearn import linear_model
import matplotlib.pyplot as plt
ここで、次のように実行できるサンプルデータを定義する必要があります。
X = np.array([[2, 4.8], [2.9, 4.7], [2.5, 5], [3.2, 5.5], [6, 5], [7.6, 4],
[3.2, 0.9], [2.9, 1.9],[2.4, 3.5], [0.5, 3.4], [1, 4], [0.9, 5.9]])
y = np.array([0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3])
次に、ロジスティック回帰分類器を作成する必要があります。これは次のように実行できます。
Classifier_LR = linear_model.LogisticRegression(solver = 'liblinear', C = 75)
最後になりましたが、この分類器をトレーニングする必要があります-
Classifier_LR.fit(X, y)
では、出力をどのように視覚化できるでしょうか。Logistic_visualize()-という名前の関数を作成することで実行できます。
Def Logistic_visualize(Classifier_LR, X, y):
min_x, max_x = X[:, 0].min() - 1.0, X[:, 0].max() + 1.0
min_y, max_y = X[:, 1].min() - 1.0, X[:, 1].max() + 1.0
上記の行では、メッシュグリッドで使用される最小値と最大値XとYを定義しました。さらに、メッシュグリッドをプロットするためのステップサイズを定義します。
mesh_step_size = 0.02
X値とY値のメッシュグリッドを次のように定義しましょう-
x_vals, y_vals = np.meshgrid(np.arange(min_x, max_x, mesh_step_size),
np.arange(min_y, max_y, mesh_step_size))
次のコードの助けを借りて、メッシュグリッド上で分類器を実行できます-
output = classifier.predict(np.c_[x_vals.ravel(), y_vals.ravel()])
output = output.reshape(x_vals.shape)
plt.figure()
plt.pcolormesh(x_vals, y_vals, output, cmap = plt.cm.gray)
plt.scatter(X[:, 0], X[:, 1], c = y, s = 75, edgecolors = 'black',
linewidth=1, cmap = plt.cm.Paired)
次のコード行は、プロットの境界を指定します
plt.xlim(x_vals.min(), x_vals.max())
plt.ylim(y_vals.min(), y_vals.max())
plt.xticks((np.arange(int(X[:, 0].min() - 1), int(X[:, 0].max() + 1), 1.0)))
plt.yticks((np.arange(int(X[:, 1].min() - 1), int(X[:, 1].max() + 1), 1.0)))
plt.show()
これで、コードを実行した後、次の出力が得られます。ロジスティック回帰分類子-
デシジョンツリー分類子
決定木は基本的に二分木フローチャートであり、各ノードはいくつかの特徴変数に従って観測値のグループを分割します。
ここでは、男性または女性を予測するための決定木分類器を構築しています。19個のサンプルを持つ非常に小さなデータセットを取得します。これらのサンプルは、「高さ」と「髪の長さ」の2つの機能で構成されます。
前提条件
次の分類器を構築するには、インストールする必要があります pydotplus そして graphviz。基本的に、graphvizはドットファイルを使用してグラフィックを描画するためのツールであり、pydotplusGraphvizのDot言語のモジュールです。パッケージマネージャーまたはpipを使用してインストールできます。
これで、次のPythonコードを使用して決定木分類器を構築できます-
まず、次のようにいくつかの重要なライブラリをインポートしましょう-
import pydotplus
from sklearn import tree
from sklearn.datasets import load_iris
from sklearn.metrics import classification_report
from sklearn import cross_validation
import collections
ここで、次のようにデータセットを提供する必要があります-
X = [[165,19],[175,32],[136,35],[174,65],[141,28],[176,15],[131,32],
[166,6],[128,32],[179,10],[136,34],[186,2],[126,25],[176,28],[112,38],
[169,9],[171,36],[116,25],[196,25]]
Y = ['Man','Woman','Woman','Man','Woman','Man','Woman','Man','Woman',
'Man','Woman','Man','Woman','Woman','Woman','Man','Woman','Woman','Man']
data_feature_names = ['height','length of hair']
X_train, X_test, Y_train, Y_test = cross_validation.train_test_split
(X, Y, test_size=0.40, random_state=5)
データセットを提供した後、次のように実行できるモデルを適合させる必要があります-
clf = tree.DecisionTreeClassifier()
clf = clf.fit(X,Y)
予測は、次のPythonコードを使用して行うことができます-
prediction = clf.predict([[133,37]])
print(prediction)
次のPythonコードを使用して、決定木を視覚化できます。
dot_data = tree.export_graphviz(clf,feature_names = data_feature_names,
out_file = None,filled = True,rounded = True)
graph = pydotplus.graph_from_dot_data(dot_data)
colors = ('orange', 'yellow')
edges = collections.defaultdict(list)
for edge in graph.get_edge_list():
edges[edge.get_source()].append(int(edge.get_destination()))
for edge in edges: edges[edge].sort()
for i in range(2):dest = graph.get_node(str(edges[edge][i]))[0]
dest.set_fillcolor(colors[i])
graph.write_png('Decisiontree16.png')
上記のコードの予測は次のようになります。 [‘Woman’] 次の決定木を作成します-
予測の特徴の値を変更してテストすることができます。
ランダムフォレスト分類子
アンサンブルメソッドは、機械学習モデルをより強力な機械学習モデルに結合するメソッドであることを私たちは知っています。決定木のコレクションであるランダムフォレストはその1つです。予測力を保持しながら、結果を平均化することで過剰適合を減らすことができるため、単一の決定木よりも優れています。ここでは、scikitlearn癌データセットにランダムフォレストモデルを実装します。
必要なパッケージをインポートする-
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
import matplotlib.pyplot as plt
import numpy as np
ここで、次のように実行できるデータセットを提供する必要があります&minus
cancer = load_breast_cancer()
X_train, X_test, y_train,
y_test = train_test_split(cancer.data, cancer.target, random_state = 0)
データセットを提供した後、次のように実行できるモデルを適合させる必要があります-
forest = RandomForestClassifier(n_estimators = 50, random_state = 0)
forest.fit(X_train,y_train)
ここで、サブセットのテストだけでなくトレーニングの精度も取得します。推定量の数を増やすと、サブセットのテストの精度も向上します。
print('Accuracy on the training subset:(:.3f)',format(forest.score(X_train,y_train)))
print('Accuracy on the training subset:(:.3f)',format(forest.score(X_test,y_test)))
出力
Accuracy on the training subset:(:.3f) 1.0
Accuracy on the training subset:(:.3f) 0.965034965034965
さて、決定木のように、ランダムフォレストには feature_importance決定木よりも特徴の重みのより良いビューを提供するモジュール。次のようにプロットして視覚化できます-
n_features = cancer.data.shape[1]
plt.barh(range(n_features),forest.feature_importances_, align='center')
plt.yticks(np.arange(n_features),cancer.feature_names)
plt.xlabel('Feature Importance')
plt.ylabel('Feature')
plt.show()
分類器のパフォーマンス
機械学習アルゴリズムを実装した後、モデルがどれほど効果的であるかを調べる必要があります。有効性を測定するための基準は、データセットとメトリックに基づく場合があります。さまざまな機械学習アルゴリズムを評価するために、さまざまなパフォーマンス指標を使用できます。たとえば、分類子を使用して異なるオブジェクトの画像を区別する場合、平均精度、AUCなどの分類パフォーマンスメトリックを使用できます。ある意味で、機械学習モデルを評価するために選択するメトリックは次のとおりです。指標の選択は、機械学習アルゴリズムのパフォーマンスの測定方法と比較方法に影響を与えるため、非常に重要です。以下はいくつかの指標です-
混同行列
基本的に、出力が2つ以上のタイプのクラスである可能性がある分類問題に使用されます。これは、分類器のパフォーマンスを測定する最も簡単な方法です。混同行列は、基本的に「実際」と「予測」の2つの次元を持つテーブルです。どちらのディメンションにも、「真のポジティブ(TP)」、「真のネガティブ(TN)」、「偽のポジティブ(FP)」、「偽のネガティブ(FN)」があります。
上記の混同行列では、1は正のクラスを表し、0は負のクラスを表します。
以下は、混同行列に関連する用語です-
True Positives − TPは、データポイントの実際のクラスが1で、予測値も1の場合です。
True Negatives − TNは、データポイントの実際のクラスが0で、予測値も0の場合です。
False Positives − FPは、データポイントの実際のクラスが0で、予測値も1の場合です。
False Negatives − FNは、データポイントの実際のクラスが1で、予測値も0の場合です。
正確さ
混同行列自体はパフォーマンス指標そのものではありませんが、ほとんどすべてのパフォーマンスマトリックスは混同行列に基づいています。それらの1つは精度です。分類問題では、これは、行われたすべての種類の予測に対してモデルによって行われた正しい予測の数として定義できます。精度の計算式は次のとおりです。
$$精度= \ frac {TP + TN} {TP + FP + FN + TN} $$
精度
これは主にドキュメントの取得に使用されます。これは、返されたドキュメントの何個が正しいかとして定義できます。以下は、精度を計算するための式です-
$$精度= \ frac {TP} {TP + FP} $$
再現率または感度
これは、モデルが返すポジティブの数として定義できます。以下は、モデルの想起/感度を計算するための式です-
$$リコール= \ frac {TP} {TP + FN} $$
特異性
これは、モデルが返すネガの数として定義できます。リコールとは正反対です。以下は、モデルの特異性を計算するための式です。
$$特異性= \ frac {TN} {TN + FP} $$
クラスの不均衡の問題
クラスの不均衡は、1つのクラスに属する観測値の数が他のクラスに属する観測値よりも大幅に少ないシナリオです。たとえば、この問題は、希少疾患、銀行での不正取引などを特定する必要があるシナリオで顕著です。
不均衡なクラスの例
不均衡なクラスの概念を理解するために、不正検出データセットの例を考えてみましょう-
Total observations = 5000
Fraudulent Observations = 50
Non-Fraudulent Observations = 4950
Event Rate = 1%
解決
Balancing the classes’不均衡なクラスの解決策として機能します。クラスのバランスをとる主な目的は、少数派クラスの頻度を増やすか、多数派クラスの頻度を減らすことです。以下は、不均衡クラスの問題を解決するためのアプローチです。
リサンプリング
リサンプリングは、サンプルデータセット(トレーニングセットとテストセットの両方)を再構築するために使用される一連の方法です。モデルの精度を向上させるために、リサンプリングが行われます。以下は、いくつかのリサンプリング手法です-
Random Under-Sampling−この手法は、多数派クラスの例をランダムに排除することにより、クラス分布のバランスを取ることを目的としています。これは、多数派と少数派のクラスインスタンスのバランスがとれるまで行われます。
Total observations = 5000
Fraudulent Observations = 50
Non-Fraudulent Observations = 4950
Event Rate = 1%
この場合、不正でないインスタンスから置き換えずに10%のサンプルを取得し、それらを不正なインスタンスと組み合わせます-
サンプリング中のランダム後の不正でない観測= 4950の10%= 495
それらを不正な観測と組み合わせた後の合計観測= 50 + 495 = 545
したがって、現在、サンプリング不足後の新しいデータセットのイベント率= 9%
この手法の主な利点は、実行時間を短縮し、ストレージを改善できることです。しかし一方で、トレーニングデータサンプルの数を減らしながら、有用な情報を破棄することができます。
Random Over-Sampling −この手法は、少数派クラスのインスタンスを複製して数を増やすことにより、クラス分布のバランスを取ることを目的としています。
Total observations = 5000
Fraudulent Observations = 50
Non-Fraudulent Observations = 4950
Event Rate = 1%
50個の不正な観測値を30回複製する場合、少数派クラスの観測値を複製した後の不正な観測値は1500になります。また、オーバーサンプリング後の新しいデータの合計観測値は4950 + 1500 = 6450になります。したがって、新しいデータセットのイベント率1500/6450 = 23%になります。
この方法の主な利点は、有用な情報が失われないことです。ただし、その一方で、少数派クラスのイベントを複製するため、過剰適合の可能性が高くなります。
アンサンブルテクニック
この方法論は基本的に、既存の分類アルゴリズムを変更して、不均衡なデータセットに適したものにするために使用されます。このアプローチでは、元のデータからいくつかの2段階分類器を構築し、それらの予測を集計します。ランダムフォレスト分類器は、アンサンブルベースの分類器の例です。