競馬
競馬予想AIできた。
ただ、1番人気の予想に勝つのは難しい。
競馬場のおっさんがいかに真剣なのか、人間の知恵がいかに偉大なのか思い知らされる。
下位3割を切ったがこれでいいのか。
ハイパーパラメータを理解したい。
季節を特徴量に入れたい。
調教も入れたい。
だけどこれでは1番人気予想に近づくだけなのではという疑問もある。
目標値を変えるべきなのか。
回収率に適した目標値はなんなのか。
特別な特徴量を組み込むべきなのか。
あと、嫁と子供が出ていく。
夢に子供が出てくる。
憂鬱である。
競馬とランニングとゴルフでしのぐ。
これからの人生が思いやられる。
ゼロから作るディープラーニング
区民プールで泳ぐようになる。
新しい本を買った。
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章
前処理を検証用テストデータにも適用してしまうと過度な汎化が起きる。(?
例えば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)