離婚後の日記

離婚した。

わからん

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.]]…



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

第4章 開始

(90m)15:30~17:30

 

第4章 データの表現と特徴量エンジニアリング

連続値特徴量の他に、離散型特徴量がある。

スケール変換のように特徴量を正確に把握することは分析の第一歩である。これを特徴量エンジニアリングと呼ぶ。

 

カテゴリ変数:離散型特徴量である。例えば職業や学歴など・・・

ワンホットエンコーディング(ダミー変数):カテゴリ変数に1or0を当てはめる。しかもそれはそれぞれの回答に。

(例:【職業】「公務員であるかどうか」1or0 「民間かどうか」1or0 「無職かどうか」1or0・・・)

pd.get_dummies()

カテゴリデータチェック:スペルミスや表記の違いなどのためにどのようなカテゴリ分けされているかすべて確認するべき

.value_counts()

数字か言葉か:仮に(質問:「職業」回答「1:公務員 2:民間 3:無職」)があったとすると回答は1~3に収束され、連続値特徴量と誤解する。ワンホットエンコーディングは数字の特徴量は即ち連続量と捉える為、ダミー作成のため変換が必要である。

x.astype(str)

get_dummies(X_data,columns=[x(指定)])

 

#忘れた

LogisticRegression:すぐ忘れるので困る。