かけだしデータサイエンティストの日報

最近勉強したデータサイエンティスト的な話題のブログです。

Python で始めるベイズ機械学習入門(3章)

ch3

3章の内容は回帰問題についてベイズ的にモデルを作成する話。

  • 3.1~3.5 までは具体的なモデルを設定する方法(線形回帰、一般化線形回帰のベイズ推定)
  • 3.6~3.7 まではガウス過程回帰をもちいてモデルを仮定しない方法

を取っている。

3.1~3.5(線形回帰、一般化線形回帰のベイズ推定)

ベイズ的にモデルを決める手順
  1. 予測モデルを決める。 y \sim p(y|x,w)
    •  p(y|x,w)をどのような確率分布に設定するのか。(ガウス分布ポアソン分布など)
    •  wの個数をいくつにするのか。(単回帰 or 重回帰)
    • 確率分布のパラメータ(ガウス分布における平均など)と x,wの依存性をどうやって設定するのか。(線形回帰 or 一般化線形回帰)
  2. 確率変数とするモデルパラメータを決めて、事前分布を与える。  w \sim p(w|\alpha)
    • \alphaはハイパーパラメータであるが、ハイパーパラメータも確率変数として扱っているものを階層モデルと呼んでいる。
  3. 予測モデルから尤度関数を計算する。( \prod_{i}^{N} p(y_{i}|x_{i},w))
  4. MCMCなどのサンプリングアルゴリズムを使って事後分布からのサンプリングを行う
  5. サンプリングアルゴリズムから得られたパラメータを用いてモデルとする。
    • 例1: サンプリングしたモデルパラメータの平均値をモデルのパラメータとして設定する。
    • 例2: 各サンプリング結果を用いて予測値  \tilde{y} を計算したあとで予測の平均値を予測モデルとする。


MCMCを使っている目的は、ベイズモデルではモデルパラメータ事後分布からのサンプリング {w}_{\text{sample}}が回帰モデルを決定するために必要だからである。

コードの手順

これはすべて同じである。

  1. 真のモデルを決める。
  2. 真のパラメータを決める。
  3. 観測したデータを生成する。
  4. pymc3 でモデルの設定を行う。
    1. 観測した説明変数のデータを指定。 x
    2. モデルパラメータの事前分布を指定。 {w}
    3. 確率モデルを設定して目的変数のデータを指定。 y
  5. MCMCを用いて事後分布を作成する。(= 事後分布からのサンプリングを行う)
  6. サンプリングしたモデルのパラメータ {w}_{\text{sample}}と新しい説明変数  x_{\text{new}} を用いて予測確率モデルからのサンプリングを行う。

 \displaystyle
y_{\text{new}} \sim  p(y|x_{\text{new}}, {w}_{\text{sample}})

    • パラメータのサンプル値 {w}_{\text{sample}}を複数回サンプリングして、そのたびに y_{\text{new}}もサンプリングしている
    •  y_{\text{new}}はモデルのパラメータのサンプル値 {w}_{\text{sample}}を変えてサンプルしている
    • 複数回サンプリングして得られた y_{\text{new}} の平均値が推定値として利用されている。このプロセスが


\begin{align}
y_{\text{new}|x_{\text{new}}}
& = \int dw  p(y|x_{\text{new}}, w)p(w|D) \\
& \sim\frac{1}{N} \sum^{N} p(y|x_{\text{new}}, w_{\text{sample}})p(w_{\text{sample}}|D)
\end{align}

に対応している。 ここで  Dは観測したデータ点 (x_{i},y_{i})の組,  Nはサンプリングした回数。


3.6~3.7: ガウス過程回帰

ガウス過程回帰ではモデルを決定することはない。なぜならガウス過程回帰では、(イメージとして)すべての関数からなる空間から最も適切そうな関数を探索するからである。すべての関数からなる空間にはあらゆる1次関数やあらゆる指数関数などが含まれており、簡単な式では表せない関数も含まれている。その中から観測したデータ点  (x,y) を説明しうる曲線が平均として現れるようなガウス過程を求めている.詳細については Qiita に解説記事を載せているのでこちらを参照.
qiita.com

Kaggle スタートブック~2章(4)

範囲:2.7章(p89~p94)

やったこと

総括 データの分割は重要だがデータに依存して毎回分割方法を熟慮する必要がある。

参考ページ 本のサポートページgithub https://github.com/upura/python-kaggle-start-book/blob/master/ch02/ch02_07.ipynb

決算書の読み方(1)

不定期ですが決算書の読み方の勉強を始めようと思います。

  • 最近話題のColabo の不正会計疑惑について興味を持ったから
  • 会社の株式投資などにも興味があるから

勉強は基本的に
https://www.kessansho.com/
を読み進めて気が向いたらどこかの会社(多分自社)の書類を呼んでいこうと思います。
ブログに書く内容は感想とメモ、その日のポイントを2〜3行という感じの予定。

決算書って何のためにあるの?

決算書は基本的に

  • 会社がいくら稼いで
  • 稼いだ金をどのように使い
  • 最終的にいくら儲けたか

がわかる書類。いくら儲けたかは売上を単純に計算するだけでは全然わからない。
なぜならば儲けたお金から給料や仕入れ代、光熱費などのコストが差し引きされるからである。

決算書にはどんなものがあるの?

決算書は主に3種類存在して年度ごとに作成されていき、最初の月は4月で終わりは次の年の3月となる。
決算書の3種類は

であり、これらは互いに関係しあっている。

損益計算書ってどんなものなの?

損益計算書とは


儲け= 稼ぎ-コスト

を書き表したもの。例えば100円で布を買ってきて頑張ってぬいぐるみを作り500円で売れたときには

400円= 500円-100円

になる。また妹に手伝ってもらってお小遣いを200円上げたならば

200円= 500円-100円-200円

のが自分の手元になりこれが「儲け」となる。稼ぎそのものはぬいぐるみを売って得たお金だが、布代やお小遣いなどのコストがかかっており最終的な利益はその差額となる。

つまり、儲けを増やすには

  • 稼ぎを増やす
  • コストを下げる

のどちらか、もしくは両方を行えば良い。

Kaggle スタートブック~2章(3)

範囲:2.6章(p89~p94)

やったこと

  • Optuna によるハイパーパラメータチューニング

疑問点

  • verbose_eval = 10 に設定しているのに[Warning] No further splits with positive gain, best gain: -infの警告がでるがどうやって消すのかが不明。

総括

  • ハイパーパラメータのチューニングは最後で特徴量を作成するほうが重要


参考ページ
本のサポートページgithub
github.com

Kaggle スタートブック~2章(2)

範囲:2.3章(p53)~2.5章(p88)

やったこと

  • Pandas Profiling によるデータ外観
  • 各種の特徴量 VS 正解ラベルのヒストグラム作成
  • 再現性を保つために、乱数を使う場面では seed を固定する.

- seed を固定するための関数を定義

  • 可視化→仮説→特徴量作成→submit →可視化 の繰り返し
  • LightGBM を使う

- LightGBM では Early stopping を利用するために Validation data を作成する。


総括

  • 可視化は大事
  • 仮説が思いつくかどうかが結局の所勝負
  • 仮説はデータの意味内容の理解から重要

Kaggle スタートブック~2章(1)

開始:2章(p41 ~ p58)
やったこと

  • とりあえず submit

注意
p41の「Kaggle上にアップロードしている2.1接のサンプルコードを開き, copy and Edit してください」の指示内容の意味が取りづらい。これは筆者がKaggle 上にアップロードしている Notebook のことである。
www.kaggle.com
このリンク先のページは筆者が 2.1 章のためにアップロードしている Notebook である。Kaggleでは 他人が公開している Notebook をコピペして再利用することができる。
qiita.com

またOutputタグからsubmission.csv というファイルが現れるには少し時間がかかる。

Submit to competitionのタグを開くと LATEST SCORE と BEST SCORE の下にV1や V2というリンクがあるが、これをクリックすると submission.csv を開くことができ 図2.3 と同じ画面を見ることができる。Data のページから Submit ができる。

欠損値について
欠損値は欠損値そのもであることに意味が存在していることもあるので無闇矢鱈に埋めることが得策であるとは限らない

  • 欠損値としてそのまま扱う
  • 代表値による補完
  • 他の特徴量から欠損値を予測して保管する(←無駄な予測を挟むので僕はあまり好きじゃない)
  • 欠損値であったかどうかをフラグとして新たに特徴量を作る

train test の結合は特徴量の加工を行うことで一括で処理することができて便利である

Kaggle スタートブック~1章

開始:1章(p1 ~ p37)

やったこと

アカウント作成
Titanic への登録
Notebook の作成

Kaggle のポイント

Kaggleでは企業がデータセットと賞金を提供しており、コンペで勝利するとお金がもらえる。
成績上位チームには金銀銅のメダルが贈呈される。メダルについて一定の条件を満たすと称号が与えられる。
基本的にコンペには2~3ヶ月程度の期限が設けられている。
チームとして参加することも可能
ブラウザ上であるていど環境が整ったNotebookが使えるのですぐに使える。GPUも使えるらしい。

教師あり学習教師なし学習強化学習

教師あり学習は学習用のデータに対して入力とそれに対応する正解が与えられている。
教師なし学習は入力に対応する正解データが与えられていない状況での学習である。一般にどのようなことが正解であるのかは定まっている。
強化学習は入力データしか与えられていないという点で教師なし学習と同じであるが、そもそも何が正解なのかすらよくわかっていない状況での学習である。

Notebook の使い方について

画面右側にある Input に格納されている全てのファイルを最初のセルで読み込んでいる。ディレクトリは

```dosbatch
./kaggle/input
```となる。
また作業ディレクトリは

!pwd

を実行することで、
```dosbatch
/kaggle/working
```
であることがわかる。


図表:

  • P14 図1.2, 1.3 メダル獲得条件と称号の条件
  • P23 コンペルール
  • P24 表1.1 コンペのページコンテンツ
  • P30 図1.18 ディレクトリ構成