問題を解いて理解しよう!前篇はじめまして、@naoya_tです!僕は、C.M.ビショップ著「パターン認識と機械学習(PRML)」の読書会を都内で主宰している「Web・機械学習系のエンジニア」です。今日は、ITエンジニア向け実務スキル評価サービス「CodeIQ」で僕が出題している問題の解答について、わかりやすく説明します。総研スタッフ/CodeIQ運営事務局)作成日:13.03.11Rを使って、簡単な機械学習を学ぶ!2012年12月からCodeIQで機械学習分野の問題を3題出題しました。第1問から第3問で一連のストーリー(「金とキノコ」3部作)になっています。3問とも、機械学習の基礎的な知識と手元のPCで解けるようなやさしめの設定にしてあります。第1問と第2問はクラス分類を使って、本物の金貨と本物のキノコを見分ける問題です。第3問は、異常(外れ値)検出で、選んではいけない玉を見つけ出す問題です。今日は、第1問と第2問について、解説をします。以下の解説ではRによるコード例を示していますが、いずれも数行のコードで解くことができます。週末に海賊船で催されたPRML読書会に参加したN君は、船内に山のように積まれた金銀財宝に目を奪われました。近くにあった宝箱の1つを開けてみると、きらきらと輝くコインが何枚も入っていました。手に取ってみるとどれもずっしりと重みがあります。金貨に違いありません。好きなだけ持って帰ってよいと言われ、勉強会帰りに何枚か鞄に詰め込んで帰ることにしました。家に帰ってから少し冷静になったN君は「気前よく配っていたけれど、この金貨は本物なのだろうか」と疑い始めました。鞄には20枚の金貨が入っていましたが、友人のアルキメデスに計測してもらったところ、20枚とも体積も重さも異なりました。ネットで検索してみたところ、金貨の体積と重さと真贋のデータを得られました。このデータを参考に、貰ってきた金貨の真贋を見分けてください。(CodeIQ_mycoins.zip)20行から成るテキストファイルで、1行にコイン1枚ずつ、そのコインの体積(cm^3)重さ(g)が半角スペース区切りで記入されています。偽物なら'0')が半角スペース区切りで記入されています。■解答方法それぞれのコインの真贋を、1行にコイン1枚ずつ、本物なら「1」、偽物なら「0」、どちらとも言えなければ「?」と記入したファイルをアップロードしてください。101?10...のような20行のテキストファイルになります。「貰ってきた20枚のコインのデータ」のファイルと同じ順番でお願いします。本物の金貨には一定割合以上の金が含まれています(純粋な金は、流通を前提とした硬貨として使用するには柔らかすぎるため、通常は、銀や銅などの他の金属との合金が用いられます)。ちなみに、金とほぼ同じ比重を持つタングステンで鋳造し金メッキを施したコインは、重さと体積だけでは識別できませんのでご注意ください!本設問ではコインには金と同等、もしくは金より比重の大きい金属は混ざっていないものとします。与えられたデータ(コイン100枚分)を教師とする、クラス分類(教師あり学習)問題です。Learning)とは、分類済みのデータを訓練データとして用いることができる状況で、新たに与えられたデータに対し分類や回帰を行う手法です。解法データをプロットしてみておわかりかと思いますが、直線できれいに分類できそうなデータです。引っ掛け問題的な要素も特にありません。【註】しかも、原点を通る直線が引けます。これは、重さを体積で割って比重を求めれば、しきい値の上か下かで分類できてしまうことを意味します。フィッシャーの線形判別法、パーセプトロン、SVM(サポートベクタマシン)など色々な手法が使えますが、この後のコード例ではSVMを使っています。SVM(サポートベクタマシン)とは2クラスの訓練データの識別面を、データ点からの距離(マージン)が最大になるように求める線形識別手法です。現在知られている中では最高レベルの精度が得られる手法のひとつです。カーネル関数を導入することで、線形分離が不可能な問題にも適用することができます。Forest法などの手法が知られています。評価のポイント貰ったコインは20枚のうち10枚が本物で、10枚が偽物です。難易度★ということで(問題をやさしくするために)、100枚分の真贋のデータ(=教師データ)をもとに本物と偽物を分離する境界線をどのように引いたとしても境界線に一番近い教師データよりも貰ったコインのほうが近いという事がないようなデータセットにしてあります。なるようなコインしか入っていません!特に引っ掛け問題的な要素はありません。すべての真偽を正しく分類できれば評価5、10枚以下の正答は評価1としました。(プログラムコードの提出は不要です)Rでのコード例kernlabパッケージを用いますので、事前にinstall.packages("kernlab")しておいて下さい。row.names=F)解答10011011100110010001第2問:「食べられるキノコはどれだ?」~食べても大丈夫な金色のキノコをクラスタリングして見つけよう!~※前問「金貨の真贋を見分けよう」の続編となっています。海賊船で催されたPRML読書会は楽しかった。機械学習の事も少しはわかった気がするし、金貨も沢山貰えた。偽金貨もずいぶん混ざっていたが。本物とわかった金貨を何枚か貴金属店で売って小金ができた。貴金属店の店主は海賊船での読書会の話もそこで金貨を貰った事も信じていないようだったが、そのうち何枚かは百年前に北大西洋で沈没した豪華客船に積まれていた幻の金貨だそうで、店主もほくほくしていた。これでカーネル多変量解析の本でも買おうかと思っていたN君に、海賊船の船長からメールが届いた。「太平洋のある島にたどり着いた。島は家から道路から何もかも金でできている。」もしかしてあの「ジパング」ですか?「しかし、この島には誰も住んでおらず、あるものといえば金ばかりで食料が全くない。「この島のキノコは見たところ3種類あるようだ。そのうち2種類は毒キノコらしい。誤って食べた隊員が3日3晩笑い転げたり泣き叫んだりしている。3種類とも金色なので色では区別がつかない。」とりあえず死人は出ていないらしい。食べても大丈夫なキノコを教えてほしい」キノコの傘の大きさと柄の長さが記されたデータが送られてきた。このデータをもとに採ってきたキノコをクラスタリングして、隊員が食べた毒キノコの含まれないグループのキノコを船長に教えてあげよう。■採ってきたキノコと、隊員が食べたキノコのデータCodeIQ_data.txt:採ってきたキノコ(96本)柄の長さ(cm)と傘の直径(cm)が半角スペース区切りで記入されているCodeIQ_eaten.txt:隊員が食べたキノコ(6本)柄の長さ(cm)と傘の直径(cm)と食べた隊員の安否(o/x)が半角スペース区切りで記入されている■解答方法answer.txt:採ってきたキノコ(96本)解答は、テキストファイル「answer.txt」をアップロードしていただきます。「answer.txt」には食べていいキノコ(本数不明)のみについて、柄の長さ(cm)と傘の直径(cm)をCodeIQ_data.txtと同じ要領で、半角スペース区切りで記入してください。食用キノコと毒キノコの見分け方はその多くが迷信で、見た目の特徴で判断するのはほぼ不可能である。自然界には毒性の不明なキノコ、猛毒のキノコが多数存在する。キノコの拾い食いはやめよう。与えられたデータ点をクラスタに分類する、クラスタリング問題(教師なし学習)です。Learning)とは、分類済みのデータ(訓練データ)は前もって用意されておらず、与えられたデータだけからそのデータの構造や特徴を見出す手法です。クラスタ分類、主成分分析(PCA)などは教師なし学習の代表的な例です。クラスタリング手法には、データを階層的に分類する階層型手法(Ward法など)と、特定のクラスタ数に分類する非階層的手法(K-means法など)があります。解法まずは、データをプロットして目で確認してみましょう。16.63......柄の長さを横軸に、傘の直径を縦軸にプロットしてみるとこんな感じです。3つのクラスタがあるのがなんとなくわかりますね。oこれもプロットしてみるとなんとなく3つのクラスタにわかれています。先ほどのプロットに重ねてみましょう。それぞれのクラスタに色をつけてみました。2つのoが入っているクラスタが安全なクラスタです。問題文からクラスタ数(=キノコの種類)が3とわかっていますので、ここではK-means法で解いてみましょう。各データ点にランダムにクラスタを割り振るクラスタ毎に重心を求める各データ点を、重心が一番近くにあるクラスタに再分配クラスタ移動がなくなるまで2~3を繰り返しのような処理をすることでクラスタを求める手法です。1.での割り振り方によって異なる結果に収束することがあります。評価のポイント特に引っ掛け問題的な要素はありません。採ってきたキノコ(96本)を適切にクラスタリングするどのクラスタが食べても大丈夫なキノコのクラスタなのか、ヒント情報(隊員が食べた6本のキノコの情報)と照合して判別するの2点ができていれば評価5としました。ちなみに食べても大丈夫なキノコは30本あります。キノコの安全性は生死にかかわる問題であるためか、クラスタ境界をかなり小さめに(安全側に)取っている人もちらほらいらっしゃいました。毒キノコは選んでいないものの、安全なキノコの本数が少なめな場合は評価4。生死にかかわる問題で基準を安全側に倒す判断は正当だと思います。今回は、隊員の食糧をできるだけ多く確保したいという思いから完全正答を30本としました。クラスタ分類は概ね正しいものの、毒キノコが1本でも混ざっていれば評価3。データが正しくない場合(問題データに存在しない柄の長さと傘の直径が含まれている、他の出題者の問題の解答が送られてきた、etc)は評価1とさせていただきました。Rでのコード例Rにはkmeans()というそのまんまの関数がビルトインであるのでこれを使いましょう。ライブラリパッケージのインストールは必要ありません。そのキノコが属するクラスタIDを安全クラスタとします。ここでは6番目を使っていますが3番目でも構いません。10.71さいごに機械学習を使って本物の金貨、本物のキノコは見分けられましたか?後篇は100個の玉の中から貴重な石を一つだけ選び出す方法について解説する予定です。本格的なビッグデータ時代を迎え、注目を集めている「データサイエンティスト」という新たな職種。予測...Gunosy開発者×iAnalysisの最高解析責任者が対談ビッグデータ新時代!データサイエンティストの仕事術ビッグデータの活用が一般化する中、その使い手であるデータサイエンティストが注目されている。企業の第一線で働いているエンジニアに、直接実力を評価してもらい転職する。Tech総研リクルートグループサイトへ。