本日のまとめ

正則化による過学習への対処

  • 過学習とは、トレーニングデータに適合しているが、テストデータではうまく適応できない問題のこと データに対して、パラメータの数が多すぎて、モデルが複雑なときに起こりうる。(高バリアンス)

  • バリアンスが高いと、データセットによって、予測結果がばらついてしまう。

  • 逆に、モデルがシンプルすぎて、学習不足に陥ることもある。バイアスが高い(高バイアス)ともいう。系統誤差の計測値ともとれる。

  • 誤差は、系統誤差と、偶然誤差に大別される。系統誤差は、同じ方法を用いて測定し、「真の値」に対して、系統的にずれる誤差。偶然誤差は測定のたびにばらつく誤差

  • バイアスとバリアンスのトレードオフを探る方法として、正則化に基づいて複雑さを調整することがある。

  • 正則化は、共線性を処理する手法で、ノイズを取り除き、過学習を防ぐ。

  • モデルの汎化誤差 = (バイアス)2 + バリアンス + ノイズ。両方小さいほうがいいが、どちらかを小さくすると、どちらかが大きくなるトレードオフの関係にあると知られている。

  • 共線性とは、特徴量の間の相関の高さのこと。

  • 極端なパラメータの重みにペナルティを科すための追加情報の導入である。最も一般的な正則化は、L2正則化(L2 regularization) である。

  • 
    \frac{\lambda}{2}  || {\omega} || ^2 = \frac{\lambda}{2}  \sum_{j=1}^{m}  {\omega_i}^{2}
    
    
  • 上記の式を、コスト関数に加えることで、極端に大きな重みをもつ場合は、コストが大きくなる
  • scikit learnのLogistic Regressionに実装されているパラメータCは、正則化パラメータを表している。
  • 
    C = \frac{1}{\lambda}
    
    

  • 
    J(w) = C * (誤差によるコスト) + \frac{\lambda}{2}  || {\omega} || ^2
    
    

  • Cが小さいと、正則化の項の寄与が大きくなり→正則化を強めることになる

サポートベクトルマシン(Support Vector Machine)による最大マージン分類

  • 参考
  • 境界がノンパラメトリック
  • スラック変数は、回帰における正則化のようなもの(バイアスとバリアンスのトレードオフ
  • SVMとロジスティック回帰の結果は似た者になるが、SVMの方が、決定境界に近い。また、ロジスティック回帰は、条件付尤度の最大化を考えているため、外れ値の影響を受けやすい
  • サポートベクトルマシンはマージンを考える
  • マージンとは、超平面(決定境界)と、超平面に最も近いサンプルとの距離
  • SVMの最適化は、マージンを最大化すること

  • マージンが小さい→過学習、マージンが大きい→汎化誤差が小さい

  • マージンは次の式であらわされる(詳細は略)

カーネルSVMを使った非線形問題の求解

  • ある次元のデータセットで、線形分離が不可能ものを、射影関数を使って、別の高次元空間へ射影して、 線形分離できるようにする
  • 射影関数の例

φ( x_1 , x_2 ) = (z_1 , z_2 , z_3 ) = ( x_1 , x_2 , {x_1}^2 , {x_2}^2 )

  • SVMを使って、非線形問題の解を求めるには、射影関数φを使ってより高い次元の特徴空間に変換し、この新しい特徴空間でデータを分類するための線形SVMモデルをトレーニングする
  • ただし、新しい特徴量を生成する必要があるので、計算コストが高くなる
  • そこで、2つのサンプル間の類似性を表すものとして、カーネルを定義する。
  • 最も広く使用されているカーネルは、動径基底関数カーネル(Radial Basis Function)である  参考
  • scikit-learnでは、SVCオブジェクトの生成時に、kernel='rbf'でRBFを指定できる。(linear)なら通常のサポートベクタマシン

本日のまとめ

分類アルゴリズムの選択

  • 分類器の性能は学習に利用可能なデータに依存する
  • 一般的なアルゴリズム選択の手順は以下の通り

  • 特徴量を選択し、サンプルを収集する

  • 性能指標を選択する
  • 分類器と最適化アルゴリズムを選択する
  • モデルの性能を評価する
  • アルゴリズムを調整する

Scikit-learnによるパーセプトロン

  • train_test_splitは、内部的にトレーニングデータをシャッフルしてくれる
  • train_test_splitの引数stratifyは、組み込み機能としてサポートされている層化サンプリングを利用する。 これは、train_test_splitから返されるトレーニングデータサブセットと、テストデータサブセットに含まれている クラスラベルの比率が等しくなる
  • processingモジュールのStandardScalerクラスを用いて特徴量を標準化する
  • レーニングデータとテストデータの標準化には、同じスケーリングパラメータを利用することが大事
  • 性能指標の評価には、metricsモジュールを利用する
  • 決定境界をプロットしてみると、どのようなデータが分類誤りとなっているかがわかりやすい
  • パーセプトロンでは、完全に線形分離可能なものでないと、収束しない f:id:kappaosyou:20200718072354p:plain

ロジスティック回帰

ロジスティック回帰と条件付き確率

  • オッズ比(odds ratio)とは、正事象の確率をpとしたとき、```p / 1 - p"とあらわされる。 参考
  • ここで、正事象とは、罹患しているかどうかなど、予測したい事象のことで、クラスラベルとしては1として考える。
  • ロジット関数(ある確率が与えられたとき、その確率のオッズ比の対数)は、0<x<1のxを受け取り、実数の値に変換する
  • ロジット関数を用いて、特徴量の値と対数オッズの線形関係を表す
  • 
    logit(p (y = 1 | x )) = w_0 x_0 + w_1 x_1 + ... + w_m x_m = \sum_{i=0}^{m} w_i x_i = \mathbf{w}^{\mathbf{T}} \mathbf{x} ¥eqno(1)
    
    
  • p(y=1 |x ))は特徴量xが与えられたときに、サンプルがクラス1に属するという条件付き確率
  • 条件付確率-
    
    P(A|B) = \frac{P(A かつ B)}{P(B)}
    
    
    参考
  • 実際に関心があるのは、サンプルが特定のクラスに属している確率を予測すること。 これは、ロジスティック関数の逆関数となり ロジスティックシグモイド (logistic sigmoid) 関数とも呼ばれる 参考
  • 上記の特徴量とロジット関数の逆関数を求めると以下のように書ける

φ(z) = \frac{1}{1 + e^{-z}} 

ここで、


z =  logit(p (y = 1 | x )) = w_0 x_0 + w_1 x_1 + ... + w_m x_m = \sum_{i=0}^{m} w_i x_i = \mathbf{w}^{\mathbf{T}} 

シグモイド関数のプロットは以下のようになる。 f:id:kappaosyou:20200718095241p:plain zの値が大きい(オッズが大きい!)場合は、1に近づき、zの値が小さい(オッズが小さい)場合は、0に向かう。z=0(オッズのpが0.5なので、確率がeven)のとき、シグモイドは0.5となる。

尤度について

参考  これも - パラメータがある値をとるときに、観測している事象や事柄が起こる確率 - 尤度は、パラメータの関数として表して、尤度関数と呼ばれることもある - 尤度関数の基本概念はある事象が観測されたときに、どのようなパラメータを持つ確率密度(確率分布)から生まれたものだったかという問いに答えるもの - ある「10個の標本(x1...x10)が同時に得られた分布」について、各標本をえる確率P(xi)が独立だった場合、パラメータベクトルをwとして、以下のように書ける。


L (\mathbf{w}) = P(x_{1},x_{2}, ..., x_{10} = P(x_1)P(x_2)...P(x_{10}) = \prod_{i=1}^{10} P(x_i)

上記は、極端に小さな値となることもあるので、計算も対数にした方が簡単なので、 対数尤度を考えることが多い


l (\mathbf{w}) = \log L(\mathbf{w}) = \log P(x_1) + \log P(x_2) + ... + \log P(x_{10}) = \sum_{i=1}^{10} \log P(x_i)

  • ある事象を観測したときに、上記の尤度lが最大となるものをパラメータwとして採用したらよいのでは?と考えられる。これは、Lの最大値を求めることで、最尤推定と呼ばれる

  • 参考

勾配降下法と確率的勾配降下法

このまとめが図が豊富で分かりやすい。 ここでは言葉で簡単にまとめる。

勾配降下法

  • 全サンプルにわたって蓄積された誤差を用いて、重みを更新する
  • 誤差曲面を、まっすぐに進むことが多い
  • サンプル数が数百万点など多くなると、計算コストが大きくなりがち
  • バッチ勾配降下法とも呼ばれる

確率的勾配降下法

  • 1サンプル毎に、重みを更新する
  • 重みの更新頻度が多いことから、収束が早い
  • ランダムに更新するため、誤差曲面もくねくねと進む
  • 誤差曲面の動き方の特徴から、局所的な極小値を抜けやすい?
  • 学習が進むにつれて、学習率を小さくすることもある
  • サンプルが届くたびに学習するオンライン学習も可能
  • 逐次的勾配降下法オンライン勾配降下法とも呼ばれる

ミニバッチ学習

プロセスのメモリ使用量

プロセスのメモリ使用量の測定ではpsコマンドはあてにならない。 メモリ使用量を測定したい場合は、PSSや、USSを測定するようにする。 参考:https://qiita.com/guntamania/items/f2fb326e6b8b5b01d8a3

  • プロセスのメモリは、プログラムの実行メモリなどが配置されたテキスト・セグメントと、データが配置されたデータ・セグメントが存在する。
  • テキストセグメントは、同一プロセスを起動した場合や、複数プロセスが同一の共有ライブラリを使用する場合は、カーネル内部では共有される
  • psコマンドで表示されるRSSは物理メモリの使用量だが、共有されている場合も含むため、各プロセスが実際に使用している量とはいいがたい。

Matplotlibでのグラフ描画

特徴

  • 動作するOSを問わない
  • MATLABライクなUI
  • 軸、目盛り線、詳細な書式に対応
  • 出力形式もいろいろ

グラフ描画の基礎

  • Jupyter Notebookにグラフを出力するには、plt.show()を利用する
  • グラフを描画する前に、Figureと、Subplotを生成する
  • FigureSubplotを描画する領域、Subplotはグラフを描画する領域
  • FigureSubplotを追加する方法は、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のMarkdownGithub Flavored Markdown
  • ipynbファイルはただのJSON
  • $で囲んだりすると、数式も記載可能
  • metadataとは、ものごとに付随するデータ
  • マジックコマンドとは、Jupyterがカーネルに対して実行するコマンドのこと。先頭に%をつける。OS非依存で実行可能。  %pwd,とか、%%だと全セルに適応される。
  • %matplotlib inlineセルの直下に図がでる, %matplotlib tk別ウインドウででる。
  • Pandasで、1次元データはSeries, 2次元はDataFrame