Artificial-intelligence-with-python-supervised-learning-classification

提供:Dev Guides
移動先:案内検索

PythonとAI –教師あり学習:分類

この章では、教師あり学習-分類の実装に焦点を当てます。

分類手法またはモデルは、観測値から何らかの結論を得ようとします。 分類の問題では、「黒」または「白」または「教示」および「非教示」などの分類された出力があります。 分類モデルの構築中に、データポイントと対応するラベルを含むトレーニングデータセットが必要です。 たとえば、画像が車のものかどうかを確認したい場合。 これを確認するために、「車」と「車なし」に関連する2つのクラスを持つトレーニングデータセットを構築します。 次に、トレーニングサンプルを使用してモデルをトレーニングする必要があります。 分類モデルは、主に顔認識、スパム識別などで使用されます。

Pythonで分類子を構築する手順

Pythonで分類子を構築するために、Python 3と機械学習用のツールであるScikit-learnを使用します。 Pythonで分類子を構築するには、次の手順に従います-

ステップ1-Scikit-learnのインポート

これは、Pythonで分類子を作成するための非常に最初のステップです。 このステップでは、Scikit-learnというPythonパッケージをインストールします。これは、Pythonで最高の機械学習モジュールの1つです。 次のコマンドは、パッケージをインポートするのに役立ちます-

Import Sklearn

ステップ2-Scikit-learnのデータセットをインポートする

このステップでは、機械学習モデルのデータセットの使用を開始できます。 ここでは、 the http://scikit-learn.org/stable/datasets/indexl#breast-cancer-wisconsin-diagnostic-database [乳がんウィスコンシン診断データベース]を使用します。データセットには、乳房に関するさまざまな情報が含まれていますがん腫瘍、および*悪性*または*良性*の分類ラベル。 データセットには、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

上記のコマンドはsklearnから train_test_split 関数をインポートし、以下のコマンドはデータをトレーニングデータとテストデータに分割します。 以下の例では、データの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_labelspreds を比較することにより、モデルの精度を確認できます。 * accuracy_score()*関数を使用して精度を判断します。 これのために次のコマンドを検討してください-

from sklearn.metrics import accuracy_score
print(accuracy_score(test_labels,preds))
0.951754385965

結果は、NaïveBayes分類器の精度が95.17%であることを示しています。

このようにして、上記の手順を使用して、Pythonで分類子を作成できます。

Pythonでの分類子の構築

このセクションでは、Pythonで分類子を作成する方法を学習します。

単純ベイズ分類器

ナイーブベイズは、ベイズの定理を使用して分類器を構築するために使用される分類手法です。 前提は、予測子が独立していることです。 簡単に言えば、クラス内の特定の機能の存在は、他の機能の存在とは無関係であると想定しています。 NaïveBayes分類器を構築するには、scikit learnと呼ばれるpythonライブラリを使用する必要があります。 scikit学習パッケージには、 Gaussian、Multinomial、およびBernoulli という名前の3つのタイプのナイーブベイズモデルがあります。

NaïveBayes機械学習分類子モデルを構築するには、次の&minusが必要です

データセット

http://scikit-learn.org/stable/datasets/indexl#breast-cancer-wisconsin-diagnostic-database [乳がんウィスコンシン診断データベース]という名前のデータセットを使用します。このデータセットには、乳がん腫瘍に関するさまざまな情報が含まれています、*悪性*または*良性*の分類ラベル。 データセットには、569の腫瘍に関する569のインスタンス、またはデータがあり、30の属性、または腫瘍の半径、テクスチャ、滑らかさ、面積などの特徴に関する情報が含まれています。 このデータセットをsklearnパッケージからインポートできます。

ナイーブベイズモデル

単純ベイズ分類器を構築するには、単純ベイズモデルが必要です。 前述したように、scikit学習パッケージには、 Gaussian、Multinomial 、および Bernoulli という3つのタイプの単純ベイズモデルがあります。 ここで、次の例では、GaussianNaïveBayesモデルを使用します。

上記を使用して、ナイーブベイズ機械学習モデルを構築し、腫瘍情報を使用して、腫瘍が悪性か良性かを予測します。

まず、sklearnモジュールをインストールする必要があります。 それは、次のコマンドの助けを借りて行うことができます-

Import Sklearn

次に、Breast Cancer Wisconsin Diagnostic Databaseという名前のデータセットをインポートする必要があります。

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

上記のコマンドはsklearnから train_test_split 関数をインポートし、以下のコマンドはデータをトレーニングデータとテストデータに分割します。 次の例では、テストにデータの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_labelspreds を比較することにより、モデルの精度を確認できます。 * accuracy_score()*関数を使用して精度を判断します。 次のコマンドを検討してください-

from sklearn.metrics import accuracy_score
print(accuracy_score(test_labels,preds))
0.951754385965

結果は、NaïveBayes分類器の精度が95.17%であることを示しています。

これは、単純ベイズガウスモデルに基づく機械学習分類器でした。

サポートベクターマシン(SVM)

基本的に、サポートベクターマシン(SVM)は、回帰と分類の両方に使用できる教師あり機械学習アルゴリズムです。 SVMの主な概念は、各データ項目をn次元空間のポイントとしてプロットすることです。各フィーチャの値は特定の座標の値です。 ここで、nは私たちが持っている機能です。 以下は、SVMの概念を理解するためのシンプルなグラフィカル表現です-

サポートベクターマシン2

上の図では、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')

ライナーカーネル付きのsvc

ロジスティック回帰

基本的に、ロジスティック回帰モデルは、教師付き分類アルゴリズムファミリのメンバーの1つです。 ロジスティック回帰は、ロジスティック関数を使用して確率を推定することにより、従属変数と独立変数の間の関係を測定します。

ここで、従属変数と独立変数について話す場合、従属変数は予測するターゲットクラス変数であり、一方、独立変数はターゲットクラスを予測するために使用する機能です。

ロジスティック回帰では、確率の推定とは、イベントの発生の可能性を予測することを意味します。 たとえば、店のオーナーは、店に入った顧客が(たとえば)プレイステーションを購入するかどうかを予測したいと考えています。 性別、年齢など、顧客には多くの特徴があります。 ショップキーパーは、発生の可能性を予測するために観察します。つまり、プレイステーションを購入するかどうかです。 ロジスティック関数は、さまざまなパラメーターで関数を作成するために使用されるシグモイド曲線です。

前提条件

ロジスティック回帰を使用して分類子を構築する前に、システムにTkinterパッケージをインストールする必要があります。 [[1]]

さて、以下に示すコードの助けを借りて、ロジスティック回帰を使用して分類子を作成できます-

最初に、いくつかのパッケージをインポートします-

import numpy as np
from sklearn import linear_model
import matplotlib.pyplot as plt

今、私たちは次のように行うことができるサンプルデータを定義する必要があります-

X = np.array([[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はドットファイルを使用してグラフィックを描画するためのツールであり、 pydotplus はGraphvizの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 = [[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([[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’] として与え、次の決定木を作成します−

deision_tree

予測の特徴の値を変更してテストできます。

ランダムフォレスト分類器

アンサンブルメソッドは、機械学習モデルをより強力な機械学習モデルに結合するメソッドであることがわかっています。 決定木の集合であるランダムフォレストはその1つです。 予測力を保持しながら、結果を平均化することで過剰適合を減らすことができるため、単一の決定木よりも優れています。 ここでは、Scikit Learnがんデータセットにランダムフォレストモデルを実装します。

必要なパッケージをインポートします-

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つの次元、つまり「実際」と「予測」のテーブルです。 両方のディメンションには、「True Positives(TP)」、「True Negatives(TN)」、「False Positives(FP)」、「False Negatives(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}

精度

主にドキュメントの取得に使用されます。 これは、返されたドキュメントの数として正しいと定義できます。 以下は、精度を計算するための式です-

Precision = \ frac \ {TP} \ {TP + FP}

リコールまたは感度

モデルが返す正の数として定義できます。 以下は、モデルのリコール/感度を計算するための式です-

Recall = \ frac \ {TP} \ {TP + FN}

特異度

モデルが返すネガの数として定義できます。 リコールとは正反対です。 以下は、モデルの特異性を計算するための式です-

Specificity = \ frac \ {TN} \ {TN + FP}

クラス不均衡問題

クラスの不均衡は、あるクラスに属する観測値の数が他のクラスに属する観測値の数よりも著しく少ないシナリオです。 たとえば、この問題は、まれな病気、銀行での不正取引などを特定する必要があるシナリオで顕著です。

不均衡なクラスの例

不均衡なクラスの概念を理解するために、不正検出データセットの例を考えてみましょう-

Total observations = 5000
Fraudulent Observations = 50
Non-Fraudulent Observations = 4950
Event Rate = 1%

溶液

  • クラスのバランスをとる*は、不均衡なクラスの解決策として機能します。 クラスのバランスを取る主な目的は、マイノリティクラスの頻度を増やすか、マジョリティクラスの頻度を減らすことです。 以下は、不均衡クラスの問題を解決するためのアプローチです-

再サンプリング

再サンプリングは、トレーニングデータセットとテストデータセットの両方で、サンプルデータセットを再構築するために使用される一連の方法です。 モデルの精度を向上させるために、再サンプリングが行われます。 以下は、いくつかの再サンプリング手法です-

  • ランダムアンダーサンプリング-この手法は、多数のクラスの例をランダムに排除することにより、クラス分布のバランスを取ることを目的としています。 これは、多数派と少数派のインスタンスが均衡するまで行われます。
Total observations = 5000
Fraudulent Observations = 50
Non-Fraudulent Observations = 4950
Event Rate = 1%

この場合、非詐欺インスタンスからの置換なしで10%のサンプルを取得し、それらを詐欺インスタンスと結合します-

サンプリング時の無作為抽出後の不正でない観測= 4950の10%= 495

不正な観測と組み合わせた後の合計観測= 50 + 495 = 545

したがって、現在、アンダーサンプリング後の新しいデータセットのイベント率= 9%

この手法の主な利点は、実行時間を短縮し、ストレージを改善できることです。 ただし、反対側では、トレーニングデータサンプルの数を減らしながら有用な情報を破棄できます。

  • ランダムオーバーサンプリング-この手法は、少数クラスのインスタンスを複製することでインスタンスの数を増やすことで、クラスの分散のバランスを取ることを目的としています。
Total observations = 5000
Fraudulent Observations = 50
Non-Fraudulent Observations = 4950
Event Rate = 1%

50の不正な観測値を30回複製する場合、少数派の観測値を複製した後の不正な観測値は1500になります。 そして、オーバーサンプリング後の新しいデータの合計観測値は、4950 + 1500 = 6450になります。 したがって、新しいデータセットのイベントレートは1500/6450 = 23%になります。

この方法の主な利点は、有用な情報が失われないことです。 しかし、一方で、少数派イベントを複製するため、過剰適合の可能性が高くなります。

アンサンブルテクニック

この方法論は、基本的に既存の分類アルゴリズムを変更して、不均衡なデータセットに適したものにするために使用されます。 このアプローチでは、元のデータからいくつかの2段階分類器を構築し、それらの予測を集計します。 ランダムフォレスト分類器は、アンサンブルベースの分類器の例です。