Kaggleで勝つ本 -第3章

今日は最近読みだしているKaggle本のアウトプット。

f:id:kawam0t0:20200529181806p:plain



早速やっていきませう。


第3章の数値変換、というところだ。


数値変換せずとも、もちろんそのままモデルの学習に使うことはできるのだが、
実際は、数値変換を行って、モデルを学習させることが多々ある。
GBDTの様に、そこまで数値変換を必要としないモデルもあるはあるが、
場合によってはした方が精度の良いものが出来上がる場合もある。

では、下記よりその手法について書いていく。


標準化

これは一般的というか基本的な数値変換。
誰しもがまず行うものといっても過言ではない。

sklearnのLinerRegressionの様に、線形回帰を行う場合、
特徴量の値が非常に大小大きいと、うまく学習してくれない。
そんな時に、役立つのが、この標準化。
平均を0に、標準偏差を1にしてくれ、数値を変換してくれる。
そうすることで、学習しやすくなる。
注意しなければならないのは、単純に、線形変換を行っただけなので、
グラフの分布自体に変化はない、という点だ。

scaler = StandardScaler()
scaler.fit(train_x[num_cols])

train_x[num_cols] = scaler.transform(train_x[num_cols])
test_x[num_cols] = scaler.transform(test_x[num_cols])

**

非線形変換 Box-Cox変換 Yoe-Johnson変換

一方こちらは、分布さえも変換してしまう、というもの。
場合によってはこちらの方が精度が高く出る場合もある。

Box-Cox変換
こちらは、0ないしマイナスの値をとって数値変換をすることができない(標準化も同様である)点が特徴。

pos_cols = []
#Box_Cox変換
from sklearn.preprocessing import PowerTransformer
#正の値のみの変換になる
for c in num_cols:
    if (train_x[c] >0).all() and (test_x[c] > 0).all():
        pos_cols.append(c)
pt = PowerTransformer(method="box-cox")
pt.fit(train_x[pos_cols])

train_x[pos_cols] = pt.transform(train_x[pos_cols])
test_x[pos_cols] = pt.transform(test_x[pos_cols])

Yoe=Johnson変換
一方こちらの数値変換方法はマイナスの値も、0も取ることができる。

pt = PowerTransformer(method="yeo-johnson")
pt.fit(train_x[num_cols])
train_x[num_cols] = pt.transform(train_x[num_cols])
test_x[num_cols] = pt.transform(test_x[num_cols])
Clipping

外れ値の削除を行う方法。
上限と下限を設定することで、線形回帰等、外れ値に敏感に反応するのを防ぐ。
clip関数を使うことで、第一引数には下限を。第二引数には上限を持ってくる

train_x , test_x = load_data()
p01 = train_x[num_cols].quantile(0.01)
p99 = train_x[num_cols].quantile(0.99)

train_x[num_cols] = train_x[num_cols].clip(p01 , p99 , axis=1)
test_x[num_cols] = test_x[num_cols].clip(p01 , p99 , axis=1)
Bining

Biningとは、あえて連続的な数字をカテゴリー変数とすることで、
one-hot-encoadingしてもいいし、そのまま数字としての特徴量を持ってきてもOK。

train_x["test"] = pd.cut(train["height"],4,labels=False)
train_x.head()
Rank Gauss

これは単純に順位別に並べた後、無理やり正規分布で表す方法。
まさかの標準化、よりも精度がたかくなるらしい…

from sklearn.preprocessing import QuantileTransformer

transformer = QuantileTransformer(n_quantiles=100 ,random_state=42 , output_distribution="normal")
transformer.fit(train_x[num_cols])

train_x[num_cols] = transformer.transform(train_x[num_cols])
test_x[num_cols] = transformer.transform(test_x[num_cols])

ここでは色々な手法をご紹介したが、
個人的に、ClippingとBining、Rank Gaussを使ってみようと思う。


ではまた!

9講 仮説検定

今日は独習のアウトプット。

久しぶりに読んだ…
あかんなぁ~忘れてた笑



f:id:kawam0t0:20200524183341j:plain

今日は仮説検定についてのお話し。

仮説検定とは…

まず、仮説検定の前に、推定についてのお話し。統計的推定ともいう。
これは、ほとんどのデータは母集団から一部取り出した標本でできており、
その標本を使って、推定を行っているものである、とするのが統計的推定というやつだ。
実際に、出口選挙とかで、一瞬で誰が当選をしたのか、など分かるのも、標本を使っておおよそ95%の確率で、や
99%の確率で、等使われる。

ここで、統計学的によく使われるのが、99%信用区間と95%信用区間だ。
例えば、何枚かわからない枚数をばっと一斉に放り投げたとき、表になる枚数が10枚だったとしよう。
その場合、この表になる枚数が10枚になる、全体のコインの枚数って何枚ぐらいなんだ?
ということを図れるのが信用区間というやつ。

この母集団の値は妥当なの??

さて、この信用区間を図るとき、
必ず使うのが仮説をたてて、検定を行う。つまり仮説検定が大事になってくる
仮説は「仮に16枚のコインを投げたと仮定した時、10枚が表って妥当なの?」
という具合だ。
その際の計算式は、

   σ × ( 標準正規分布 ) + μ 

で求められる。

コインの裏表、は正規分布に従うので、16枚を仮に投げたら、平均は8で標準偏差は2になる。
そこから、↑の計算式に当てはめていくのだが、全体の母集団がわからない(仮置きしている)ので、一旦Xと置いていく。
更に、今回は信用区間は95%を取るので、標準正規分布のσは±1.96。だから、

-1.96 ≦ ( X - 8 ) ÷ 2 ≦ 1.96

の間になる。

この式を求めていくと、

4.08 ≦ X ≦ 11.92

となる。
つまり、仮置きした16枚のコインが表が10枚になる可能性は大いに考えられる値である。
ということになる。

あくまで、仮説検定の考え方としては、正規分布に母集団が属している、という大前提があることが重要になる。


では、また!

Udemyのデータサイエンティスト講座 ークラスター分析

今回はUdemyの講座からお届け。

f:id:kawam0t0:20200524190606p:plain

かなりボリュームのある講義だけど、
とてもためになってる。
特に標準化の手法や、クラスタリング
線形回帰の手法もとても分かりやすい。


海外でも人気の講座を日本語訳にしてくれたものです。


では、今日は主に、クラスター分析についてアウトプット。

クラスター分析って?

クラスター分析とは、似ている者同士は同じものとして、似ていない者同士は離れて把握し、グループ分けを行う。
ということ。

特に確認分析を行うときや、イメージセグメンテーションをするときに効果的。
散布図とかでよくやったりするよね。

分類とクラスタリングの違いは、教師ありか教師なしかの違い。
教師ありの場合は正解ラベルが用意されているが、クラスタリングの場合は、
自動でグループ分けを行う。ただし、何個に分けるのか?はこちらで決めなければならない。

クラスター分析の流れ

とても分かりやすい。

①まず、ユークリッド距離という、点と点を結んだ距離を測る。(赤線)
f:id:kawam0t0:20200524190552p:plain

②それぞれの点からこのユークリッド距離が短いシードに点を打っていき、それを繰り返す。

③さらに、点と点の真ん中(重心)を求めていって、その重心にシードを移動させる。

④その②~③を何回か繰り返して、クラスタリングを行う。


しかし、ここで問題がある。
クラスターの求めかたはわかったが、いくつ、クラスターを用意すればよいのか??
この疑問についてはwcssという手法がある。


WCSSについて

これは、クラスターを何個、持ってきたらいいのか?ということをばっちりではないが、ある程度教えてくれる奴。
方法としては、エルボー法、とか言ったりするけど、WCSSって言ったほうがかっこいいよね。

wcss = []
for i in range(1,10):
    kmeans = KMeans(n_clusters=i,random_state=0)
    kmeans.fit(x_scaled)
    wcss_iter = kmeans.inertia_
    wcss.append(wcss_iter)

f:id:kawam0t0:20200524191153p:plain


このコードと図を確認頂くのが早いかな。
明らかに、下がり方が緩やかになっている部分(kの図で言うと、4とか5当たり)があるけれど、
ココが実は最適なクラスターの数であったりする。

これを目安にしていくとOK。

K-近傍法の注意点

ここからはK-近傍法の注意点について。
コードもわかりやすく、かなりシンプルに行えるのだが、
①外れ値はしっかり除去してね
②標準化すべきかどうかは吟味が必要

の2点については注意が必要。
特に標準化については、
目的変数に対して、重要な指標である説明変数があり、なおかつ、その説明変数の値があまりにも離れている場合がある、等、
自分で確認をしなくてはいけない部分になる。

とはいえ、
色々なモデルを構築してく上で、個人的にはとても勉強になった。


では、また!

完全独習 統計学入門 -第6講・7講

久しぶりのアウトプットだ。
いやぁ、やっぱり知識の定着をするにはアウトプットしかない…


今日もやります!

f:id:kawam0t0:20200524183341j:plain

少し前からこの本を読んでいる。

そろそろ難しくなってきたなと思ったので、第6講・7講からアウトプット。

6講 金融商品でも使えるよ(ボラティリティ)


第6項は金融の分野でも、標準偏差は使えるよって話。
主に、シャープレシオっていう考え方があって、
これはつまり、どれが最も優れた金融商品??(つまりはどれだけ標準偏差が小さいの??どれが一番リスクとリターンのバランスが取れてるの?)
を見ましょうねって話。


具体的には、リターン÷リスク つまりは、

平均収益率 - 国債利回り(これが基準だから) ÷ 標準偏差(ばらつき)

で求められる。

7講 正規分布について


正規分布とは、自然や社会において、もっとも一般的な分布の事

f:id:kawam0t0:20200524184059p:plain


そして、その正規分布の中でも一番の基礎になるのが、「標準正規分布である。


その標準正規分布の特徴があって、

①平均がなんとなんと0で、標準偏差が1になるってよ。

②この写真内の様に1σの範囲が70%弱を抑えて、2σが90%を抑えていくって性質

この2つはとても大事らしい。



では、そのほかの正規分布については、どうか…


一般の正規分布は、こんな式で表される。

一定数のσ × 標準正規分布 + 平均

なんのこっちゃ?って話。

我ながらこの図が最もわかりやすい。
f:id:kawam0t0:20200524184746j:plain


まず、標準正規分布は、この写真の様に、σを-1と1と取り、平均を0に取ってくる。
そこから、例えば、σが3で平均が4の正規分布があった場合、
まず、σが3と-3の為、標準正規分布のσに掛け算をする。
そこから、更に平均値を4、正規分布の0に足算してあげると、右にスライドされた正規分布が出来上がる。

つまり、正規分布は平均値と標準偏差を与えるとそのグラフは1種類になってしまうって事。
いかに、正規分布において平均と標準偏差が大事か、が分かったと思う。

おまけに、
このスライドした正規分布も標準正規分布と同じく、
(平均 + 1 × σ) ~ (平均 - 1 × σ)は68%ぐらいを占めて、
(平均 + 2 × σ) ~ (平均 - 2 × σ)は95%を占めてくる。

妻のトリセツ

嫁との大事件が起きてから、
まさかの妻からの「妻のトリセツ」という本を頂きました笑


まさに、うちの姫が僕に渡したのは「共感してよ」のサインだ。
そう、この本を読んでから思うのは、女性脳は「共感」というワードがかなりキーになってくる。

実際に、今朝、実践してみたらいやはや、姫から俺にくっついてくるではないか!!
魔法がかかったかのよう笑

よしよし、How to本はこれまであまり読んでこなかったのだが、
妻の、というよりも「女」としての扱い方については、非常に学ぶべきものがあったので、軽くまとめておく。
そう、これは、本自体は妻のトリセツ、となっているが、完全に女のトリセツに近いと思う。

余裕でネタバレなんで、見たくない方は見ないほうがおすすめです。
買うのがめんどくさい方はこれを見とけば、ざっくりとわかるのでは?

f:id:kawam0t0:20200517105856j:plain


本編は第1章と第2章で分かれていて、
主に、第1章のボリュームが非常に多かった。ゆえに第1章がメインだったかと思う。
ざっくりまずは全体を書いて、その後個別で書いていく。

全体の総括

大きく妻への対応は2つ。とてもシンプルだ。
ネガティブトリガーを引かない、ということとポジティブトリガーをまめに引く、ということだ。
それには、正論をつきつける、事よりもまずは心を肯定してあげること(=共感)が重要で、更に、
生活するうえでのプロセスを大事に思ってあげることで、より効果が倍増してくれる。




第一章 ネガティブトリガーを作らない

女性の脳は芋づる式に、過去の怖い・さみしい・つらいといったマイナスの記憶をハッシュタグで管理している。
しかも、それは年月が経っても色あせることなく、いつでもフレッシュな状態で保存されている、超有能な冷蔵庫。
おまけに、マイナスの感情の記憶の方が大きく、それをずっとため込んでいるので、今、怒っていることは
過去の蓄積である。つまり、この「マイナスの記憶の引き金」=ネガティブトリガーを引かないことが重要。
特に、周産期や授乳期の時には注意が必要である。

具体的なHow Toとしては…

①女友達として接する
②共感する→女にとって無駄話はないのである
③真摯に謝る=決してでもお前も!などとは一旦は言わない。それは、長い年月かけて蓄積された膿である
④否定はNGで、心の肯定を
⑤ねぎらう=プロセス重視の女性脳はとにかくプロセスをほめる、あるいは肯定するとGood

また、女性脳の特徴はいくつか上記にも書いたけど、
いくつか取り上げておく。

それ以外の女性脳の特徴
①半径3mは女のテリトリー。そこを勝手に動かすとストレスがたまる→嫁姑問題の原因
 →この問題については、夫がさっとその女のテリトリーに無邪気に入るとすんなりいく

②とにかく女はプロセスが重要。日々の行動や、思いなどがたまり溜まってくる。
 では逆にその日々の想い、をプラスに働かせていけばよい(第2章に続く)

③妻の信頼を勝ち取るとそれ以上のお返しをしてくれるようになる

ポジティブトリガーを作る

全体のネガティブトリガーを作らないことが8割だった。
それだけ、多くの男性がネガティブトリガーを罰が悪いことに、「無意識に」作ってしまっていたんだろうと思う。
自分自身もそうだ。読んでいてかなり思い当たる節があった…猛烈に反省すべき点である。

さて、この章では、起死回生の一発、ということではないが、ネガティブトリガーを引かない&ポジティブトリガーを作る、
事で、より良い夫婦関係を築けるというもの。
この夫婦関係は男にとって仕事のパフォーマンスにも影響する可能性がある。
妻の理解があっての仕事の成功、だと思っている。


では、そのポジティブトリガーを作る、How Toについて。

①プロセスが大事な女は記念日を大切にする
②楽しいこと(デートや旅行)は予告と反復
③プロセスに感謝する
④プチプレゼント作戦
⑤いくつになっても愛の言葉を


この⑤の奴は中々男にとって恥ずかしくって言えないのかもしれないけれど、
抜群の効果があるという。
よしよし、愛の言葉を捧ぐよ!!



以上である。
さらっと読みやすく、あっという間に読了してしまった。
やはり随所に「共感」と「プロセス」という言葉が出てきて、
それだけ、女の脳は複雑だけどひも解くと、シンプル、なのかもしれない。

まずは、この「共感」「プロセス」に重きを置こうと思う。

第4章 最高気温でお客様を予測したい -回帰直線

ご無沙汰の統計学が分かるの第4章のアウトプット。

今日は回帰直線というやつで、
その中でも単回帰を学んだ、というよりも復習に近いかな笑


では、アウトプット

f:id:kawam0t0:20200516003407p:plain


今回は、必要なのがこの図の中の公式やな…

特に、傾きと切片は要復習です。


では、5章で会いましょう

線形回帰について ーダミー変数の設定

前回に引き続き、データの前処理をしていく。

その中でも、ダミー変数、について。

ダミー変数についての説明はもはやいいでしょうって話だけど、
コードとしては、このように表記。

data_with_dummies = pd.get_dummies(data_cleaned,drop_first=True)

pd.get_dummiesで呼び出すのだが、drop_first = Trueではじめの変数は削除してくれる。
ダミー変数で気を付けなければいけないのが、多重共感性だ。
カテゴリー変数の数値変換において、とても便利だが、0 , 1 で区分していくため、
例えば、男性・女性を分ける際に実はダミー変数としては、女性だけを設定しておけばよい。

理由は女性 = 1 男性 = 0 となるからだ。

そして、ダミー化を行って、実際に再度多重共感性を調べてみると…

from statsmodels.stats.outliers_influence import variance_inflation_factor
var = data_with_dummies.copy()

vif = pd.DataFrame(data_with_dummies.columns.values,columns = ["feature"])
vif["VIF"] = [variance_inflation_factor(var.values , i) for i in range(var.shape[1])]

f:id:kawam0t0:20200515113705p:plain

となり、5 < 0のものが気を付けないとね、って話。
ダミー化をしたものについてはまずまずって感じかな。

今回は、ここまで、ではまた。