1クラスモデルは、 外れ値のモデル として使われる方法です。
1クラスモデルよりも、2クラスモデルの方がよく知られています。 2クラスモデルは、 判別分析 、 ロジスティック回帰分析 、 サポートベクターマシン など、目的変数が「白と黒」のように2つしかないモデルのことです。
これらの方法は、この2つの違いを判別するために使います。
2クラスモデルを、2つのクラスが「大多数(正常値)と外れ値(異常値)」のようになっている時の判定に使おうとすると、問題があります。
1クラスモデルは、 大多数側のデータだけでモデル式を作る方法です。
考え方は新しいものではなく、 検定 で、有意水準を境にして、判定することと同じ考え方をします。
つまり、「大多数側と考えられないから外れ値」という考え方で、外れ値を判定します。 一般的には、 外挿 は、あまり使ってはいけない方法ですが、1クラスモデルは積極的に使っています。
1クラスモデルを外れ値の判定に使うと、2クラスモデルの問題が解決します。
One-Class SVM や 1クラス最小距離法 は、名前にあるように、1クラスのモデルです。
意外に思えるかもしれませんが、 教師なし学習 の 主成分分析 は、教師データが1クラスのモデルとして使えます。
1クラスモデルを作る時は、目的変数が1クラスしかないので、実質的に目的変数の列がいりません。 つまり、「教師なし学習」と同じ状況ができています。 このため、「教師なし学習の手法を、分類問題に使う」ということが可能になります。(初学者を混乱させる話ですが、、、)
実際には、目的変数が2クラスになっているデータセットがあって、片方だけを使って1クラスモデルを作るケースが多いです。 片方だけのデータセットを作って、1クラスモデルを作ってから、全部のデータセットをテストデータにして、 出力を出します。
この手順の中で、人は2クラスであること知っていますが、コンピュータが知っている必要はありません。 コンピュータが知っている必要があるのは、この手順の後で、データを色分けしてグラフにしたりする時に知っている必要があります。
1クラスモデルでは、 「外れ値のラベルがあるデータがなくても、モデルを作ることができる。」 なのですが、あるのなら、使った方が良いです。 正しく判定できるモデルなのかの確認に使えるためです。
このため、1クラスモデルを作る時に、2クラスのデータを使うこともあります。 すると、教師なし学習の方法として知られている方法を使ったモデルを作るのに、教師データを使うことになります。 一般的には、 教師ありと教師なしの学習 は、別のものと考えますので、とてもややこしいです。
MT法 は、古くからある1クラスモデルの手法です。 データセットを、正常値側と異常値側に分け、正常値側だけでモデルを作ります。
1クラスモデルの一番シンプルなものは、1変数の正規分布を使うものだと思いますが、 MT法は、多変数の正規分布を使うので、その次にシンプルなものです。 MT法の手順 のページにありますが、 MT法では、外れ値のラベルがあるデータをモデルの確認や 変数の選択 に使うことは、よく知られています。
上記は、目的変数が質的変数の場合を念頭においた説明でしたが、1クラスモデルの考え方は、量的変数の場合にも使えます。
例えば、正常な時のデータだけで、 回帰分析 のモデルを作り、異常な時のデータを予測することに使えます。
下記のRapidMinerとRの使用例は、やっている事が基本的に同じです。 1クラスモデルを使うために、判定したいデータと参照データを分ける使い方は、基本的に 予測のためのソフトの使い方 と同じです。
R-EDA1 では、予測ではなく、ラベルが「0」のグループと、「1」のグループを明確に分けることができる変数を調べるための方法として、 1クラス分類の手法がいろいろと入っています。
ラベルが「0」のサンプルが1クラスとして扱われます。 「0」のサンプルでモデルを作ってから、「0」と「1」の両方のサンプルを入力して、違いを見るようになっています。
ラベルが書いてある列を指定するだけです。
下の例だと、4列目にラベルが書かれているので、「4」が入力されています。
R の使用例は下記になります。 (下記は、コピーペーストで、そのまま使えます。 この例では、Cドライブの「Rtest」というフォルダに、 「Data1.csv」という名前で学習データがあり、 「Data2.csv」という名前でテストデータが入っている事を想定しています。
setwd("C:/Rtest") # 作業用ディレクトリを変更
Data1 <- read.table("Data1.csv", header=T, sep=",") # 学習データを読み込み
Data2 <- read.table("Data2.csv", header=T, sep=",") # テストデータを読み込み
pc <- prcomp(Data1, scale=TRUE) # 学習データで主成分分析のモデルを作る
pc1 <- predict(pc, Data1)[,1:3] # 学習データの主成分を第3位まで作成
pc2 <- predict(pc, Data2)[,1:3] # テストデータの主成分を第3位まで作成(学習データのモデルを使うのがポイント)
write.csv(pc1, file = "pc1.csv") # 学習データの主成分をファイルに出力
write.csv(pc2, file = "pc2.csv") # テストデータの主成分をファイルに出力
順路 次は 外れ値ではない異常値のモデル