sklearn – confusion_matrix

概要

機械学習の精度を複数の視点で確認するのに、Confusion Matrix(混同行列)を用いるが、sklearn.metricsパッケージのconfusion_matrixモジュールはこの集計を自動で行ってくれる。

使い方

引数

confusion_matrix(y_true, y_pred, labels=None, normalize=None)

y_true
ターゲットの正解の配列を与える。
y_pred
予測されたターゲットの配列を与える。
labels
表示される順番を変更したいときに、ターゲット値をリストで指定する。
normalize
合計値に対する比率で表示する。正解の合計に対する場合は'true'、予測結果の合計に対する場合は'pred'、全体の合計に対する場合は'all'を指定する。

戻り値

戻り値は[n_class, n_class]の2次元配列で、各行が正解の各クラス、各列が予測された各クラスに対応する。各クラスの並びは、数値なら昇順、文字列なら辞書順で、行・列とも同じ並びになる。

実行例

データの準備とモデルによる予測

Breast Cancerデータセットで使い方を見ていく。まず、cancerデータを読み込み、訓練データとテストデータに分割する。予測モデルにはLogistic回帰を用いて、訓練データについてターゲットを予測する。以降、訓練データに関する正解ターゲットと予測ターゲットを使う。

ここでデータの内容を確認しておく。正解データ、予測データとも0/1の2クラスで、0が悪性(malignant)、1が良性(begnign)と定義されている。

また、0/1の数値によるクラス表現を文字列表現にした配列を別に作っておく。

基本的な使い方

要素のみを得る

基本的な使い方は、confusion_matrix()の引数に正解データと予測データをコレクションで与える。結果は行・列とも昇順で並べられる。以下の例では、1行目が正解・悪性、2行目が正解・良性、1列目が予測・悪性、2列目が予測・良性となっている。

クラスが文字列で表現されている場合は、文字列の辞書順なので、行・列とも'benign''malignant'の順で並べられる。この結果、数値表現の場合に対して行・列とも入れ替わっている。

要素の並び順を変更する

引数labelsにリストでクラスの並びを指定できる。以下の例ではデフォルトの昇順の並びを変更している。

要素を正規化する~比率で表す

引数normalizeで合計に対する比率の計算の仕方を指定できる。

normalize='true'の場合、正解の各行の合計に対する比率が計算される。以下の例では行の合計で各要素が除され、各行の合計が1となっている。

normalize='pred'の場合、予測の各列の合計に対する比率が計算される。以下の例では列の合計で各要素が除され、各列の合計が1となっている。

normalize='all'の場合、すべての要素の合計に対する比率が計算される。以下の例では、全要素の合計が1となっている。

なお、normalize='all'を指定した場合の対角要素の和は、全要素に対する正解要素の比率になり、score()メソッドの値と等しい。

DataFrameによる扱い

ラベルの追加

pandasDataFrameを使うと、行・列のラベルが表示されるので見やすくなる。行(正解)のラベルはindexで、列(予測)のラベルはcolumnsで指定し、同じ内容のコレクションを与える。

合計欄

DataFramesum()メソッドで、行・列の合計を計算して追加すると見やすい。sum()メソッドの引数を省略するとデフォルトのaxis=0となり、列ごとの合計が1次元配列で得られる。引数をaxis=1とすると行単位の合計が1次元配列で得られる。

以下の例では、まず列方向の合計(各予測クラスの合計)を最後の行に加え、その行も含めて行方向の合計(各正解クラス、予測クラス合計の合計)を最後の列に加える。

Multiindex

DataFrameのMultiindexを使うと、正解・予測を表示できるのでより分かりやすくなる。ただし行・列・要素の指定が少し煩雑になる。

以下はMultiindexの場合に合計欄を加える例。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です