本日のまとめ
正則化による過学習への対処
過学習
とは、トレーニングデータに適合しているが、テストデータではうまく適応できない問題のこと データに対して、パラメータの数が多すぎて、モデルが複雑なときに起こりうる。(高バリアンス)バリアンスが高いと、データセットによって、予測結果がばらついてしまう。
逆に、モデルがシンプルすぎて、
学習不足
に陥ることもある。バイアスが高い(高バイアス)ともいう。系統誤差の計測値ともとれる。誤差は、
系統誤差
と、偶然誤差
に大別される。系統誤差
は、同じ方法を用いて測定し、「真の値」に対して、系統的にずれる誤差。偶然誤差
は測定のたびにばらつく誤差モデルの汎化誤差 = (バイアス)2 + バリアンス + ノイズ。両方小さいほうがいいが、どちらかを小さくすると、どちらかが大きくなるトレードオフの関係にあると知られている。
共線性とは、特徴量の間の相関の高さのこと。
極端なパラメータの重みにペナルティを科すための追加情報の導入である。最も一般的な正則化は、L2正則化(L2 regularization) である。
- 上記の式を、コスト関数に加えることで、極端に大きな重みをもつ場合は、コストが大きくなる
- scikit learnのLogistic Regressionに実装されているパラメータCは、正則化パラメータを表している。
サポートベクトルマシン(Support Vector Machine)による最大マージン分類
- 参考
- 境界がノンパラメトリック
- スラック変数は、回帰における正則化のようなもの(バイアスとバリアンスのトレードオフ)
- SVMとロジスティック回帰の結果は似た者になるが、SVMの方が、決定境界に近い。また、ロジスティック回帰は、条件付尤度の最大化を考えているため、外れ値の影響を受けやすい
- サポートベクトルマシンはマージンを考える
- マージンとは、超平面(決定境界)と、超平面に最も近いサンプルとの距離
SVMの最適化は、マージンを最大化すること
マージンが小さい→過学習、マージンが大きい→汎化誤差が小さい
- マージンは次の式であらわされる(詳細は略)
カーネルSVMを使った非線形問題の求解
- ある次元のデータセットで、線形分離が不可能ものを、射影関数を使って、別の高次元空間へ射影して、 線形分離できるようにする
- 射影関数の例
本日のまとめ
分類アルゴリズムの選択
- 分類器の性能は学習に利用可能なデータに依存する
一般的なアルゴリズム選択の手順は以下の通り
特徴量を選択し、サンプルを収集する
- 性能指標を選択する
- 分類器と最適化アルゴリズムを選択する
- モデルの性能を評価する
- アルゴリズムを調整する
Scikit-learnによるパーセプトロン
train_test_split
は、内部的にトレーニングデータをシャッフルしてくれるtrain_test_split
の引数stratify
は、組み込み機能としてサポートされている層化サンプリングを利用する。 これは、train_test_split
から返されるトレーニングデータサブセットと、テストデータサブセットに含まれている クラスラベルの比率が等しくなるprocessing
モジュールのStandardScaler
クラスを用いて特徴量を標準化する- トレーニングデータとテストデータの標準化には、同じスケーリングパラメータを利用することが大事
- 性能指標の評価には、
metrics
モジュールを利用する - 決定境界をプロットしてみると、どのようなデータが分類誤りとなっているかがわかりやすい
- パーセプトロンでは、完全に線形分離可能なものでないと、収束しない
ロジスティック回帰
- 線形分類問題と二値分類問題に対する強力なアルゴリズム
ロジスティック回帰と条件付き確率
- オッズ比(odds ratio)とは、正事象の確率をpとしたとき、```p / 1 - p"とあらわされる。 参考
- ここで、正事象とは、罹患しているかどうかなど、予測したい事象のことで、クラスラベルとしては1として考える。
- ロジット関数(ある確率が与えられたとき、その確率のオッズ比の対数)は、0<x<1のxを受け取り、実数の値に変換する
- ロジット関数を用いて、特徴量の値と対数オッズの線形関係を表す
p(y=1 |x ))
は特徴量xが与えられたときに、サンプルがクラス1に属するという条件付き確率- 条件付確率-
- 実際に関心があるのは、サンプルが特定のクラスに属している確率を予測すること。 これは、ロジスティック関数の逆関数となり ロジスティックシグモイド (logistic sigmoid) 関数とも呼ばれる 参考
- 上記の特徴量とロジット関数の逆関数を求めると以下のように書ける
ここで、
シグモイド関数のプロットは以下のようになる。 zの値が大きい(オッズが大きい!)場合は、1に近づき、zの値が小さい(オッズが小さい)場合は、0に向かう。z=0(オッズのpが0.5なので、確率がeven)のとき、シグモイドは0.5となる。
尤度について
参考 これも - パラメータがある値をとるときに、観測している事象や事柄が起こる確率 - 尤度は、パラメータの関数として表して、尤度関数と呼ばれることもある - 尤度関数の基本概念はある事象が観測されたときに、どのようなパラメータを持つ確率密度(確率分布)から生まれたものだったかという問いに答えるもの - ある「10個の標本(x1...x10)が同時に得られた分布」について、各標本をえる確率P(xi)が独立だった場合、パラメータベクトルをwとして、以下のように書ける。
上記は、極端に小さな値となることもあるので、計算も対数にした方が簡単なので、 対数尤度を考えることが多い
勾配降下法と確率的勾配降下法
このまとめが図が豊富で分かりやすい。 ここでは言葉で簡単にまとめる。
勾配降下法
- 全サンプルにわたって蓄積された誤差を用いて、重みを更新する
- 誤差曲面を、まっすぐに進むことが多い
- サンプル数が数百万点など多くなると、計算コストが大きくなりがち
- バッチ勾配降下法とも呼ばれる
確率的勾配降下法
- 1サンプル毎に、重みを更新する
- 重みの更新頻度が多いことから、収束が早い
- ランダムに更新するため、誤差曲面もくねくねと進む
- 誤差曲面の動き方の特徴から、局所的な極小値を抜けやすい?
- 学習が進むにつれて、学習率を小さくすることもある
- サンプルが届くたびに学習する
オンライン学習
も可能 - 逐次的勾配降下法やオンライン勾配降下法とも呼ばれる
ミニバッチ学習
- バッチ勾配降下法と確率的勾配降下法の折衷案
プロセスのメモリ使用量
プロセスのメモリ使用量の測定ではps
コマンドはあてにならない。
メモリ使用量を測定したい場合は、PSSや、USSを測定するようにする。
参考:https://qiita.com/guntamania/items/f2fb326e6b8b5b01d8a3
Matplotlibでのグラフ描画
特徴
- 動作するOSを問わない
- MATLABライクなUI
- 軸、目盛り線、詳細な書式に対応
- 出力形式もいろいろ
グラフ描画の基礎
- Jupyter Notebookにグラフを出力するには、
plt.show()
を利用する - グラフを描画する前に、
Figure
と、Subplot
を生成する Figure
はSubplot
を描画する領域、Subplot
はグラフを描画する領域Figure
にSubplot
を追加する方法は、Figure.add_subplot
と、pyplot.subplots
関数を利用する方法があるadd_subplot(221)
は、2行2列の1番subplots
はaxのndarrayが戻り値となるstyle.use
でスタイルを適用する。ggplotはデフォルトでグリッド線が表示される。
折れ線グラフ
Axes.plot()
で描画する- 引数はリスト、タプル、ndArray, Series
- 第一引数のみの場合、第一引数がYとあつかれる
- X値と、Y値両方与えると、1個目がx、2個目がyとなる
- 複数のグラウを重ね書きする場合は、2回プロットする
- 2つのY軸を持つ場合は、
Axes.twinx()
メソッドを使う
散布図
Axes.scatter()
メソッドを使う
棒グラフ
Axes.bar
- 引数でリストを渡す。
- ラベルもリストで渡す
set_xticks
でxメモリ設定xticklabels
でラベル設定もできるbarh
で横向きも可能- axに対して、複数買い
bar
すると、上書きされる - 複数記載するときは、x値をずらす
- 積み上げを記載する場合は、積み上げた順に記載する(使う???)
■
pandas
前処理
dropna, dropna(inplace=True)
dataframeは列ごとに型を持っている。方変更する場合には
astype()
メソッドを使用するsortにはsortValues()
mapは値ごとに関数適用。applyはDataFrameの行、列に対して。applyの戻りはSeries
統計量
- mean, corr, covなどintやfloatについて計算する
- describeは基本統計量を算出する
クロス集計
- クロス集計とは、質問事項を2つ以上かけ合わせて集計する手法
- groupby()にひとつや、リストで複数のカラムを指定する
numpy.hstack()
でndarrayを横に結合。 (参考)str_strip().uniquie()
でユニークにするconcat
でSeriesのリストを連結する
時系列データ
pct_change
で変化率を算出cumprod
で累積率rolling
でデータの範囲指定で関数適用resample
で頻度を変換
可視化
plot()
で折れ線グラフscatter()
で散布図hist
でヒストグラムbinsは、ビンの数設定
2020/07/04 日記
07/03
Bと飲みにいった。会社の現状を聞いて、自分の考えや感じていたことはあながち間違いではないと感じた。 自分で考えて、自分で食べられる力をつけなくてはならない。
07/04
午前
朝5時に目が覚めたが、お風呂に入ったあともう一度寝てしまった。 11時ぐらいか1時間ほどJupyterの勉強
午後
Jupyterの勉強(Python ユーザのためのJupyter[実践]入門)
夜
ランニング
学んだことメモ
- JupyterはVer3.xまでIpython Notebookとして、notebookとサーバ一体となっていた。
- Ver4 以降は、Notebookと、Ipythonを分離。
- Ipythonはpythonとの対話をするもので、Notebookからみるとカーネルといわれる。
- Notebookのカーネルは、通常Ipythonだが、RやRubyにも代えられる。
anaconda create -n XXXx
で仮想環境作成。仮想環境作ると、バージョン管理とかしやすいconda install -y XXX==0.0.0
とかでパッケージをインストールconda activate
で仮想環境有効か,conda deactivate
で無効か- condaのコマンドは、全体向けと、個別環境下での実施がある
conda list
でインストールされているパッケージを見る。conda update
でアップデート- フォントのインストール →全ユーザでする。otfファイルを用いる。
- Jupyterのショートカット、
ctrl + /' コメント,
Esc: コマンドモードと、エディットモードの切り替え,
A:上にセル挿入,
B`下にセル挿入P
コマンドパレットを開く- JupyterのMarkdown はGithub Flavored Markdown
- ipynbファイルはただのJSON
- $で囲んだりすると、数式も記載可能
- metadataとは、ものごとに付随するデータ
- マジックコマンドとは、Jupyterがカーネルに対して実行するコマンドのこと。先頭に
%
をつける。OS非依存で実行可能。 %pwd,とか、%%
だと全セルに適応される。 %matplotlib inline
セルの直下に図がでる,%matplotlib tk
別ウインドウででる。- Pandasで、1次元データはSeries, 2次元はDataFrame