暇人日記

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

Coursera Machine Learning Week3 課題 2周目⑥ -苦闘記憶- Predictとloopシュミ履歴取り出し

今回はpredict.mに取り組みます。

 

f:id:omoshiroamericanews:20200129114455p:plain

 

前回の日記で予測は計算して値は0と1の間で狙い通りですが、

最終的には全て0か1になってほしいです。

 

予測計算結果↓

f:id:omoshiroamericanews:20200129114511p:plain

 

 

問題文を読むことにします↓

 

f:id:omoshiroamericanews:20200129114648p:plain

 

TEST1が45点でTEST2が85の生徒の合格確率は0.776になることを

確認しなさいとあります。

 

プログラム全体ex2.mには↓の箇所があり、

sigmoid([1 45 85] * theta)

これがTEST1が45点でTEST2が85点の生徒を示しています。

最初の1は足した1ですね。(↓の図のやつです)

thetaはfminuncで↓の通り計算されています↓

f:id:omoshiroamericanews:20200129114715p:plain

f:id:omoshiroamericanews:20200129114725p:plain

 

thetaがあるので計算してみました。

f:id:omoshiroamericanews:20200129114818p:plain

見事になりました!

 

続けて問題文を読むことにします↓

 

f:id:omoshiroamericanews:20200129114844p:plain

現在の予測値は0と1の間ですが、0か1にはなってないので、0か1にしなさいという課題です。

 

絵にすると↓

f:id:omoshiroamericanews:20200129114932p:plain

こういう風になってほしいということです。

1周目の時は分からなくてググりました。

1行で解ける解答が載ってました。

今回は問題文のヒント通り進んでみたいと思います。

 

f:id:omoshiroamericanews:20200129115020p:plain

If文を使えばいいのかなあと思ってプログラム詳細predict.mをみると↑

ほぼほぼ答えが書いてあるように思いました。

 

と思って,ほぼほぼコピペの

if sigmoid(X,theta)>=0.5

  predict1 

else

  predict 0

End

とするとErrorが出ました。

f:id:omoshiroamericanews:20200129115056p:plain

Predict1がまずかったようです。

 

前回,prediction=sigmoid(X,theta)で計算したので

f:id:omoshiroamericanews:20200129115127p:plain

if prediction >=0.5

  prediction=1

else

  predict tion=0

End

としました。

 

f:id:omoshiroamericanews:20200129115144p:plain

1X1のベクトルになってしまいました。。。

 

答えは100X1になるべきなので明らかな間違いです。

 

答えが1X1になってしまったことと

プログラム詳細predict.mに

p = zeros(m, 1);とあることで、

これはLoopして履歴取り出しかと思いました。

 

1から100のloopにして↓のように1つずつ0か1か判断する形ですね。

 

f:id:omoshiroamericanews:20200129115227p:plain

 

1つずつ判断するのに役立つのがこのFunctionです↓

 

f:id:omoshiroamericanews:20200129115243p:plain

prediction(1)=0で1行目を0に置き換えという意味になります。

predicton(2)=1or0,prediction(3)=1or0としていけばいいので、

 

prediction(i) >= 0.5なら

prediction(i)=1、でなければprediction(i)=0という風に

For I =1:m(=100)でループさせると1つずつ判断してくれます。

 

できました!

こういう風にすることができました!

 

f:id:omoshiroamericanews:20200129115430p:plain

ググった解答例は1行で解けてたのですごいなと思いました。

 

ところでこの予測はどれくらいの精度だったでしょうか?

 

Linear RegressionではJくらいしか目安がなく20憶より下がらなくて、

精度がいいか悪いかはわからないということを↓の日記で思ってました。

 

www.courseradaisuki.com

 

今回は0か1なので、かなりはっきりと予測精度を%で示すことができます。

つまり100個のうち、何個当たっているのかがわかるからです。

 

それではこれを計算していきたいと思います。

 

この計算はWeek7の課題の時に使ったものが役に立ちます↓

Coursera Machine Learning Week7 課題 苦闘日記② - 暇人日記

 

f:id:omoshiroamericanews:20200129152422p:plain

 

この式で誤差率が計算できる優れものです!

 

f:id:omoshiroamericanews:20200129152531p:plain


応用してこの式を正答率に変えます!

~を=に変えます。

 

実行しました↓

f:id:omoshiroamericanews:20200129152554p:plain

0.89なので正答率89%です。

 

この正答率89%を別の方法で検証したいと思います。

 

まずpとyを並べてみます

A=[p y]として

f:id:omoshiroamericanews:20200129152712p:plain

そこそこあっているのがわかります。

 

それでは異なっている個数を知りたいので’p-y’をしたいと思います。

これで同じものは0で、異なるものは-1か1です

B=p-yとして

 

f:id:omoshiroamericanews:20200129152752p:plain

 

このまま足すと-1と1が入り乱れて足し算の結果が意味をなさなくなるので、

2乗することで-1も1に変換します。

そうすると足し算の結果は間違えた個数になります。

c=sum((p-y).^2)

として計算すると

f:id:omoshiroamericanews:20200129152820p:plain

 

となりました。

100個中11個が間違いということは89個が正解なので

89%の正答率でさっきの式と答えが一致しました!

 

今回はここまでです。また次回頑張ります!