離婚後の日記

離婚した。

5章 モデルの改良と評価 5.1交差検証

(60m)07:00~08:00

5.1 交差検証

k分割交差検証:KFold

データを分割し、訓練とテストに振り分け評価を繰り返す。

例:①~⑤に分割→①をテスト残りを訓練→②をテスト残りを訓練→繰り返し

 

層化k分割交差検証:StratifiedKFold

ターゲットの分類が均一だとただの分割では評価できない。

例:iris label を3分割すると答えは均一になり学習できない。

Iris labels:
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2]

 

KFold分類器:

kfold= KFold(n_splits=X)

をcvで渡す。

cross_val_score(logreg,iris.data,iris.target,cv=kfold)

 

1つ抜き交差検証:

テストサンプルを1つだけにして繰り返す。

LeaveOneoutをcvとして渡す。

from sklearn.model_selection import LeaveOneOut
loo =LeaveOneOut()
scores=cross_val_score(logreg,iris.data,iris.target,cv=loo)

 

シャッフル分割交差検証:

train_size個を訓練として選び、test_size個をテストとして選び、n_iter回繰り返す。

ShuffleSplitをcvで渡す。

from sklearn.model_selection import ShuffleSplit
shuffle_split=ShuffleSplit(test_size=.5,train_size=.5,n_splits=10)

# 割合でもできる。この場合は0.5=50%
scores=cross_val_score(logreg,iris.data,iris.target,cv=shuffle_split)

 

グループ付き交差検証:GroupKFold

グループを設定し、グループ内では分割がかからないようにする。

groupsを設定。GroupKFoldをcvで渡す。

from sklearn.model_selection import GroupKFold

X,y =make_blobs(n_samples=12,random_state=0)
groups=[0,0,0,1,1,1,1,2,2,3,3,3]
scores=cross_val_score(logreg,X,y,groups,cv=GroupKFold(n_splits=3))

 

基本的には以下3つを試そう。
k分割交差検証:KFold
層化k分割交差検証:StratifiedKFold
グループ付き交差検証:GroupKFold

 

わからん

R2スコア0~1

POSIX時刻=UNIX時間

テストデータは訓練データよりPOSIX時刻が後である。決定木は訓練セットの外まで外挿できない。

 

#interaction_only=Trueで各要素が交互作用のみ?

poly_transformer=PolynomialFeatures(degree=2,interaction_only=True,include_bias=False)

 

# %ってなんやねん。文字を縛る?

plt.xticks(range(0,len(X),8),xticks.strftime("%a %m-%d"),rotation=90,ha="left")

hour=["%02d:00"% i for i in range(0,24,3)]

 

#coefってなんや。係数0を消すのもよくわからん。

coef_nonzero=lr.coef_[lr.coef_ !=0]

4.6 専門家知識の利用

(60m)16:30~17:30

4.6

自転車レンタルを例に総合。

ランダムフォレストでの推測

時間要素を追加

[0],[3],[6],...

#[0時],[3時]...

曜日要素を追加

X_hour_week=np.hstack([citibike.index.dayofweek.values.reshape(-1,1),citibike.index.hour.values.reshape(-1,1)])

[ 5, 0],
[ 5, 3],
[ 5, 6],
[ 5, 9],...

#[土曜,0時],[土曜,3時]...

線形モデルで解析

線形で解釈できない部分をワンホットエンコーダーで変換

enc=OneHotEncoder()
X_hour_week_onehot=enc.fit_transform(X_hour_week).toarray()

[ 0., 0., 0., 0., 0., 1., 0., 1., 0., 0., 0., 0., 0.,
0., 0.],
[ 0., 0., 0., 0., 0., 1., 0., 0., 1., 0., 0., 0., 0.,
0., 0.],
[ 0., 0., 0., 0., 0., 1., 0., 0., 0., 1., 0., 0., 0.,
0., 0.],...

#各項目をダミー[月,火,水,木,金,土,日,0,3,6,9,12,15,18,21]

 

交互作用特徴量で曜日かける時刻を作成

from sklearn.preprocessing import PolynomialFeatures
poly_transformer=PolynomialFeatures(degree=2,interaction_only=True,include_bias=False)
X_hour_week_onehot_poly=poly_transformer.fit_transform(X_hour_week_onehot)

Ridge

線形とランダムフォレストが同等に。

 

ここできちんと復習しよう。

いろいろと打ち込んでいるだけなので。

4.4単変量非線形変換~4.5自動特徴量変換

(60m)05:30~06:30

 

4.4

乗数の変換が有用であったように、log,sin,cosの変換も有用である(前回同様場合による)

(???)

ほとんどのモデルは「ガウス分布」に従っているときに最もうまく機能する。

つまり見慣れた「ベルカーブ」になる場合である。

確率的な立場からは「ポワソン分布」「ポワソン回帰」を使ったほうが良い。

 

4.5

特徴量の追加は過剰適合も引き起こす。特徴量を減らして汎化性能を上げるのもあり。

方法は3つ。単変量統計、モデルベース選択、反復選択。

 

4.5.1 単変量統計

分散分析。個々の特徴量との関係から取捨選択。相互関係は無視されてしまう。

特徴量が多すぎる場合や多くの特徴量が全く関係ないと思われるような場合に有用である。

 

4.5.2 モデルベース選択

L1ペナルティを用いた線形モデルに似てる。

あるモデルを用いて特徴量を選択する。選択モデルと学習モデルは違っても構わない(選択モデル:決定木 学習モデル:ロジ 等)

 

4.5.3 反復選択

0から1つずつ特徴量を加えていき基準を満たすモデルをつくる、もしくは全てを含む特徴量から1つずつ減らしていき基準を満たすモデルをつくる。

再帰的特徴量削減(RFE):すべての特徴量からモデルをつくり、そのモデルで最も重要度が低い特徴量を削除する。これを事前に定めた数になるまで繰り返す。

 

自動特徴量選択は
・どの特徴量が必要か判断できない場合
・予測を高速化したい
・解釈しやすいモデルを構築したい(特徴量を減らす)
などの際に有用であるが、実世界で性能が大幅に向上することはあまりない。
#調べること:「ガウス分布」「ベルカーブ」「ポワソン分布」

4.3 交互作用と多項式

(60m)13:00~14:00

 

ビニング毎の傾き:

binsはダミーして0or1状態なので

X_product=np.hstack([X_binned,X*X_binned])で

bin + bin*特徴量を作ると傾きも出る。

 

Plynomial Features:

(degree=X)に応じて特徴量を拡張する。

どのような拡張したかは

poly.get_feature_names()で確認。

二乗していったり特徴量をかけ合わせたり。

多項式化は1次元のデータに対し有用であるが
複雑なモデル(SVR・・・)などを使えば特徴量の拡張を行わずとも
同様の結果を導き出せる。

RidgeとRandomForesstRegressorとの比較でも明らかで

①特徴量を拡張しないRidge

②特徴量を拡張したRidge

③特徴量を拡張しないrf

④特徴量を拡張したrf

スコアは以下である。

③>④>②>①

(rfでは特徴量を拡張すると性能が下がる)

多項式化は単純な線形モデルに対して有用である。

 

4.2 ビニング

(60m)08:30~09:30

4.2 ビニング(決定木、線形モデル)

 

ビニング(離散化):データを分割する。

bins=np.linspace(-3,3,11)

bins:[-3. -2.4 -1.8 -1.2 -0.6 0. 0.6 1.2 1.8 2.4 3. ]

#10個のビン(離散化)ができた

 

#これをワンホットエンコダー(ダミー)する。

from sklearn.preprocessing import OneHotEncoder
encoder=OneHotEncoder(sparse=False)
encoder.fit(which_bin)
X_binned=encoder.transform(which_bin)

 

[[ 0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]

[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]

[ 0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]

[ 0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]

[ 0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]]…



ビニングされた特徴量を学習させると
決定木:柔軟性が低下する。(必要がない)
線形モデル:柔軟性が上がる。(それぞれのビンで線形化するので)
→線形モデルにビニングは有効である。決定木に対しては必要ない。