離婚後の日記

離婚した。

競馬

競馬予想AIできた。

ただ、1番人気の予想に勝つのは難しい。

競馬場のおっさんがいかに真剣なのか、人間の知恵がいかに偉大なのか思い知らされる。

 

下位3割を切ったがこれでいいのか。

ハイパーパラメータを理解したい。

季節を特徴量に入れたい。

調教も入れたい。

だけどこれでは1番人気予想に近づくだけなのではという疑問もある。

目標値を変えるべきなのか。

回収率に適した目標値はなんなのか。

特別な特徴量を組み込むべきなのか。

 

あと、嫁と子供が出ていく。

夢に子供が出てくる。

憂鬱である。

競馬とランニングとゴルフでしのぐ。

 

これからの人生が思いやられる。

今やっていること

星がついたので久しぶりに書く。

 

怠けていた。

在宅勤務は勉強するのに最適だ。

平日は毎朝5km走る。

今は競馬の機械学習に挑戦。

まだデータの前処理中。

でも結局3次元のデータフレームにしなきゃいけないのか、それがわからん。

また目標を見失うかも。

 

週末はゴルフ練習、年内目標100切り。

ただし、youtube見過ぎて何がいいのかさっぱり。

練習するほど意味不明、五里霧中、スイングが崩れてくような、毎回違うことをしているような。

 

あと大会が復活すればフルマラソントライアスロン挑戦。

子供も少しはしゃべるようになってきた。皆がんばれ。

 

ゼロから作るディープラーニング

区民プールで泳ぐようになる。

新しい本を買った。

 

3章 ニューラルネットワーク

np.exp(a)

e(ネイピア数)のa乗

ソフトマックス関数

np.exp(a)/np.sum(np.exp(a))

 

ソフトマックス関数を使う出力は総和が1であり確率的な分類ができる。

7章 テキストデータの処理

7章

コードにわからない部分が多い。導入も苦労した。

 

・BOW(bag of  words)

1-トークン分割

スぺースや句読点で句切り、細かい単位(単語…)にする。

2-ボキャブラリ構築

ボキャブラリとして整理し番号をつける。

3-エンコード

個々の文章に現れる回数を数える。

 

・CountVectorizer

トークン分割とボキャブラリの構築を行う。

from sklearn.feature_extraction.text import CountVectorizer
vect=CountVectorizer()
vect.fit(bards_words)

print(f"Vocabulary size:{len(vect.vocabulary_)}")
print(f"Vocabulary content:{vect.vocabulary_}")

 

bag_of_words =vect.transform(bards_words)
print(f"bag_of_words:{repr(bag_of_words)}")

#単語それぞれを特徴量とした疎行列ができる。

 

・min_df=N

vect =CountVectorizer(min_df=N).fit(text_train)

N回以上の出現率のみの単語でボキャブリを構築できる。

 

・stop words

あらかじめ定められた頻出単語を省略できる。

from sklearn.feature_extraction.text import ENGLISH_STOP_WORDS

 

・tf-idf

全文書の頻出単語を別として特定の文章にのみ頻出する単語に重みを与える前処理。

from sklearn.feature_extraction.text import TfidfVectorizer

 

・ngram_range

単語の組み合わせ数を指定する。

cv=CountVectorizer(ngram_range=(1,1)).fit(bards_words)

#ngram_range=(n,N) n以上N以下の連続した単語組み合わせを指定する。

 

・語幹処理(stemming)、見出し語(lemma)

単複、時制などの語尾変化対応として、特定の単語末尾を取り除くのが語幹処理(stemming)、文章での役割を考慮するのが見出し語(lemma)。

この前処理は正規化の一種である。

 

※7.8から入力で躓く。ここで終わりでもいいか?

6章 アルゴリズムチェーンとパイプライン

間が空いてしまって色々忘れる。

継続しなければならない。

 

6章

f:id:jahjha:20190504162736j:plain

前処理を検証用テストデータにも適用してしまうと過度な汎化が起きる。(?

例えばMinMaxを全データにかけてしまうと、汎化能力が上がる(場合もある)が

実際にはテストデータは未知なものであり、訓練データの最小最大を越えることだってあり得る。

その意味で前処理は訓練データのみに適用し.fitしなければならない。

 

・Pipeline

便利。今までやってきたことはこれで省略化できる。

from sklearn.pipeline import Pipeline

pipe=Pipeline([("scaler",MinMaxScaler()),("svm",SVC())])

"scaler"のインスタンス、"svm"のインスタンスを作成し順次処理していく。

このインスタンスは2つに限られるわけではない。

(6.4汎用パイプラインインターフェイスに詳しいがよくわからん。たぶん意味はあってる)

・make_pipeline

インスタンスに名前をつけるのが面倒なのでこれもイケる。

from sklearn.pipeline import make_pipeline
pipe_long =Pipeline([("scaler",MinMaxScaler()),("svm",SVC(C=100))])
pipe_short=make_pipeline(MinMaxScaler(),SVC(C=100))

#pipe_longとpipe_shortは全く同じ動作を行う。make_pipeline作成時、各インスタンスは全小文字に自動命名される。

 

6.5グリッドサーチ

以下例でグリッドサーチできる。

pipe=make_pipeline(StandardScaler(),PolynomialFeatures(),Ridge())

param_grid={"polynomialfeatures__degree":[1,2,3],"ridge__alpha":[0.001,0.01,0.1,1,10,100]}

#XXX__YYY __はアンダーバー2つ

grid =GridSearchCV(pipe,param_grid=param_grid,cv=5,n_jobs=-1)
grid.fit(X_train,y_train)

 

6.6モデル選択のグリッドサーチ

以下例でモデル選択のグリッドサーチもできる。

(もう少し例が欲しい。これでRFのほうが良ければ結果にRFが出てくる?それを見てもう一度Pipeでセットするということか?)

pipe=Pipeline([("preprocessing",StandardScaler()),("classifier",SVC())])

param_grid =[
{"classifier":[SVC()],"preprocessing":[StandardScaler(),None],
"classifier__gamma":[0.001,0.01,0.1,1,10,100],
"classifier__C":[0.001,0.01,0.1,1,10,100]},
{"classifier":[RandomForestClassifier(n_estimators=100)],
"preprocessing":[None],"classifier__max_features":[1,2,3]}
]

#RFは前処理がいらないので"preprocessing"は[None]。

 

grid = GridSearchCV(pipe,param_grid,cv=5)
grid.fit(X_train,y_train)

 # ↓結果↓
Best params:
{'classifier': SVC(C=10, cache_size=200, class_weight=None, coef0=0.0,
  decision_function_shape=None, degree=3, gamma=0.01, kernel='rbf',
  max_iter=-1, probability=False, random_state=None, shrinking=True,
  tol=0.001, verbose=False), 'classifier__C': 10, 'classifier__gamma': 0.01, 'preprocessing': StandardScaler(copy=True, with_mean=True, with_std=True)}
Best cross-validattion score:0.9859154929577465
Test set score:0.9790209790209791

5.3.2.6受信者動作特性(ROC)とAUC

(30m)12:00~12:30

5.3.2.6受信者動作特性(ROC)とAUC

 

ROCカーブ:

全てのスレッショルドを考慮して偽陽性率(FPR)と真陽性率(TPR)をプロットする。

FPR=FP/FP+TN(偽陽性を全ての陰性で割る)

AUC:

カーブ下の領域を呼ぶ。ROCの場合は0~1の範囲に収まり高いほうが良い。

from sklearn.metrics import roc_auc_score