機械学習 はじめよう

第15回 分類問題ことはじめ

この記事を読むのに必要な時間:およそ 3 分

前回まで扱っていた回帰問題は,データ点にマッチした関数を見つけるものでしたが,機械学習には他にも様々な問題を解くための手法があります。

今回からはその中の一つ,⁠分類問題」に入っていきましょう。

分類問題

「分類問題」とは,データをそれぞれカテゴリに分類するもので,機械学習の代表的な使い道の一つです。

例えばメールをスパムと非スパムに分類したり,文中の単語に名詞や動詞などの品詞ラベルを割り振ったり,Webページの内容に応じて「スポーツ」「政治」などのジャンルに分類したりするのもすべて分類問題と見なすことで,機械学習を使って解くことができるようになります。

「分類」に雰囲気のよく似た言葉として「クラスタリング」というものもありますが,機械学習の分野ではその2つは明確に区別しています。

「分類問題」では,データをどのようなカテゴリーに分けるかは問題を解きたい人が指定します。したがって学習用のデータには正解カテゴリーがラベルとして割り振られており,それを使って「このカテゴリに属するデータはどのようなものか」を学習します。

一方の「クラスタリング」では,一般に問題を解きたい人がカテゴリを明示的に与えることはできません。できることは「2つのデータがこういう関係を満たしていれば似ているとする」といった条件と,データ全体をいくつのかたまり(クラスタ)に分割するのかを決めることだけです※1)⁠

本連載では「クラスタリング」は扱いませんが,こちらも機械学習の代表的な問題の一つです。k-meansやトピックモデルなど多くの手法や考え方があります。

また,分類問題はデータを2種類に分類する二値分類と,3種類以上に分類する多値分類に大きく分けられます。

多値分類は特有の難しい問題がいくつかあるため,本連載では二値分類のみを扱うことにします。

※1
発展的な手法には,クラスタ数をデータから自動的に決めるものもあります。

分類関数による定式化

それでは,分類問題をコンピュータが扱える形に定式化しましょう。

「データを分類する」と一言でいうと簡単そうに聞こえますが,具体的にはどうすればよいのでしょうか。

回帰問題ではデータから関数を作りましたから,未知のデータに対してもその関数値を予測することができました。同じように考えれば,データを入力したらそのカテゴリーが出力されるような関数を作ることができればよさそうです。そのような関数は「分類関数」という単純な名前が付いています。

二値分類において,例えばメールのスパム分類の場合の「スパム」「非スパム」のように,分類関数は2種類の「値」をとりえますが,関数という以上はそれは数値である必要があります。そこで「スパム」に+1を,⁠非スパム」に-1を,というように適当な数値にそれぞれ割り当てます。

当然,⁠なんかスパムが正の値で,非スパムが負の値ってやだなあ。逆じゃあダメなの?」とか「±1じゃあなくて0と1のほうがよくない?」といった疑問がわくことでしょう。

どのクラスをどの数値に割り当てるかは便宜的なもので,必然性はありませんから,割り当てを入れ替えても全くかまいません。そうしたところで符号が反転した分類関数が求まるだけですしね。

一方,割り当てる数値は問題の解き方やモデルにあわせて都合がよいものを使います。ここではこの後紹介するモデルにとって±1が都合がよいのでそれを選んでいますが,モデルによっては1と0などを割り当てることもあります。

さて,こうしてそれぞれのデータに対して±1の値をとる関数を作ればいいというところまできました。

関数を作るということなら,これを回帰問題として解くこともできそうな気がしますが,残念ながらそう単純にはいきません。というのも,回帰によって得られる関数は当然ながら±1以外の値も取り得るからです。

それだけのことなら「近い方の値に寄せる」というシンプルな解決方法はあります。しかし,正解ラベルが+1のデータ点では関数が値-0.5をとるより値+10をとる方が分類関数としては望ましいわけですが,回帰の二乗誤差では-0.5の方が誤差が少ないということになってしまいます。これではモデルが期待通りに学習されるとは到底思えません。

つまり,分類問題のためのモデルがやはり別に必要ということがわかります。

パーセプトロン

分類問題のモデルはとてもたくさんありますが,とても簡単な手法の一つである「パーセプトロン」を手始めに紹介しましょう。

話を簡単にするため,データ点 は2次元平面上にあるとします。 を(xn,yn)の正解ラベルとします。

このとき,作りたい分類関数fは,xy平面上の点を入れると+1または-1が返ってくる関数になります。

さて,前回まで紹介してきた線形回帰では,求めたい関数を基底関数の線形和の形に仮定し,そのパラメータを決定することで解くことができました。

パーセプトロンでも同じように,パラメータa,b,cを導入して,分類関数の形を次のように仮定してしまいます。

sgnは符号関数で,引数が正なら+1を,負なら-1を返します。ただしふつうの符号関数だと0に対して0が返ってきてしまって分類関数的に困るので,ここでは0のときは+1を返す変形符号関数sgn+を使うことにしましょう。

データからパラメータa,b,cを「適切に」決めることができれば,欲しい分類関数が得られます。しかし何をもって「適切」というかが次の問題になります。

線形回帰の場合は,二乗誤差が小さいことが「適切」の基準でした。したがって,二乗誤差関数が最小となるパラメータを行列の計算で求めるのでしたね。

パーセプトロンでもやはり「適切」の基準となる関数を用意します。そのためにまずあるデータ点での「誤差」を考えましょう。

単純に考えると,正解tと予測値f(x,y)の差を考えればいいような気がします。両方とも±1のどちらかしか取りませんから,差は0(正解)または2(不正解)になります。

これも立派な誤差の決め方の一つですが,パーセプトロンでは不正解のときの誤差が一律では少し困る事情があります。

詳しくはこの次項で説明しますが,ここで定義する誤差関数ができるだけ小さくなるようなパラメータは,線形回帰でやったように行列計算一発で簡単に求めることはできません。

そこで,まずはパラメータを適当に仮決めして,誤差関数がだんだん小さくなるようにパラメータを動かしていくことで,よりよい値を求めるというアプローチを取ることになります。

そのとき,正解ラベルが+1でsgn+の中身が-0.001とかの場合はパラメータを少し動かせばすぐに正の値に変わって正解になってくれそうです。一方でもし-1000とかの場合は,これを正解に持って行くにはパラメータをかなり大きく動かさなければならないでしょう。しかしどちらも誤差が同じ値であれば,パラメータをどれくらい動かせばいいのか,誤差からは推測しにくいものとなります。

そこで,正解になるまでどれくらいsgn+の中身を動かさなければならないかをパーセプトロンにおける誤差と定義します。

つまり,パラメータa,b,cの元で不正解になるデータ(xn,yn,tn)を与えるnたちをMとおくと,誤差関数は次のように表せます。

 …(1)

不正解であるということはf(xn,yn)とtnの符号が異なるということを使って,誤差関数は次のようにも表せます。ただしh(z)はz≧0のときzを,z<0のとき0をとる関数とします。

 …(2)

著者プロフィール

中谷秀洋(なかたにしゅうよう)

サイボウズ・ラボ(株)にてWebアプリ連携や自然言語処理を中心に研究開発を行いながら,英単語タイピングゲーム iVocaをサービス提供している。

URLhttp://d.hatena.ne.jp/n_shuyo/
Twitterhttp://twitter.com/shuyo

コメント

コメントの記入