分類-はじめに
分類入門
分類は、観測値または特定のデータポイントからクラスまたはカテゴリを予測するプロセスとして定義できます。分類された出力は、「黒」、「白」、「スパム」、「スパムなし」などの形式にすることができます。
数学的には、分類は、入力変数(X)から出力変数(Y)へのマッピング関数(f)を近似するタスクです。これは基本的に教師あり機械学習に属し、入力データセットとともにターゲットも提供されます。
分類の問題の例としては、電子メールでのスパム検出があります。出力には、「スパム」と「スパムなし」の2つのカテゴリしかありません。したがって、これはバイナリタイプの分類です。
この分類を実装するには、最初に分類器をトレーニングする必要があります。この例では、「スパム」および「スパムなし」の電子メールがトレーニングデータとして使用されます。分類器のトレーニングに成功すると、不明な電子メールを検出するために使用できます。
分類における学習者のタイプ
分類問題にはそれぞれ2種類の学習者がいます-
怠惰な学習者
名前が示すように、そのような種類の学習者は、トレーニングデータを保存した後、テストデータが表示されるのを待ちます。分類は、テストデータを取得した後にのみ行われます。彼らはトレーニングに費やす時間は少なくなりますが、予測に多くの時間を費やします。怠惰な学習者の例は、K最近傍法と事例ベースの推論です。
熱心な学習者
怠惰な学習者とは対照的に、熱心な学習者は、トレーニングデータを保存した後、テストデータが表示されるのを待たずに分類モデルを構築します。彼らはトレーニングにより多くの時間を費やしますが、予測にはより少ない時間を費やします。熱心な学習者の例は、ディシジョンツリー、ナイーブベイズ、人工ニューラルネットワーク(ANN)です。
Pythonでの分類子の構築
機械学習用のPythonライブラリであるScikit-learnを使用して、Pythonで分類子を構築できます。Pythonで分類子を作成する手順は次のとおりです-
ステップ1:必要なPythonパッケージをインポートする
scikit-learnを使用して分類器を構築するには、それをインポートする必要があります。次のスクリプトを使用してインポートできます-
import sklearn
ステップ2:データセットのインポート
必要なパッケージをインポートした後、分類予測モデルを構築するためのデータセットが必要です。sklearnデータセットからインポートすることも、要件に応じて他のデータセットを使用することもできます。sklearnの乳がんウィスコンシン診断データベースを使用します。次のスクリプトを使用してインポートできます-
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']
次のコマンドは、ラベルの名前を出力します。malignant'と'benign'私たちのデータベースの場合。
print(label_names)
上記のコマンドの出力は、ラベルの名前です-
['malignant' 'benign']
これらのラベルは、バイナリ値0および1にマップされます。 Malignant がんは0で表され、 Benign 癌は1で表されます。
これらのラベルの機能名と機能値は、次のコマンドを使用して確認できます-
print(feature_names[0])
上記のコマンドの出力は、ラベル0の機能の名前です。 Malignant がん-
mean radius
同様に、ラベルの特徴の名前は次のように生成できます-
print(feature_names[1])
上記のコマンドの出力は、ラベル1の機能の名前です。 Benign がん-
mean texture
次のコマンドを使用して、これらのラベルの機能を印刷できます-
print(features[0])
これにより、次の出力が得られます-
[
1.799e+01 1.038e+01 1.228e+02 1.001e+03 1.184e-01 2.776e-01 3.001e-01
1.471e-01 2.419e-01 7.871e-02 1.095e+00 9.053e-01 8.589e+00 1.534e+02
6.399e-03 4.904e-02 5.373e-02 1.587e-02 3.003e-02 6.193e-03 2.538e+01
1.733e+01 1.846e+02 2.019e+03 1.622e-01 6.656e-01 7.119e-01 2.654e-01
4.601e-01 1.189e-01
]
次のコマンドを使用して、これらのラベルの機能を印刷できます-
print(features[1])
これにより、次の出力が得られます-
[
2.057e+01 1.777e+01 1.329e+02 1.326e+03 8.474e-02 7.864e-02 8.690e-02
7.017e-02 1.812e-01 5.667e-02 5.435e-01 7.339e-01 3.398e+00 7.408e+01
5.225e-03 1.308e-02 1.860e-02 1.340e-02 1.389e-02 3.532e-03 2.499e+01
2.341e+01 1.588e+02 1.956e+03 1.238e-01 1.866e-01 2.416e-01 1.860e-01
2.750e-01 8.902e-02
]
ステップ3:データをトレーニングセットとテストセットに整理する
見えないデータでモデルをテストする必要があるため、データセットをトレーニングセットとテストセットの2つの部分に分割します。sklearn pythonパッケージのtrain_test_split()関数を使用して、データをセットに分割できます。次のコマンドは関数をインポートします-
from sklearn.model_selection import train_test_split
次のコマンドは、データをトレーニングデータとテストデータに分割します。この例では、データの40%をテスト目的で使用し、データの60%をトレーニング目的で使用しています。
train, test, train_labels, test_labels = train_test_split(
features,labels,test_size = 0.40, random_state = 42
)
ステップ4:モデルの評価
データをトレーニングとテストに分割した後、モデルを構築する必要があります。この目的のために、ナイーブベイズアルゴリズムを使用します。次のコマンドはGaussianNBモジュールをインポートします-
from sklearn.naive_bayes import GaussianNB
ここで、モデルを次のように初期化します-
gnb = GaussianNB()
次に、次のコマンドを使用して、モデルをトレーニングできます-
model = gnb.fit(train, train_labels)
ここで、評価の目的で、予測を行う必要があります。これは、次のように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 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の出力は、 Malignant そして Benign 腫瘍クラス。
ステップ5:精度を見つける
2つの配列、つまりtest_labelsとpredsを比較することで、前のステップでモデル構築の精度を見つけることができます。精度を決定するためにaccuracy_score()関数を使用します。
from sklearn.metrics import accuracy_score
print(accuracy_score(test_labels,preds))
0.951754385965
上記の出力は、単純ベイズ分類器が95.17%正確であることを示しています。
分類評価指標
機械学習アプリケーションまたはモデルの実装が完了しても、ジョブは完了しません。モデルがどれほど効果的かを知る必要がありますか?さまざまな評価指標が存在する可能性がありますが、指標の選択は機械学習アルゴリズムのパフォーマンスの測定方法と比較方法に影響を与えるため、慎重に選択する必要があります。
以下は、データセットと問題の種類に基づいて選択できる重要な分類評価指標の一部です。
混同行列
これは、出力が2つ以上のタイプのクラスである可能性がある分類問題のパフォーマンスを測定する最も簡単な方法です。混同行列は、2次元のテーブルに他なりません。「実際」と「予測」、さらに、両方のディメンションには、以下に示すように、「真のポジティブ(TP)」、「真のネガティブ(TN)」、「偽のポジティブ(FP)」、「偽のネガティブ(FN)」があります。
混同行列に関連する用語の説明は次のとおりです。
True Positives (TP) −データポイントの実際のクラスと予測されたクラスの両方が1の場合です。
True Negatives (TN) −データポイントの実際のクラスと予測されたクラスの両方が0の場合です。
False Positives (FP) −データポイントの実際のクラスが0で、データポイントの予測クラスが1の場合です。
False Negatives (FN) −データポイントの実際のクラスが1で、データポイントの予測クラスが0の場合です。
sklearnのconfusion_matrix()関数を使用して、混同行列を見つけることができます。次のスクリプトの助けを借りて、上記で構築された二項分類器の混同行列を見つけることができます-
from sklearn.metrics import confusion_matrix
出力
[
[ 73 7]
[ 4 144]
]
正確さ
これは、MLモデルによって行われた正しい予測の数として定義できます。次の式を使用して、混同行列で簡単に計算できます。
$$ = \ frac {+} {+++} $$上記で構築されたバイナリ分類器の場合、TP + TN = 73 + 144 = 217およびTP + FP + FN + TN = 73 + 7 + 4 + 144 = 228。
したがって、精度= 217/228 = 0.951754385965は、バイナリ分類子を作成した後に計算したものと同じです。
精度
ドキュメントの取得に使用される精度は、MLモデルによって返される正しいドキュメントの数として定義できます。次の式を使用して、混同行列で簡単に計算できます。
$$ = \ frac {} {+ FP} $$上で構築された二項分類器の場合、TP = 73およびTP + FP = 73 + 7 = 80です。
したがって、精度= 73/80 = 0.915
再現率または感度
リコールは、MLモデルによって返されるポジティブの数として定義できます。次の式を使用して、混同行列で簡単に計算できます。
$$ = \ frac {} {+ FN} $$上で構築された二項分類器の場合、TP = 73およびTP + FN = 73 + 4 = 77です。
したがって、精度= 73/77 = 0.94805
特異性
リコールとは対照的に、特異性は、MLモデルによって返されるネガティブの数として定義できます。次の式を使用して、混同行列で簡単に計算できます。
$$ = \ frac {N} {N + FP} $$上で構築された二項分類器の場合、TN = 144およびTN + FP = 144 + 7 = 151です。
したがって、精度= 144/151 = 0.95364
さまざまなML分類アルゴリズム
以下はいくつかの重要なML分類アルゴリズムです-
ロジスティック回帰
サポートベクターマシン(SVM)
デシジョンツリー
ナイーブベイズ
ランダムフォレスト
これらすべての分類アルゴリズムについては、以降の章で詳しく説明します。
アプリケーション
分類アルゴリズムの最も重要なアプリケーションのいくつかは次のとおりです-
音声認識
手書き認識
生体認証
文書分類