機械学習日記

機械学習や数学をゼロから勉強する日記

coursera 機械学習コース 6週目 まとめ

学習アルゴリズムの評価方法

 

非常に参考になった回である。

 

まず、汚いアルゴリズムを手早く作ることが重要。

そして、検証 => アルゴリズムの改善のサイクルを回す方法が、

最も短い期間でソフトウェアを開発できる、と教えてくれた。

 

もっと、データを集めるべきなのか、特徴量を減らすべきなのか等、

学習アルゴリズムを改善する策を考える材料を教えてくれる。

 

これにより、無駄な時間を大幅に減らせますよーとのこと。

以下、箇条書きに書いていく。

 

・データの偏りがあるか

データセットの70%を訓練データ、30%をテストデータとして使うとすると、

例えば、数値の昇順に並んでいたら、テスト時の正確性が著しく下がるので、

7:3に分けるときに、ランダムで分ける必要がある。

 

・訓練データで得たθをテストデータで試す。

使うデータを変え、同じ目的関数を使う。

訓練データを使った時との差を見てみる。

 

多項式回帰において、項数や次数はどうやって選ぶ?

いろんなパターンを試して、良い結果が得られたモデルを選択する。

f:id:ryoo_jp:20190516232804p:plain
 

またこの時、データを3つに分けて検証する。

訓練データ: 交差検証: テスト = 6:2:2 と言う具合にだ。

 

2つに分けて検証してしまうと、

「訓練データで学習・テストデータで比較のためのデータを取得」

とデータを使用すると、

未知のデータに対する正確性がわからないからだ。

 

なので、比較用にデータを確保する必要がある。

f:id:ryoo_jp:20190516232646p:plain

 

・High Bias vs High Variance

性能がでない場合の原因は、下のいずれかである。

High Bias: underfitting

High Variance: overfitting

f:id:ryoo_jp:20190516233824p:plain

次数を横軸としたエラー数

f:id:ryoo_jp:20190516234013p:plain

正規化項を横軸としたエラー数

過学習の時は、データサンプル数を増やせば解決されうる。

f:id:ryoo_jp:20190516234311p:plain

データサンプル数を横軸としたエラー数(High variance)

 

・エラー分析

実際にエラーがでているサンプルをみて、どのようなサンプルにエラーが多いかを摘出する。

そうすれば、性能を改善するために必要な特徴量を選べていないことがわかったりする。

 

・presicion/recall

クラス分類器のうち、エラー率算出が正確でない場合がある。
それはスキューしたクラスの時である。(データに偏りがある。)

その場合、
precision : true正解数 / trueと予測した数
recall: true正解数 / 実際のtrue数 

を指標にする。

 

・おまけ

最後に至言を載せる。

BankoとBrillの研究結果

"It's not who has the best argorithm that wins. It's who has the most data."
機械学習においてしばしば勝者になるのは、
最良のアルゴリズムを持っている者ではなく、

最大のデータを持っている者だ。

coursera 機械学習コース 4週目, 5週目 まとめ

ニューラルネットワーク

複雑で非線形なデータを分けたりできるアルゴリズム

仮説関数は下図のようになる。

 

パラメータやレイヤの数は、データの特徴数や最後のクラス数によって変わる。

f:id:ryoo_jp:20190516225046p:plain

仮説関数

 

目的関数は下図のようになる。

ロジスティック回帰の目的関数を一般化し、多クラスを計算するように改良したものである。また、過学習しないよう、正規化項も入れる。

f:id:ryoo_jp:20190516225143p:plain

目的関数

 

ここから、目的関数が最小になるθを求めるために、

フォワードプロパゲーションとバックプロパゲーションを行う。

フォワードプロバケーション

f:id:ryoo_jp:20190516225352p:plain

フォワードプロバケーション

バックプロパゲーション

f:id:ryoo_jp:20190516225440p:plain

バックプロパゲーション

 

※ぶっちゃけ、バックプロパゲーションに関しては、

なぜこの式でθを求められるのかが全く理解できていない。

 

θを求めるときに、しばしばバグが起こるらしい。

数学的にもシンプルでなく、複雑なアルゴリズムゆえの弊害である。

 

なので、勾配チェックと言うプロセスを挟む。

これは学習前に行う。

勾配チェック

f:id:ryoo_jp:20190516225712p:plain

勾配チェック

 

以上。

 

所感:

4,5週目で急に難易度上がったぞー。

がんばろ。

coursera 機械学習コース 3週目 まとめ

クラス分類

クラス分類については、

線形回帰ではなくロジスティック回帰を用いると良い。

ロジスティック回帰の仮説関数は、常に出力結果が0から1に収まるからだ。

 

ロジスティック回帰 

シグモイド関数を使う。

下図のように、常に0から1に収まる。

この出力値に100を掛けると、確率として扱うことができる。

f:id:ryoo_jp:20190508155508p:plain

シグモイド関数

決定境界

最適なθを算出し、仮説関数とデータを可視化する。

可視化することで、過剰適合し過ぎていないかなどがチェックできる。

f:id:ryoo_jp:20190508155749p:plain

決定境界

ロジスティック回帰の目的関数と最急降下法

目的関数は、y が 0 の時、1の時とそれぞれlog関数を使う。

y=0の時はh(x)を0に近づけ、y=1の時はh(x)を1に近づけるような式を組む。

 

最急降下法については線形回帰と同じく、

以下の式を計算し、最小になるようなθを見つける。

f:id:ryoo_jp:20190508161624p:plain

 

※fminunc関数というものがoctaveで標準で備わっている。 

これは最急降下法をプログラムで実装しなくても、

学習率と学習回数を指定すれば、最適なθを見つけてくれる非常に便利な関数だ。

 

多クラス分類

1 vs 1 の構図を強制的に作る。

f:id:ryoo_jp:20190508162216p:plain

多クラス分類

過剰適合(オーバーフィッティング

例) 右図のように訓練データに適合し過ぎて、一般化できていない。

逆に左図はアンダーフィッティングといい、単純化され過ぎている例。

f:id:ryoo_jp:20190508162406p:plain

過剰適合

対処方法

1.特徴量を減らす

2.正規化する

 

・3次以上の項にペナルティを与えることで、2次関数に近くなる

・全ての項にペナルティを与えることで、どれを縮めるべきかわからない点を解決する

・正規化パラメータλを掛ける

-> λが大きければ大きいほど、直線に近くなる(アンダーフィッティング)

f:id:ryoo_jp:20190508162730p:plain

正規化

 

線形回帰の過学習対応

f:id:ryoo_jp:20190508162904p:plain

線形回帰の過学習対応

 

f:id:ryoo_jp:20190508163001p:plain

ロジスティック回帰の過学習対応



 

coursera 機械学習コース 2週目 まとめ

多項式回帰

仮説関数について、

行列の演算を用いて以下の数式に変換することができる。

\Large h_\theta(x)=\theta^Tx 

f:id:ryoo_jp:20190426112503p:plain

多項式回帰の仮説関数


最急降下法

単回帰と同じく、

目的関数を最小にする仮説関数の \theta_nを、

最急降下法を用いて求める。

 

下図の左が単回帰、右が多項式回帰である。

数式のパターンが同じだということがわかる。 

f:id:ryoo_jp:20190426114138p:plain

最急降下法アルゴリズム

 

※学習率α に掛けている項は、目的関数を \theta_n偏微分したものである。

 

フィーチャースケーリング

特徴同士の数字の差が大きいとなかなか最小値に収束しないので、

データセットの特徴の数字を揃えるというもの。

 

f:id:ryoo_jp:20190426120040p:plain

フィーチャースケーリング

 

平均正則化

フィーチャースケーリングで用いられる方法で、平均正則化というものがある。

これは、各データから平均値を引き、標準偏差で割るというもの。

このプロセスを学習前に挟み、学習しやすくするようデータ処理を行う。

f:id:ryoo_jp:20190426120111p:plain

平均正則化アルゴリズム

 

 

 

正規方程式

何度も試行し最小値を割り出すための \thetaを求める最急降下法の一方、

式を一つ計算するだけで[:tex \theta]を求める方法が、正規方程式。

 

式は以下の通り。

 \theta = (X^TX)^{-1}X^Ty

 

最急降下法と正規方程式の比較

最急降下法

●長所

特徴量が多くても機能する

●短所

適切な学習率を選ぶ必要がある。

ステップが多い

フィーチャースケーリングが必要

 

正規方程式

●長所

学習率を選ぶ必要はない

ステップが1回ですむ

フィーチャースケーリングが必要ない

●短所

X^t X ^-1 を解く必要がある

特徴量が多いと、計算量が多くなる(オーダー3乗)

(特徴量数が10000を超えてくると、最急降下法の方が良さそう)

 

所感

第1週と比べると相当難しくなった。

まず、僕が行列の計算方法について完全な素人だったので、

その理解からスタートした。

 

実際にノートに書いて計算することが、理解にとても役立ったと思う。

そういう地道な作業をやっていたこともあり、

この週の講義の全てを理解するのに10日ほど要した。

 

いやー大変だった。

2週目終了の時点でも達成感が半端ではない。

 

※余談

このコースの後半では、

どの特徴を学習に利用するべきか?を選定するアルゴリズムを扱うらしい。

楽しみ。

coursera 機械学習コース 1週目 まとめ

学んだことの整理を目的として、

courseraの機械学習コースの講義を週ごとにまとめていく。

 

機会学習とは

アーサー・サミュエルの定義(1959)

Machie Learning:

Field of stody that gives computers the ability to learn without being explicityle programmed. 

 訳) コンピュータに明示的にプログラムすることなく学習する能力を与える研究分野。

 

これから書いていくような、「線形回帰」などの数学の分野を使って、

コンピュータに能力を与えていくわけか。

 

トム・ミッチェルの定義(1998)

Well-posed Learning Problem: A computer program is said to learn from experience E with respect to some task T and some performance measure P, if its performance on T, as measured by P, improves with experience E.

訳) コンピュータ・プログラムは、ある課題Tについて、ある性能基準Pに基づき、もしTについての性能が基準Pで測定して、経験Eと共に改善している場合に、経験Eから学習したと言うことが出来る。

チェスで相手に勝つためのプログラムでいうと、

T: チェスのプレイ, P: 相手に勝つ確率, E: 1000回のチェスのプレイ

 

アルゴリズムの種別

教師あり学習

アルゴリズムに与えたデータセットに「正しい答え」が与えられている。

・回帰問題: 連続値の出力

例) 家賃の予測

・クラス分類: 分類の出力

例) 腫瘍が悪性か良性かを判断する

 

教師なし学習

アルゴリズムに与えたデータセットに「正しい答え」が与えられていない。

クラスタリング: 出力結果から別々のクラスタに分類する。

例) 記事のトピック分け,  

 

 教師あり学習アルゴリズムの仕組み

f:id:ryoo_jp:20190418112620p:plain

教師あり学習アルゴリズムの仕組み

図のように、訓練データを学習アルゴリズムに読み込ませ、仮説関数を作成。

その仮説関数に変数を入力し、出力結果を得る。

 

・仮説関数(単回帰の場合)

\Large h(\theta)=\theta_{0}+\theta_{1}x

※単回帰の単は変数が一つだということを表す。

この仮説関数のうち、予測に最適な\theta_{0}\theta_{1}を見つける。

 

・目的関数

仮説の二つのパラメータの最適値を見つけ出す関数のことを指す。

f:id:ryoo_jp:20190418121918p:plain

目的関数

仮説関数の出力と訓練データの差の2乗の合計を、全訓練データで行う。

それを平均したものが目的関数。

※2乗するのは、+や-の符号を考えなくするため。

 

この目的関数を最小化する\theta_{0}\theta_{1}を、

より効率的に見つけるのがやりたいことである。

 

最急降下法

f:id:ryoo_jp:20190418125047p:plain

最急降下法アルゴリズム

f:id:ryoo_jp:20190418125322p:plain

仮説関数を代入した結果




以降は行列の演算方法。

省略する。

 

 

学習のポイント

ng教授はこう述べていた。

 

アルゴリズムを実践的に正しく使うことを学ぶことが重要。

アルゴリズム自体を知っても意味がないということ。

また、

多くのシリコンバレーの開発者は、Octave を使ってアルゴリズムを試作し、のちにC++Javaに移植する。

生産性を高めるためにOctaveから始めることを強く推奨されていた。

 

頑張るぞー。

 
 
 
 

 

教師あり学習アルゴリズム#2 線形回帰・リッジ回帰

線形回帰

線形回帰(通常最小二乗法)は、最も単純で、最も古典的な線形回帰手法。

訓練データにおいて、予測と真の回帰ターゲットyとの平均二乗誤差が最小になるように、パラメータw(係数・傾き)とbを求める。

※平均二乗誤差: 予測と真の値との差を二乗したものの平均値。

 

例えば特徴量が1つだと、直線の回帰モデルとなる。

また2つなら平面に、高次元においては超平面となる。

 

リッジ回帰

予測に用いられる式は、線形回帰と同じ。

しかし、訓練データに対する予測だけでなく、他の制約に対しても最適化する。

そして、傾きを小さくする正則化を行う。(L2正則化)

正則化: 過剰適合を防ぐために明示的にモデルを制約すること

 

上記二つの特徴

線形回帰・リッジ回帰ともに、訓練スコア > テストスコア

訓練スコアにおいては、線形回帰 > リッジ回帰 (正則化しているため)

テストスコアにおいては、リッジ回帰 > 線形回帰

ただし、データ量が増えれば増えるほど、線形回帰の性能はリッジ回帰に追いつく。

 

つまり、訓練データが十分であれば、正則化の重要性は下がってくる。

 

Lasso

リッジ回帰同様に係数が0になるように制約をかける。(L1正則化)

ただリッジ回帰とは違い、いくつかの係数が完全に0になる。

 

まずリッジ回帰を試す。

特徴量がたくさんあって、そのうち重要なものがわずかしかないことが予測できれば、

Lassoの方が向いている。

 

総じて、

訓練データセット -> アルゴリズムで学習 -> 関数作成(仮説)

出た関数に対してテストデータを与え、結果の精度を見る。

という流れ。

教師あり学習アルゴリズム#1 k-最近傍法

最も単純な学習アルゴリズム

対象のデータから最も近いk個のデータから識別する。

 

クラス分類・回帰も存在する。

 

利点

アルゴリズムが理解しやすい。

あまり調整しなくても十分に高い性能を出す。

 

欠点

処理速度が遅い。

多数の特徴量を扱うことができない。

 

競艇予測に適用し、

特徴量を選手の勝率・モーターの勝率・環境などを変数としてやってみる価値あり。