エントロピー データ集合Dの乱雑さ
データの前処理の1つにデータがどういうものか知るというのがあると思います。
データの乱雑さを表す尺度としてエントロピーを用いる方法があるとありました。
計算式は以下です。
エントロピーE(D)、
として、
E(D) =
とありました。
『エントロピーE(D)の値はP+=1またはP-=1のとき最小値0となる』とあります。
p+=1はデータのうち正例が100%かつ負例が0%なので
乱雑ではないという意味だと思いました。
p-=1はデータのうち正例が0%かつ負例が100%なので
乱雑ではないという意味だと思いました。
『P+=P-=0.5のとき最大値1となる』とあります。
P+=P-=0.5は正例も負例も50%ずつでそのとき乱雑さは最大という意味だと思いました。
この前のSignateの課題のように正例1%、負例99%の場合を考えてみます。
計算結果は0.08でした。
0に近いのでデータの乱雑さという尺度ではデータは整っている(同じクラスのものが大半を占めている)といえるということだったんだと思いました。
この尺度は役に立つような、立たないような、というのが正直な感想です。
0.5より下だったら○○する、0.5より上だったらXXするというような
運用の指標がないと宝の持ち腐れになりそうだと思いました。
本を読み進めると
「データの乱雑さを不純度=impurityと定義すると、エントロピー以外にもいくつかあります。
ジニ不純度(Gini impurity)が代表例です、とありました。」
また興味深いテーマを見つけたら書いていきます。
初心者コンテストに挑戦 振り返り
それでは振り返ってみたいと思います。
まず合格点は86点でしたが、57点が最高点でした。
提出した値がどう評価されたかはわからないので、
Training Setの精度を考えてみたいと思います。
精度が95%以上出なかった。
Neural Networkの場合
5000の教師データは1が349個で0が4651個でした。
良く起きたのは、Neural Networkの予測値が全部0になりました。
全部0でも4651/5000が当たるので精度93%の予測に見えます。
1の数は349個近辺になってほしいのですが100前後しか出ていません。
そこでMaxIterを増やしました↓
それでも1が300個近辺にはなりませんでした。
すでに過学習か?
計算時間が長いので、27100のデータの内5000を検証していました。
5000のデータに対して95%の精度の出る予測は
全体のデータ、つまり27100に対してどういう精度になるのかを
検証したのが↓の表です。
精度が91%になりました。
5000のデータで95%の精度は低いと思っていたのですが、
それを全体に当てはめるとさらに低いことになります。
27100のデータは1が2112個で0が24988個です。
全部が0の予測で92.2%なので精度91%は相当低いです。
今後の課題
a.5000のサンプルで精度98%が出るようにする
b.過学習をどう考えるか?
aについてはinput,hidden,outputの3層でやっていたNeural Networkを4層に変えてみたいと思います。
Logistic Regressionの場合
全ての予測が93%前後でした。
やってるときは気づかなったのですが、
全部が0の予測で92.2%なので精度91%は相当低いです。
なので精度93%もかなり低いということになります。
精度が95%以上出せなかったことが全て
だという気がします。
もしかすると1の割合が10%のデータというのは特殊であって、
それが影響しているのかもしれませんが、
まずは5000のサンプルで過学習であれ何であれ
95%以上の精度を出すことにトライしてみたいと思います。
初心者コンテストに挑戦⑦Neural Networkでやってみる
年齢を10代、20代、30代として計算してみました。
精度は93-4%です。
年齢を10代、20代とせずに19,25,28などでやっていた予測と
同条件で比較します。
そんなに変わりません。
年齢をカテゴライズしてもあまり予測精度には差が出ないことがわかりました。
次回に今回の挑戦結果をサマリーしてみたいと思います。
初心者コンテストに挑戦⑥Neural Networkでやってみる
Predictionを計算する式が間違えていました。
修正してλとMaxIterを色々なパターンを試しました↓
5000のSampleで実験しました。
λ | MAXIter | 精度 | J |
10 | 10 | 0.9334 | 2.6894 |
1 | 10 | 0.9252 | 2.6044 |
0.1 | 10 | 0.9252 | 3.0549 |
0.01 | 10 | 0.9322 | 2.4036 |
0.001 | 10 | 0.9252 | 3.0739 |
10 | 50 | 0.9330 | 0.933 |
1 | 50 | 0.9344 | 3.4642 |
0.1 | 50 | 0.9370 | 2.9355 |
0.01 | 50 | 0.9370 | 3.1537 |
0.001 | 50 | 0.9364 | 2.8976 |
0.01 | 400 | 0.9510 | 2.371 |
0.01 | 1000 | 0.948 | 2.8063 |
0.01 | 5000 | 0.9504 | 2.8373 |
95%くらいの精度が限界です。
x1 X θ1 + x2 X θ2+・・・・+x16 X θ16 の式の Logistic Regressionの
精度と同じくらいです。
要素を見直してみようと思います。
年齢を10代、20代、というようにしてみようと思います。
また次回頑張ります。
初心者コンテストに挑戦⑤Neural Networkでやってみる
前回とは方法を変えてNeural Networkでやってみたいと思います。
階層はこのようにしてみました↓
λ=1、MaxIter=250で行ったところ、計算負荷が大きいのか
3時間たっても計算が終了しません。。。。
計算負荷をさげるためにHidden Layerを25から10に変えます↓
そしてλ=1、MaxIter=50としました。
計算が2時間で終わりました。
が、
精度が7.8%しかないようですorz
MaxIterが50だと少なすぎなんでしょうか。。
MaxIterが400にしてみました。
1600に開始しましたが7時間経過の2300でも計算終わりません。。。
どうしよう。。。
とりあえず計算を回し続けることにします。
初心者コンテストに挑戦④Cross Validationする
前回はTraining Set 27100に対して精度92%の最適θをTest setにあてはめて
提出したところ、85点が合格のところ56点でした。
理由は2つ考えられると思います。
①27100のTraining Set全部に対してだったのでoverfitのかもしれません。
②もしくは精度92%が低すぎるのかもしれません。
①は↓の日記で検証したことがあります。
27100を20000と7000のデータに分けます。
20000で最適θを作って、7000のデータに適用しても精度がでるかどうか検証します。
↓のようなグラフをlearning Curveを作ってoverfitしてるかどうか見てみたいです。
と思って実行してみましたが
for i = 1 :m
でmが20000のためloopが終わりません。。。
なので
for i = 1:5
でミニ実験してみました。
しかしErrorが出ました↓
調べてみたところ、
どうも、掛け算の要素に『無限』が入っていることが原因でError値に
なっていることがわかりました。
グラフは作れそうにないです。
ただ、20000の精度と20000の最適θ7100に当てはめた予測精度は分かります。
20000の精度は92,995%で、20000の最適θを7100に当てはめたときの
精度は92,790%でした。
Overfitしているのであれば、
20000の精度が99%で7100の精度が80%というパターンだと思うので、
Overfitしていないと判断しました。
>②もしくは精度92%が低すぎるのかもしれません。
理由は②な気がします。
λ=1で92.995%なので、λを調整して精度が上がるかどうか見てみます。
λを0.001~10まで変更してみました。fminuncのMaxIterも変更して精度上げに
トライしました↓
93%近辺から精度が上がらないです。
λはoverfit/underfitしすぎたときの調整弁の役割を果たしていると
Courseraで学びました。
λを0.001にしてもthetaの大きさを相殺できずにunderfitの状態なのかもしれないと
思ったのでthetaを確認してみました。
見た限り普通ですが、桁数に大きな差があるのが気になります。
Courseraで予測の基要素の桁数/規模を合わせるためのfeatureNormalizeという
方法を学びました。
一度featureNormalizeして、λを調整してみようと思いました。
λをどの値の幅にした方がいいかとう経験値はfeatureNormalizeした
ベースで養った方がいいとも思いました。
FeatureNormalizeについての日記はこちらです↓
featureNormalizeしたのでXが↓のようにすべての値が0近辺に集結しています。
original dataは↓のなので2行目の年齢などは、0近辺に集結していることがわかります。
これで予測したθが↓です。
前回のものに比べるとθの値の桁数が近づいています。
さっきと同じようにλの値を調整して精度をみてみます。
精度は今までと同じ93%前後ですね。
FeatureNormalizeした目的は、Jのλのパートの調整でした。
λの調整をすれば最適θが変化して、Jが小さくなるはずなので
それが狙いでした。
が、Jは変わっていません。
なので精度が93%前後で落ち着いているだと思います。
試しにλ=0.001の精度93%で提出したところ、56点でした。93%の精度だと56点のようです。
Polynomial化して予測精度を上げる方法と
Neural Networkで予測精度を上げる方法と
関係なさそうな変数をとる方法があると思います。
今回はここまでです。また次回頑張ります。
初心者コンテストに挑戦③ Octaveで計算
前回、予測の基データをOctaveに読み込ませるところまでやりました。
なので今回はその基データで予測を行ってみたいと思います。
予測方法はCourseraのMachine Learning講座のWeek3と同じ方法を踏襲しました↓
これで最適θが出るので、そうしたら予測して精度を↓の式で見てみたいと思います
やってみました↓ 精度は92.9%ですね。
これは27,100のデータすべてを予測対象にしたものになります。
Overfitしているかもしれないので、Cross Validationする必要があるはずです。
ただ、この最適θを『theta27100』と名付けて結果が不明になっているtestデータを
予測してみたいと思います。
やってみたらだめでした。
trainデータは27100X18(y込み)の基データで文字を数字に置き換えて
27100X38(y込み)でした。
なので最適θ『theta27100』は38X1でした。
testデータは18050X17の基データで文字を数字に置き換えて
18050X38でした。yは入っていないので、testデータはtrainデータより1行多いです。
最適θは38X1のベクトルだったので、
次元が合わず計算不可という結果が出てしまいました。
trainデータに1行追加して27100X39(y込み)にして、
最適θを39X1にしてtestデータの18050X38に計算できるようにします。
計算が終わったので投稿してみます。
0.85が合格のところを0.56でした。
今回はここまでです。
次回はCross Validationすることとλの調整をすることを行いたいと思います。
Neural Networkを使うとさらに精度が上がるかもしれませんが、
とりあえずWeek3の解き方の中で調整を行います。
初心者コンテストに挑戦② 前処理 欠損値の確認と文字を数字へ振り替え
前回の続きです。
まずは
①trainデータをJupyterで読みこんで欠損値がないかどうか確認します。
Octaveではsize(train)の関数でしたが、Jupyterでは↓になります。
27100 X 18 になっています。
describe関数で基礎統計量を確認しました↓
9つ出ています。
数で表現できるものが表示されていると思います。
countが27100なので欠損がないと思います。
データの型を確認したいと思います。
Jupyterでは train.info() で関数します。
objectは文字でした。Intは整数です。
欠損値の数を確認できる関数
を使ってダブルチェックします。
合計が0なので欠損値はありません。
違う関数でダブルチェックします。
Trueだと欠損値がありますが、全てFalseなので欠損値がありません。
②数で表現できないデータを数字に振り替えてみたいと思います。
まず職業が何通りで登録されているのかをみます↓
blue-collarは1、managementは2、・・・というように割り振ろうと思ったのですが、
もっといい手がみつかりました。
getdummiesという関数を使うと↓のように0、1になります↓
↓のようにすると基データに追加することができます。
こちらを全データに展開しました↓
monthとdayは省きました。年がないと意味がないと思いましたので。
結果、27100X18だったものが27100X38になりました↓
OctaveにこのtrainCを読み込ませたいのでcsvファイルに転換します↓
無事にできました↓
Octaveに読み込ませます↓
27100X38のデータ量なので読み込むのにすごい時間がかかりました。。。。
読み込めるところまできたんで、
次回はLogistic Regressionに取り組みます!
初心者コンテストに挑戦①
SignateさんのBeginnerコンテストに挑戦してみます↓
私はPythonはUdemyさんのコースだけの勉強であまりわかっていないので、
CourseraのOctaveで解くことになります。
目的は定期預金キャンペーンに入ったか否かなのでlogistic Regressionの問題です。
要素16個を基に予測する形式です。
CourseraのWeek3 での解き方、つまり
x1 X θ1 + x2 X θ2+・・・・+x16 X θ16
のような式を作成したいと思います。
と思いましたが、16の要素の中には数で表現できないものが入っています。
なので数で表現できないデータの取り扱い方を考えたいと思います。
2.職業
—>対応策 例)1=サラリーマン/ 2=自営業のように番号を振ってみる
3.婚姻状態
1=既婚、2=未婚 と番号を振ってみる
4.最終学歴
1=高卒、2=大卒と番号を振ってみる
5.破産経験の有無
1=有り、2=無しと番号を振ってみる
7.住宅ローン
1=有り、2=無しと番号を振ってみる
8.借金
1=有り、2=無しと番号を振ってみる
9.連絡方法
—>対応策 例)1=電話/ 2=Eメール
数で表現できないものの取り扱い方を1通り考えました。
数で表現できるものも見たいと思います。
1.年齢 -->そのままの数で扱うか、21-30/31-40/41-50のように幅として扱うか選択がある
6.年間平均残高
10.最終接触日
11.最終接触月
10と11はセットにして11月22日とかなるのですが、
年がないと統一した基準にならない気がします。
12.最終接触時間(秒)
13.現キャンペーンにおける接触回数
14.経過日数:前キャンペーン接触後の日数
16.前回のキャンペーンの成果
1回データを見てみたので、今後の作業工程を考えてみたいと思います。
<データの前処理>
①データをJupyterで読み込んで欠損値があるかどうか確認
②数で表現できないデータを数字に割り振る変更をJupyterで行う
※できるかどうかわからない
③②で加工したデータをOctaveで読み込む
④x1 X θ1 + x2 X θ2+・・・・+x16 X θ16 の式で
Logistic Regressionを行う
⑤Trainデータは27000あるので、データを2分割して
20000で最適θを探し、7000でCross Validationする
で進めてみたいと思います
今回はここまでです。また次回頑張ります。
東京都コロナ感染者数の予測線がFitしないのはアルゴリズムのせいか要素のせいか
前回の日記までコーセラで学んだNeural Networkで予測を行ったところ、
イマイチということが続いていました。
今回はNeural Networkというアルゴリズムが悪いのか、
それとも人出指数の要素が悪いのか、を検証してみたいと思います。
検証の方法はいたって簡単です。
Neural Networkを使いながら要素を変更します。
人出指数は↓のようなもので、
精度が↓でした。
Training Setの期間のFitがイマイチなんで、要素を変更して同期間でみてみたいと思います。
要素は人出指数ではなく神奈川と埼玉の感染者数を使います。
前回の日記で使ったのですが中々のフィット感でした。
このときの精度はなかなかに見えます↓
神奈川と埼玉の感染者数を要素とするのは将来のコロナ感染者数を
予測するには使えません。
例えば1か月後の6/30の神奈川と埼玉の感染者数は分からないので、
予測としては使えないと思います、
しかし今回はNeural Networkのフィット感が悪い理由を要素なのかどうか知りたいので
やってみます。
神奈川県埼玉県の要素でフィット感が良くなれば、Neural Network は悪くなく人手指数が不十分ということになると思います。
神奈川県と埼玉県の感染者数を基に東京都の感染者数を予測したのが
こちらです↓
※数字は7日間平均です。
かなりTraining Set期間のFit感がいい感じです。
ここまでフィット感があれば人出指数が不十分という風に思いました!
初心者のコロナ予測追加改良!? コーセラのNeural Networkをベースに予測
前回の日記でコロナ予測を人出指数なるものを作成して、
NeuralNetworkに放り込んで予測してみました。
この時はTraining set期間の3/11-4/22の累計精度はほぼ100%ですが、
その予測線を4/23-5/5でみるとどう見ても当たってなさそう・・・
というものでした↓
この時に考えたこうなった原因は、3/11-->5/4の期間で
人出指数は減少していき、コロナ感染者数は逆に増えていくので、
反比例の関係を成立させるパラメーターはないんだろうなと思いました。
人出指標とコロナ感染者数の数字↓
対処法としてはもう1つもう2つ特徴量を増やすしかないので、
1つアイデアが出ました。
人出指標は2週間前の人出の影響を受けるということにしましたが、
何週間前の人出の影響を受けていそうかも
Neural Networkに重みづけしてもらおうと思いました。
こういう感じです↓
そして人出指数もコロナ感染者数も過去7日間平均にしてみます。
具体的な数字です↓
予測してみました↓
前回とおなじような傾向です。。。
4/22までのTraining Setの精度は良いんですけど延伸した部分がダメ、
というのは前回と同じですね。
データ数が少ないのが原因かもしれないと考えたので、
前回は5/3までのデータでしたが次は5/15までのデータでやってみます。
3/11-5/3をTraining Setとして予測してみました↓
同じような傾向です。
5/3までの累計数は青線と赤棒グラフの累計はほぼ同じです。
しかし、前回より下手すると青の予測線の5/4以降の精度は悪そうに見えます。
一度5/15まで全ての期間の精度を求めに行ったときに青線が
どれくらいFitするか見てみたいと思います。
予測してみました↓
3/11-5/15の累計新規感染者は赤棒で4835人で、
青の予測線の累計は4815人です。
累計では精度が出てますが5/3-5/15の期間の青線と赤棒グラフは
大きく外れているといえます。
一度、機械学習がうまくいくかどうか判断するために
Train ErrorとTest ErrorをみてOverfitかUnderfitかを決めて、
改良策を考えたいと思います。
今回行ったことで分かったのは累計の精度はでているが、
日別の精度が出ていないため、将来機関の予測が外れているということ
だと思います。
Neural NetworkよりLinear Regressionの方が精度がいいのかもしれません。
次回トライしてみます!
Jupyter 型問題
度々ひっかかる『型問題』(多分、型問題のはず!?笑)
解決できるよう悪戦苦闘してみます!
とあるものを予測してpredと名付けました↓
これをグラフにしようとしました↓
でました!『AttributeError』です!
ひらたくいうとJupyterにはデータに『型』と呼ばれるものがあり、『型』とあった関数しか使えないというようなイメージらしいです。。。
『型』は数字、文字列、???とあるようです。
さて、まずはplotできるように頑張ります!
yだと、↓のようにグラフ化できました。
predのデータです↓
yのデータです↓
『型』を調べるにはtype関数がいいとネットにあったので
やってみました↓
ダメでした。
ただ、yは『Series』という型のようです。
predは『numpy.ndarray』という型(?)のようです。
『Series』をググったらpandasのデータの型のようです。
plot関数もpandasでしか使えない関数かもしれません。
ということは『numpy.ndarray』を『Series』に変えれたらいいなと思います。
ググったらでました!こうです↓
ということはグラフにできるはず。できました!
これで10時間くらいは悩んでたのでうれしい限りです!
Jupyterで行列を作る
Jupyterで作りたい行列は3X1の
A=
1
2
3
のような縦の行列です。
Octaveでは↓のように作っていました。
Jupyterにあてはめます↓ ダメでした。
まず、行列を作るのが[]なのかどうか確認します。
[]で作るのは同じようです。
1,2,3とカンマで区切ったら縦になるかと思って試してみました↓
横になりました。
Octaveでは横は↓でした。
横を作る時のJupyterとOctaveの違い
Jupyterは[1,2,3]でカンマ区切りで、
Octaveは[1 2 3]でスペース区切りですね。
さてもともとの縦行列作成に戻ります。
:で区切ってみました↓ ダメです。
見た目通りにしました↓ ダメです。
ググりました、できました!
3X1行列の作り方
Aの中が数字かなと思ってdescribe関数とinfo関数をしましたがエラーでした↓
SizeはOKでした。
掛け算をすると動くので数字で認識されていそうです。
もっと簡単にできないかなと思ってnp.arrayを外してみました↓
だめでした。
nxn行列も作れる
ことがわかりました↓
うまく3X1の行列を作ることができましたので
今回はここまでです!
アップデート コーセラ機械学習で学んだ線形回帰でコロナ感染者数を予測してみる(5/5時点)
2週間前に書いたこの日記の情報をアップデートしたいと思います。
曲線予測をした際に
5月6日までまったら、データを
①3月18日-4月7日、②4月8日-22日、③4月23日-5月6日
①②をTraining Setで③をTest Setで検証してみたいと思いました。
と書きましたのでアップデートしてみます。
①②のTraning Setの絵姿は↓のように見えています。
赤線が実績の累計感染者数で青線が予測です。
この青線と赤線を延長、4/23以降に適用したものが↓です。
予測線の方が高く出る結果となっています。
これでは予測として使えそうにないですorz
次の一手をどうすればいいかわかるためにLeraning Curveを見てみます。
となので、OverfitかUnderfitかみてみます。
ちょっとグラフの軸を変えてみます。
これでも分からないので実数を見てみることにしました↓
2000と200,000くらいの差ですね。
これがoverfitかunderfitか判断するのは場数を踏まないと分からないですね。
ここではunderfitとしたいと思います。
とすると解決策はadding featureなので、日にちと感染者数以外の要素を
足すのが有効ということになります。
また考えてみます!