判別分析のパフォーマンスはどのくらい優れている?2つの前提条件と精度評価のポイント
判別分析は、分類スコアを算出するために2つの主要な前提条件に依存しています。これらの前提がどの程度満たされているかによって、モデルの性能が大きく左右されます。本記事では、判別分析の強みと弱点、そして適切な性能評価の方法について詳しく解説します。
前提1:予測変数の多変量正規性
第一の前提は、各クラスにおける予測変数(説明変数)の測定値が多変量正規分布から発生していると仮定することです。
この仮定がおおよそ満たされている場合、判別分析はロジスティック回帰などの他の分類手法よりも強力なツールとなります。実際、データが多変量正規分布に従う場合、判別分析はロジスティック回帰より約30%効率的であり、同じ結果を得るために必要なレコード数が30%少なくて済むことが示されています。
さらに、この手法は正規性からの逸脱に対しても比較的頑健であることが知られています。予測変数が厳密には正規分布に従わない場合や、ダミー変数であっても適用可能です。ただしこれが当てはまるのは、最小のクラスが十分な大きさ(およそ20件以上のレコード)を持つ場合です。
一方で、注意すべき点もあります。判別分析は、単一の予測変数のレベルにおいても、多変量のレベルにおいても外れ値に敏感です。そのため、探索的データ分析(EDA)を活用して極端な値を特定し、それらを除外すべきかどうかを判断することが重要です。
前提2:クラス間で共通する相関構造
第二の前提は、クラス内における複数の予測変数間の相関構造が、すべてのクラス間で同一であるというものです。
この前提は、クラスごとに予測変数間の相関行列を個別に計算し、それらを比較することで確認できます。もしクラス間で相関が大きく異なる場合、分類器はばらつきが最も大きいクラスへレコードを割り当てる傾向があります。
相関構造が本質的に異なり、かつデータセットが大規模な場合は、二次判別分析(QDA)を利用するのが有効な代替策となります。
実践的なアプローチ
現実的な進め方としては、以下の手順が推奨されます。
1. 正規性と相関に関する探索的分析を実施する
2. モデルを訓練し、評価する
3. 分類精度や初期の探索で得られた知見をもとに、外れ値の扱いや予測変数の選択を見直す必要があるかを再検討する
検証データによる性能評価
検証セット(バリデーションセット)を用いてパフォーマンスを評価するという原則は、判別分析にも同様に当てはまります。
例えば、芝刈り機購入者のサンプルデータでは、世帯1、13、17が誤分類されており、訓練データに対するモデルの誤り率は12.5%となります。
しかしこの数値は偏った(楽観的な)指標です。分類関数の推定と誤差の計算に同じデータを使用しているため、実際の性能を過大評価しています。したがって、他の多くのモデルと同様に、分類関数の算出に使用していないデータを含む検証セット上で性能を確認することが不可欠です。
混同行列の作成方法
判別分析の結果から混同行列を作成するには、分類スコアそのもの、あるいは分類スコアから導出される所属確率(各クラスへの所属傾向)のいずれかを使用します。どちらの場合も、各レコードのクラス割り当ては、最も大きなスコアまたは確率を持つクラスに基づいて決定されます。
そして、これらの分類結果をレコードの実際のクラス所属と照らし合わせることで、モデルの予測性能を一目で把握できる混同行列が完成します。
-
C言語のトークンとは?種類と基本構成要素をサンプルコード付きで解説
C言語のプログラムは命令文(ステートメント)の集まりであり、さらにその命令文一つひとつは、より小さな単位の集合によって構成されています。このように、Cプログラムを構成する個々の小さな単位のことを「トークン(token)」と呼びます。つまり、Cプログラム内のすべての命令文は、複数のトークンが集まってできているということです。トークンはCプログラムを作り上げるための材料であり、「プログラムの基本的な構成要素(ビルディングブロック)」とも表現されます。Cプログラムにおけるトークンの種類Cプログラムの中で扱われるトークンには、主に以下の7種類があります。キーワード(予約語):int、if、for、re
-
C#のコメントとは?複数行・単一行コメントの書き方を解説
コメントは、コードの内容や意図を説明するために記述する注釈です。コンパイラはコメント部分を完全に無視するため、プログラムの動作には一切影響しません。C#では、複数行にわたるコメントは「/*」で始まり、「*/」で終わります。 複数行コメント /* 以下はC#における 複数行コメントの例です */ 「/* ... */」で囲まれた範囲はすべてコンパイラによって無視されます。処理の概要や注意点など、複数行にわたる説明を残したい場合に使用します。 単一行コメント // 変数の宣言 int a = 10; 単一行コメントは「//」から行末までがコメントとして扱われます。変数の意味や処理の意図を手軽にメモ