正例と負例の数、もしくはSVMが対応できるスパースさの限界

 これまでにあんまりやられてないタスク(だからもちろんメジャーなコーパスとかは無い)を機械学習でやってみようとして、とりあえず自分でちょろっとコーパスを作って、SVMで学習させて、それでまたコーパスを増やして、とブートストラップしていこうと思ったんだけど、実際にやってみると、学習させたSVMコーパスを増やそうとしたところで失敗した。
 学習データに偏りがある(負例が多い)せいで、負例側に引きずられてしまい、学習させたモデルが全くうまく働かない。Precisionが0%の実験結果とか初めて見た。実験結果を見ると、全事例を負例と判断していて、それでも精度(PrecisionじゃなくてAccuracyの方)は95%ぐらい出てた。負例がかなり多いデータなので、負例側に引きずられるのはある程度仕方がないのかもしれない。
 全事例を負例と判断している様ではコーパス作成の助けにならないのでどうにかしないといけないのだが、あまり良い手が思いつかない。まずコーパスを地道に増やすという手があるが、これは割と苦痛な上に、どこまでいけばコーパス作成補助ができる精度になるのかわからないので、あまりやりたくない。次に、あまりに素性空間が広すぎるのが問題な訳で、スムージングしてやるという手がある。例えば、字種情報を素性に入れてやるとか、文字HMMの結果を素性に入れてやるとか。他に、正例のみを増やすという手もあるだろう。ひとまず人工的に正例のみをルールベースでガーッと生成するなりして、それをトレーニングに使うという方法だ。これはいつも使える手では無いけど、今回は可能だった。
 で、上にあげたような改善案があったわけだけど、結局、他の手法で対応した。具体的には、前後2文字ずつの5-gramで実験データを作成していたのを、前後1文字ずつの3-gramにデータ量を減らした。これで実験をやり直してみると、精度が98%ぐらいにまで改善された。再現率が80%ぐらいしかないのでまだまだ改善の余地はあるが、とりあえずコーパス作成補助に使う、という当初の目的は達成できそうだ。
 後はSVMコーパスを作って、それを人手で修正して、またそれで学習させて…というサイクルを何度か繰り返すことになると思うんだけれど、ある一定の段階から先では、3-gramを使うよりも5-gramを使った方が精度が良くなるはず。いったいどれぐらいのデータ量でそれが起こるのか、今はそれが知りたい。つまり、素性空間の広さとそこから適切なハイパープレーンを見つけるために必要なデータ量の関係。もちろん、データの質によって変わってくるとは思うんだけど。