暇人日記

アラフォーおっさんのコーセラの機械学習の課題を解こうと頑張っています!

Coursera Machine Learning Week7 課題 苦闘日記⑧ 完結

 今回はemailFeature.mの完成に取り組みます。

 

 

問題文を読むとemailFeature.mは

1899X1で構成要素が0 or 1のベクトルへ変換する式ですね。

 

f:id:omoshiroamericanews:20191112121408p:plain

1899X1なのはVocabListが1899X1だからですね。

f:id:omoshiroamericanews:20191112121659p:plain

表にするとこういうことだと思います。

 

f:id:omoshiroamericanews:20191110015551p:plain

 word_indicesの86はvocabListの86を示しているので、

このword_indicesに含まれる番号のところが1にしたいです。

 

f:id:omoshiroamericanews:20191112122237p:plain

(出典;『Coursera Machine Learning』 By Mr. Andrew Ng)

 

課題の中でxは1899X1ですべての要素が0のベクトルに設定されているので、

word_indicesに含まれる番号のところのみ1で上書きしていきたいです。

 

例えば86番目は1だからx(86)=1で前後は0になるように

x(85)=0

x(86)=1

x(87)=0

としたいです。

 

Octaveの機能で

f:id:omoshiroamericanews:20191112122548p:plain

こういう風にできるので、86はword_indices(1)で表現できるので、

他の53の要素も同様にすれば、同じように86のような

VocabListの中のIndex番号がとれます。

 

f:id:omoshiroamericanews:20191112122806p:plain

こういうループを作ればいいと気づきました。

ループするのはword_indicesの長さ分ですね。

 

f:id:omoshiroamericanews:20191112122917p:plain

 

これでword_indicesに含まれる番号のところのみ1で上書きできるはずです!

 

実行しました。

f:id:omoshiroamericanews:20191112123159p:plain

 結果のxは1899X1なので部分ですが、左のようになりました。

1の数が知りたかったのでpos=find(x==1)で調べたことろ、右のようになりました。

 

f:id:omoshiroamericanews:20191112123353p:plain

数を調べて45でした。

 

f:id:omoshiroamericanews:20191112123502p:plain

問題文に45の1がある、と書いてあるのでぴったりです!

 

f:id:omoshiroamericanews:20191112123710p:plain

やった!ついに満点になりました!

 

長かった戦いよ、さらば!   (By キン肉マン)

 

って感じです。

 

テストは終わったんですが、まだ課題には続きがありました。

 

いざ、メールの分類を実践!

っていう内容ですね。

 

4000のTraining Set(=spamTrain.mat)でClassifieを作成して

1000のTest Set(=spanTest.mat)で精度検証したのちに

コースが用意したEmailでも自分のEmailでもいいから

実験してみなさいという内容です。 

 

4000のEmailのTraining Set(=spamTrain.mat)は

ご丁寧にすでにprocessEmailとemailFeatureで1899X1のベクトルに

加工されて、しかもSpanかNonSpanか区別された状態です。

 

4000のTraining Setはすでに1899X1のベクトルなので、

1899X4000に0,1が情報がついて1900X4000なのだろうか?

と思ってみてみました。

 

f:id:omoshiroamericanews:20191112181644p:plain

 

spamTrain.mat自体は1X1のベクトルで、

Structure FieldなるものでXとyに分けられるようですね。

 

f:id:omoshiroamericanews:20191112182418p:plain

 

 

Training Setの中身が分かったので、

ex6.spam.mの式をコピペして実行します。

 

f:id:omoshiroamericanews:20191112183130p:plain

error=99.850と結果がでました。

 

99.8%が正解なので合格と判断しました。

 

次はこのTrainng Setで決めたパラメーターを

Test Set(=spanTest.mat)で試してErrorをみます。

ここでErrorが多いとTraining SetにOverfitしすぎということですね。

 

f:id:omoshiroamericanews:20191112183130p:plain

errorは98.9%でした。正解は98.5%なので少しずれてます。。。

が前に進みます。

 

Top Predictor Spamはex6.spam通りで大丈夫でした。

 

自分のEmailで試してみて(Try your own Email)

とあったので、自分あてにきた部下のEmail↓

がきちんのNon spamに分類されるかどうか実験してみました。

 

f:id:omoshiroamericanews:20191112184948p:plain

 

プログラムの式です。

f:id:omoshiroamericanews:20191112185128p:plain

modelを決める式はさっきと同じなのでスキップしました。

本当はいれないと動かないと思います。

見事にspamではないと分類されました。

 

これでWeek7の課題は終了です。

 

日々の業務への応用

 

を考えると以下は欲しいですね。

 

 

日本語版を使いたい

1899X1のようなVocabListがネット上におちているのか?

processEmailの日本語版(LowerCaseにおとす、Stemmingなど)

FeatureEmailはVocabListとのひもづけ

 

理想はメールを読み込ませて、

①そのメールがどの案件に該当するかを分類、

②関連過去Eメールの抽出

③回答Eメール案の作成

ができてほしいです。

 

①も②も既存のメールソフトのフィルター機能で何とかなりそう。

③が一番難しいか。

①に応じた定型文呼び出しならできるかも、というところでしょうか。

 

Week6まで学んだことで考えるべきこと、やるべきこと

 

 

・メールは分解できたけど、SVMの精度をもっと知りたい。

 例)Neural Networkの問題をSVMで解く

 例)Email Spanの問題をNeural Networkで解いてSVMで解いた場合と   

   比較してどうなったかをみてみる、をやってみたい

 

ではまた次回頑張ります。