last update: 2004年11月27日

xtnfold.sh

概要:交差検定(cross validation)用のデータセットを作成する

書式:xtnfold.sh -i ファイル -d 出力ディレクトリ -n fold数 -c クラス項目 [-o トレーニングファイル名] [-O テストファイル名] [-S 乱数の種] [-t] [-V]

-V : スクリプト内部のコマンド完了メッセージを表示させる。
-h : ヘルプの表示

解説:分類モデルの精度を評価する方法の一つに、交差検定法がある。このモジュールを利用することにより、交差検定用のデータセットを作成することができる。-nで入力データをいくつのブロックに分割するかを指定する(一般には10)。-cで指定した項目(結果属性項目)で層化(stratification)される。作成されるデータは、-o,-Oを指定しなければ"##-train.xt","##-test.xt"というファイルが作成される。"##"にはfold番号が入る(10 fold cross validationの場合は1〜10の番号が入る)。

交差検定について

あるデータセットを利用して分類モデルを構築する場合、構築されたモデルの未知データに対する精度を求める代表的な方法として、テストサンプル法と交差検定法、ブートストラップ法などがある。テストサンプル法においては、データセットをトレーニングデータとテストデータに分割し、トレーニングデータを利用してモデルを構築し、テストデータを利用してそのモデルの未知データに対する予測精度の推定値とする。データ量が十分にある場合は、テストサンプル法は簡単で有効な手段であるが、データ量が少ない場合は、たまたま簡単な(もしくは難しい)テストデータが選ばれてしまうケースが顕著になり、正確な推定とならなくなる。そこで元のデータセットをn個(一般的には10)のブロックに分割し、それぞれのブロックをテストデータとし、残りをトレーニングデータとなるようにデータセットを作成する。このような方法を取ることにより、元のデータ全てがテストされることになる。交差検定は、あくまでも未知データに対するモデルの精度の推定法であり、交差検定データで作成される複数のモデルをルールとして利用することはない。実際に利用するモデルは、元のデータセットで作成したモデルであり、そのモデルの未知データに対する精度を交差検定法で推定するということである。

利用例)

以下では簡略化のためn=3のケース(通常はn=10)についての例を示す。

入力データ
属性1 属性2 結果属性
a
b
c
d
e
f
g
h
i
1
2
3
4
5
6
7
8
9
0
0
0
0
0
0
1
1
1

xtnfold.sh -c 結果属性 -n 3 -d ./datSet -o fold##-train.xt -O fold##-test.xt

以下のように3つのブロックにランダムに分割される。その時、-cで指定した「結果属性」項目の値によって層化される。すなわち、各ブロックとも、0と1が元の割合("0":"1"=6:3)と同等に出現するように選択される。

途中経過
属性1 属性2 結果属性
a
d
i
1
4
9
0
0
1
属性1 属性2 結果属性
b
c
h
2
3
8
0
0
1
属性1 属性2 結果属性
e
f
g
5
6
7
0
0
1

そして、最終的に以下のような6つのデータが-dで指定した./datSetディレクトリの下に作成される。

fold1-test.xt
属性1 属性2 結果属性
a
d
i
1
4
9
0
0
1
fold1-train.xt
属性1 属性2 結果属性
b
c
h
e
f
g
2
3
8
5
6
7
0
0
1
0
0
1
fold2-test.xt
属性1 属性2 結果属性
b
c
h
2
3
8
0
0
1
fold2-train.xt
属性1 属性2 結果属性
a
d
i
e
f
g
1
4
9
5
6
7
0
0
1
0
0
1
fold3-test.xt
属性1 属性2 結果属性
e
f
g
5
6
7
0
0
1
fold3-train.xt
属性1 属性2 結果属性
a
d
i
b
c
h
1
4
9
5
6
7
0
0
1
0
0
1