機械学習が分からん

めっちゃ学術的で、分かる人にしか分からないエントリですまそ。自然言語処理を研究しているので、機械学習を勉強していますが、分からないことだらけ。

データセットをランダムにn個に分割し、そのうちn-1個を訓練データに使い、1個をテストデータに使う。訓練事例とテスト事例の分割は全部でn個あるので、すべてのパターンに対して学習→テストを行い平均(マクロ平均)をとる。こうすると事例の総数が少なくても、事例の情報を余すこと無く使うことができるため、少ない事例数でもより正確な評価ができる。これがn-fold cross validation。

レーニングデータの数に対して、素性の数が多い場合、学習データに対して正確にフィッティングしすぎてしまい、テストデータに対して正しく分類できないことがある。これがオーバーフィッティング。オーバーフィッティングを回避する方法として正則化項を追加するという方法がある。正則化項の係数(以下正則化係数)を決定するには別データを用いて適切な係数を決める。この別データのことをディベロップメントデータと呼ぶ。正則化項は 1-normや2-normが有名。L1, L2という呼び方がされています。以前見た比較結果ではL2の方が精度が良かった。 L1の方は、多くのパラメータの値が0になる、という興味深い特徴があるようだ。

素性に対して事例が多い場合は正しくフィッティングする。

素性を多くすると、素性に対して事例が少ない場合はオーバーフィッティングする。ただし、正則化項で抑制可能。

素性を多くすると事例空間が高次元になるのでトレーニングデータの誤分類を減らすことができる。

素性・トレーニングデータが多くなると、学習に時間がかかるし、メモリも食う。

精度向上するための方法としてブースティングとかあるらしいけど、まだ勉強不足でこのあたりは良く分からない。


理論的には、だいたい分かる。・・・けど、実際に使う上でちょっと良くわからないことがある。

cross validation+ディベロップメントを使う場合

データを5分割し、トレーニングデータに3つ・ディベロップメントデータに1つ・テストデータに1つ割り振る。この場合、20パターンある。この時、二種類の方法が考えられると、無知な僕は思う

方法1

正則化係数に対してトレーニングデータで訓練し、ディベロップメントデータで適切な正則化係数を選択する。そして、決定された正則化係数と訓練されたモデルを使いテストデータを使って評価する。これを20パターン行い、マクロ平均をとる。

方法2

テストを5回しかやらない方法。

正則化係数に対してトレーニングデータで訓練し、ディベロップメントデータで適切な正則化係数を選択する。これを4パターン行い、各イテレート毎に算出した正則化係数の平均を取り、これを正則化係数とする。そして、決定された正則化係数と訓練されたモデルを使いテストデータを使って評価する。これを5パターン行い、マクロ平均をとる。

方法1だと、評価回数が20回なので、評価が正確になる?方法2だと正則化係数を確定するために事例の情報をフルに使っているので、精度向上になる?

これらが正しいとすれば、精度向上に寄与するので方法2を採用したいな。

素性数と事例数

速度が遅い分にはいいんだけど、メモリを食いすぎるのは処理できなくて困る。じゃあ、適切な素性の数と適切なデータ量ってなんですか?

効かない素性

前述したように素性を加えればトレーニングデータの誤分類が減る。そのため、オーバーフィッティングさえ回避すれば、性能はあがる可能性が高い。

だから、効かない素性というのは基本的に無く、素性を加えれば加えるほど性能があがると考えられる?

でも、現実にはメモリの制限があるので、ある素性を足すより、事例を増やすか、別の素性を増やした方が性能が向上する、より効かない素性というのがあるはず。

このような素性を見抜きたいのだが、その方法はあるのか?



と色々分かりません。教えてエロい人!