回帰の最近の記事

線形モデル(linear model)は、実用的に広く用いられており、入力特徴量の線形関数(linear function)を用いて予測を行うものです。
まず、説明に入る前に言葉の定義から紹介します。

線形回帰

データがn個あるとした時にデータの傾向をうまく表現することができるy=w_0×x_0+....+w_n×x_n というモデルを探し出すこと

正則化

過学習を防いで汎化性を高めるための技術で、モデルに正則化項というものを加え、モデルの形が複雑になりすぎないように調整している
 (モデルの係数の絶対値または二乗値が大きくなってしまうと、訓練データのモデルに適合しすぎて、テストデータのモデルの当てはまりが悪くなる過学習という現象が起こるので、過学習を避けるために正則化項をつけている)

重み

説明変数(求めたいものに作用する変数)が目的変数に与える影響度合いを表現したものです。例えば上の線形回帰モデルでいえばw1やw2など説明変数の係数が重みに当たる

コスト関数

構築したモデルがどれだけ悪いかを測定する関数
機械学習の分野ではコスト関数を最小化することがモデル構築では重要となる

モデルの比較

Ridge回帰とLasso回帰は大きな差があるわけではありません。
根本の考えは同じだが、視点を変えてみたようなものです。
まずは根本の考えについて(E:誤差関数 , λ:正則化パラメータ)
S=E+λ(Lpノルム) について考えます。


p=1の時がRidge回帰、p=2の時Lasso回帰である

ノルムの定義は以下の通りです。
images.png

unitball.gif.png

モデルの特徴をノルムの次元数から推測すると以下のことがわかります。


1.L1ノルムはパラメータの一部を完全に0にするため、モデルの推定と変数選択を同時に行うことができる
2.次元数>>データ数の状況で強力
3.L2ノルムは微分可能であり解析的に解けるが、L1ノルムは 解析的に計算出来ない
4.L1ノルムには様々な推定アルゴリズムが提案されている

以上のことから、常にどのノルムが一番優れているということはほとんどありません。

L1ノルムはパラメータが0になりやすく、正則化の影響が非常に強いことに対してL2ノルムは過学習になりやすく、正則化の影響が少し弱いです。
Ridge回帰は他と余りにもかけ離れたデータの重みを0にする事で、学習用データから削除するもの
Lasso回帰は他と余りにもかけ離れたデータの大きさに応じて0に近づけて、学習結果を滑らかにするもの
ということが分かりました。
つまりRidge回帰は訓練データに対する精度は高いですが、テストデータに対する精度は少し低くなります。
一方、Lasso回帰は訓練データに対する精度はRidge回帰に比べ低くなりますが、テストデータに対する精度はRidge回帰よりも高くなります。

実際に使う場合には、この 2 つのうちではRidge回帰をまず試してみると良いでしょう。しかし、特徴量が多く、そのうち重要なものは僅かしかないことが予測されるのであれば、Lasso が適しています。
同様に、解釈しやすいモデルが適している際は、重要な特徴量のサブセットを選ぶLasso のが理解しやすいモデルが得られます。

はじめに

昨日まで開催されていたKaggleの2019 Data Science Bowlに参加しました。結果から言いますと、public scoreでは銅メダル圏内に位置していたにも関わらず、大きなshake downを起こし3947チーム中1193位でのフィニッシュとなりました。今回メダルを獲得できればCompetition Expertになれたので悔しい結果となりましたが、このshake downの経験を通して学ぶことは多くあったので反省点も踏まえて今回のコンペを振り返っていきたいと思います。


コンペ概要

幼児用教育アプリを使う子ども達の能力を予測するコンペです。具体的な予測は次のようになります。
アプリ内でプレイ可能なゲームがそれぞれAssessment、Game、Activity、Clipの4つの分野に分類されます。そのうちAssessmentに分類されるゲームをプレイした際の問題の正解率を過去のプレイ履歴を元に0、1、2、3の4段階で予測します。モデルの評価指標はQuadratic Weighted Kappa (QWK)が採用されており、これがこのコンペで大きなshakeを生む原因の1つだったと言えます。
実際に多くの人がshake upまたはshake downし、private leaderboardにおいて1000位以上順位が動いた人もたくさんいました。


取り組み

以下で私がこのコンペで行った取り組みを記述していきます。


EDA

コンペの序盤は公開してくれているNotebookを元にEDAを行いました。
中盤以降はゲームの細かいプレイ履歴を見るためにテーブルデータそのものを見て、データ中の項目が何を示しているか注意深く観察するようにしました。


特徴量作成

特徴量は公開Notebookをベースとしました。そこにEDAやDiscussionを元に特徴量を作成して、モデルの精度が向上するかどうかトライアンドエラーを繰り返しました。


データの前処理

testデータの各特徴量の平均値をtrainデータに合わせて変換しているNotebookを見つけ、自分のパイプラインに取り込んだところ精度が大きく向上したのでそれ以降ずっとこの手法を取り入れていました。
しかし、正直なところ過学習の原因になりかねない危ない処理だとも考えていました。


モデル

今回はLGBMとXGBoostを試しました。それぞれのモデル単体ではLGBMが良い性能を示し、アンサンブルで2つのモデルを用いても性能の向上が見られなかったため最終的にはLGBMのみ使いました。
LGBM1つの時に比べて、Local CVのスコアが高くなるランダムシードを5つ選びseed averagingを行ったモデルがpublic scoreで少し良い結果でした。今回のコンペでは評価指標のQWKが原因でpublic scoreが不安定であったので、アンサンブルをせず1つのモデルの結果を提出しているチームも多かったです。しかし、private scoreではやはりアンサンブルを用いた方が結果が良かったようです。


データの後処理

予測結果としては問題の正答率から0、1、2、3のラベルに分類するタスクでした。しかし、多くの参加者がregressionを使って連続値で予測した後に閾値を決めてそれぞれのラベルに分類する手法を取り入れていました。
この閾値を決定する方法が2つありました。1つはvalidationスコアからQWKが最適化されるように閾値を決定する方法。もう1つはラベルの割合がtrainデータと一致するように閾値を決定する方法です。
trainデータとtestデータの分布が似ていると仮定し私は後者を選びました。


結果

冒頭でも述べましたが最終日に銅メダル圏内に突入したものの、モデルがpublic leaderboardに対してひどい過学習を起こしておりprivate leaderboardでは900位近く順位が下がり3947チーム中1193位となりました。


反省

自分なりに大きなshake downの原因が何だったかいくつか要因を考えてみました。

まず第一にデータの前処理でtestデータの各特徴量の平均値をtrainデータの平均値に合わせたことです。 この処理はtrainデータとtestデータの分布の差を少なくするためのものでした。しかし、testデータがtrainデータと同じ分布に由来していた場合に、平均値を調整することでpublic scoreが上がるのはpublic leaderboardに過学習していると考えられます。
上位陣がこの前処理を行っていないことから、実際にこの処理がpublic leaderboardに過学習する原因になっていると言えます。

次にshake downの原因として考え得るのは、予測ラベルの割合をtrainデータに合わせにいったことです。この処理ではtestデータの正解ラベルの割合がtrainデータの割合と似ていると仮定していますが、public testデータが少ない状況でこの処理は危険であったと思います。
上位陣の解法でもこの手法は使わずに、validationデータに対してQWKを最適化して閾値を決めていました。

コンペ終了後に最終のsubmissionとして選ばなかったものを見ると、過学習を起こしうる処理を使う前のものではメダル圏内のscoreのものもありました。
このコンペを通してpublic scoreを改善することよりもロジカルに考えてパイプラインを構築することが大切だと実感しました。特に今回はtestデータが非常に少なく大きなshakeが起きる可能性が高いと自覚しながら、また過学習になりかねない処理だとも自覚しながら、public scoreを追ってしまったことは反省しなければならないところです。


まとめ

銅メダル圏内から900位近くshake downするという悔しい経験ではありましたが、そこから学ぶこと多くありました。やはりモデル構築の際は論理的に筋の通った処理をする必要があるなと感じました。今回の反省を活かし上位陣の解法から学べることは吸収して精進していきたいと思います。


Twitter・Facebookで定期的に情報発信しています!

〜普及に向けた課題と解決策〜に続き

 私が前回作成した記事である「海洋エネルギー × 機械学習 〜普及に向けた課題と解決策〜」では、海洋エネルギー発電の長所と課題とその解決策について触れた。今回はそこで取り上げた、

課題①「電力需要量とのバランスが取りにくい」、課題③「無駄な待機運転の時間がある」への解決策

~発電量・電力需要量予測~ ~機械学習を用いた制御~

を実装してみる。

 繰り返しにはなるが、この「発電量・電力需要量予測」と「機械学習を用いた制御」とは、まずカレンダー条件(時間帯、曜日など)と気温や日射強度などの気象条件を説明変数として電力需要量を予測し、電力需要量の送電にかかる時間分先の予測値と同量を発電するように発電装置を制御するという、極めて単純な制御である。前提として、電力は常に需要量と供給量(発電量)が同量でなければ、停電を起こしてしまうのであるが、この制御を行えば、需要と供給のバランスを常に保ちながら発電することができる。また発電装置の無駄な待機時間も削減され、設備稼働率も向上する。このようにして、課題①「電力需要量とのバランスが取りにくい」、課題③「無駄な待機運転の時間がある」を解決するのである。今回は発電方法を波力発電としてこれを実装する。


目次

  1. 今回の実装の設定
  2. 機械学習による電力需要量の予測
  3. 並進動揺型の波力発電装置の運動制御
  4. 考察
  5. 参考文献


1. 今回の実装の設定

1-1. どんな波力発電装置で実装するか

 まず波力発電装置の種類は表1、図1のように分類できる。

表1 波力発電装置の種類

スクリーンショット 2019-12-26 12.44.18.png スクリーンショット 2019-12-26 14.54.18.png

 図1波力発電装置の種類


 今回の実装では、垂直(上下)にのみ変位する並進動揺型の波力発電装置を考える。並進運動型の波力発電装置の特徴は、

  • 波に対する指向性がなく、他の発電装置に対して波向きの影響の点から優位である
  • 構造がシンプルで発電機構(PTO: power take off)も含め大部分が水中に没しているので、浮体本体の構造安全性や信頼性の点で有利である
  • 波浪荷重、発電荷重を下端で支えているため繰り返しの係留力が作用することになり、下部の構造強度に配慮する必要性がある
  • 発電装置が水面より下側にあることから、上部からの浸水に対しては十分注意が必要

 また、現在最も実用化に近いものと見られる波力発電装置は、米国のOcean Power Technologies社が開発した並進動揺型の波力発電装置「PowerBuoy」(図2)である。 スクリーンショット 2019-12-26 14.54.47.png

図2Ocean Power Technologies社の「PowerBuoy」


1-2. 実装の設定

 今回の設定は、1機の上下揺のみする並進動揺型の波力発電装置から、ある海沿いの一軒家に直接電力を供給するという状況を考える。波力発電装置から一軒家への送電時間は10分かかるとする。つまり上記の制御をこの波力発電装置に行うには、現在(時刻\(t\))の発電量\(P(t)\)が10分後(\(\tau=10~[分]\))の電力需要量の予測値\(P_{ML}(t+\tau)\)と等しくなる必要がある。


2. 機械学習による電力需要量の予測

 ある一軒家の電力需要量(電力使用量)を予測する時、本来ならば上記に示したようにカレンダー条件と気象条件を説明変数とするべきだが、カレンダー条件と気象条件、電力消費量のデータセットを手に入れることができなかったので、今回は特徴量を表3のようにしたデータセット(表4)を用いる。これは2016年1月11日17時00分から2016年5月11日16時50分までのデータセットである。

表3 データセットの特徴量

スクリーンショット 2019-12-26 16.11.02.png


表4 データセットの一部

スクリーンショット 2019-12-26 15.03.37.png


 初めに示しておくが、電力需要量は暑い夏や寒い冬など季節によって変動する。であるから正確に予測するためには少なくとも1年以上のデータ数が必要となるが今回はデータ数が1年に満たない。なので当然予測精度は悪くなると考えられるが、今回は実装手順を紹介したいので、精度については目を瞑る。
 予測モデルは時系列データに強いと言われているLSTMを用いた。すると予測結果は図3のようになる。破線はデータ値で、赤線が予測値である。但し値は0から1になるように正規化されているため、正規化された赤線の値を元に戻した値が\(P_{ML}(t+\tau)\)である。図3を見て分かるように電力需要量が多い時の予測値は実際の値とかなりずれているが、それは想定内で、それ以外の時は良く予測されている。この予測値を波力発電装置の制御に用いる。

スクリーンショット 2019-12-26 13.41.48.png

図3 予測結果


3. 並進動揺型の波力発電装置の制御

 まず、波浪中を自由に動揺する浮体(水面に浮く物体の総称)の問題は船舶流体力学の知識から、以下の二つの問題に分別することができる。

表5 波浪中を自由に動揺する浮体の問題の分類

スクリーンショット 2019-12-26 14.49.14.png


 ディフラクション問題において浮体に働く力には以下のようなものがある。但し、重力と浮力は釣り合っているとして除外する。

表6 ディフラクション問題において浮体に働く力

スクリーンショット 2019-12-26 14.49.41.png


 ラディエイション問題において浮体に働く力には以下のようなものがある。

表7 ラディエイション問題において浮体に働く力

スクリーンショット 2019-12-26 14.50.02.png


 当然ではあるが上下揺のみする並進動揺型の波力発電装置も浮体の一つであるから、ここでは浮体と呼ぶことにする。
 まず浮体の動揺を制御していない場合、波浪中の浮体の運動方程式は、浮体の上下方向の運動変位を\(z\)、上記で示したラディエイション力、復原力、波浪強制力の上下方向成分をそれぞれ\(F_{3}^{R}(\ddot{z},\dot{z})\)、\(F_{3}^{S}(\ddot{z},\dot{z})\)、\(F_{3}^{W}(\ddot{z},\dot{z})\)とすると、 \[ m\ddot{z}(t)=F_{3}^{R}(\ddot{z},\dot{z})+F_{3}^{S}(z)+F_{3}^{W}(t)\tag{1} \] と表せる。ここで\(F_{3}^{R}(\ddot{z},\dot{z})\)、\(F_{3}^{S}(z)\)、\(F_{3}^{W}(t)\)は数値計算または計測されていて既知であるとする。
 次に浮体の動揺を制御する場合、浮体の運動方程式は式に制御力\(G_{3}(t)\)を加えて、 \[ m\ddot{z}(t)=F_{3}^{R}(\ddot{z},\dot{z})+F_{3}^{S}(z)+F_{3}^{W}(t)+G_{3}(t)\tag{2} \] と表せる。この制御力\(G_{3}(t)\)を調節することで、望んでいる量を発電するように浮体を動揺させることができる。
 発電量\(P(t)~[W]\)は、発電機構の巻線抵抗\(R_{s}~[\Omega]\)、推力係数\(K_{t}~[N/A]\)を用いると、機械入力\(-G_{3}(t)\dot{z}(t)\)から発電ロス\(\cfrac{ R_{s} }{ K_{t}^{2} }G_{3}^{2}(t)\)の差として表せるので、 \[ P(t)=-G_{3}(t)\dot{z}(t)-\cfrac{ R_{s} }{ K_{t}^{2} }G_{3}^{2}(t)\tag{3} \] となる。
 この発電量\(P(t)\)を、機械学習(machine learning)で予測した時刻\(t+\tau\)の電力需要量\(P_{ML}(t+\tau)\)となるように制御したいので、 \[ P(t)=P_{ML}(t+\tau)\tag{4} \] とする。すると式\((3)\)は\(G_{3}(t)\)の二次方程式 \[ \cfrac{ R_{s} }{ K_{t}^{2} }G_{3}^{2}(t)+\dot{z}(t)G_{3}(t)+P_{ML}(t+\tau)=0\tag{5} \] となる。二次方程式の解の公式より、制御力\(G_{3}(t)\)は \[ G_{3}(t)=G_{3}(\dot{z})=\frac{ -\dot{z}(t)\pm\sqrt{ \dot{z}^2(t)-4\cfrac{ R_{s} }{ K_{t}^{2} }P_{ML}(t+\tau) } }{ 2\cfrac{ R_{s} }{ K_{t}^{2} }}\tag{6} \] と求まり、浮体の上下揺の速度\(\dot{z}\)の関数となる。この制御力\(G_{3}(\dot{z})\)を式\((2)\)に代入することで、浮体の動揺は\(P_{ML}(t+\tau)\)だけ発電するように制御される。


4. 考察

 上記で示したように制御することで、確かに需要と供給のバランスを常に保ちながら発電することができる。ただ、今回は実装の手順を示すことを目的として電力需要量の予測の精度については気にしなかったが、本来はここが極めて重要である。2章でも示したが、今回使用したデータは1年に満たないデータ数である。これでは電力需要量の朝、昼、夜の変化は捉えることができたとしても、季節の変化は捉えることができない。これが予測精度を落としている明らかな理由である。
 また、今回は10分間で送電が完了するという状況を考えたためそう遠くない未来の電力需要量を予測するだけであったが、実際波力発電装置が陸地からかなり遠い沖合に設置された場合、10分で送電できるとは考えられない。つまりもっと先の未来の電力需要量を予測できなければならない。実際に今回のデータセットで1時間先の電力需要量を予測してみたところ、かなり酷い精度になり、これでは波力発電装置の制御には使えないという結果となった。しかしこの原因もデータ数が足りないことであることは分かっている。季節の影響を捉えていないモデルで、未来を上手く予測できないのは当然である。
 上記二つの問題はデータ数を増やすことで改善できるので、長い期間の電力需要量のデータを入手次第、改めてやり直そうと考えている。
 問題はまだある。それは発電量が多い時、精度が悪くなることである。これは今のところ原因が分かっていないので、引き続き研究していく。
 また、今回は求めている発電量を発電できるような制御を行ったが、安全性については全く考慮していない。たとえ電力需要量と同量発電できたとしても、事故を起こしてしまっては元も子もない。なので、今回の制御に安全性の配慮を加えた研究も今後行っていく。


5.参考文献


Twitter・Facebookで定期的に情報発信しています!

回帰分析とは

先ず回帰分析とは、あるp個の変数Alt 最小二乗法が与えられた時、それと相関関係のあるyの値を説明、予測することである。ここで変数xを 説明変数 、変数yを 目的変数と呼ぶ。p=1、つまり説明変数が1つの時を単回帰、またp>=2、つまり説明変数が2つ以上の時を重回帰と呼ぶ。

単回帰分析

今回はp=1と置いた 単回帰分析 について説明する。

このとき、回帰式は y=ax+b(a,bは 回帰係数 と呼ばれる)となり直線の形でyの値を近似(予測)できる。

単回帰分析のデメリットとして知りたいデータを直線で近似してしまうため、精度が良くないと得られるデータに大きな誤差が生じてしまう。

しかしデータのおおよその値が視覚的に分かるため、データの大概を掴むことができ非常に便利な分析手法の1つである。

例として、ある店舗での来店者数(来場者数)について興味を持ったとしよう。ここで広告費(宣伝費)と来場者数について以下のような散布図が得られたとする。

Alt text

この散布図を見ると、グラフに弱い人でも「宣伝費が高ければ来場者数が増える」と読み取れるだろう。

そこでパラメータa,bをうまく決定し( 最小二乗法 による)、下図のように直線を引けたとしよう。

Alt text

グラフからも分かるようにデータは正しい値を取るわけではない、つまり厳密に最小二乗法とはならないことに留意せよ。

そこで後で説明する最小二乗法によって、パラメータa,bをうまく決定するのである。

最小二乗法

最小二乗法とは、誤差を伴う測定値の処理において、その誤差(残差)の二乗の和を最小にすることで最も確からしい関係式を求めることである。

Alt text

プロットされた各点(xi, yi)における回帰式( y=ax+b)との残差の和が最小となるようにパラメータa,bを決定したい。

回帰式 y=ax+b にi番目のxの値を代入して得られるy(予測値)を、

最小二乗法

とする。

そこでi番目のデータについての残差(実測値と予測値との差)をε_iと置くと、

最小二乗法

となる。このままだと残差の符号にばらつきが出るため扱いづらい。そこで残差の2乗和について考える。(サンプルサイズはnとしている)

最小二乗法

この式はパラメータ(a,b)の関数であり、最小二乗法によりこの残差の二乗和が最小となるようなパラメータ(a,b)を求める。

最小化の一階条件として上式をa,bでそれぞれ偏微分した値が0となる性質がある。先ず偏微分すると、

最小二乗法

最小二乗法

これより一階条件は、

最小二乗法

最小二乗法

となる。一般的にこの二本の方程式は 回帰の 正規方程式 と呼ばれている。

二本目の式より、最小二乗法を得るので、

最小二乗法

となる。これより、

最小二乗法

を得るが、これより y=ax+b が定点最小二乗法を通ることがわかる。

改めて、中心化した変数及びデータ、

最小二乗法

を用いると、

最小二乗法

最小二乗法

然るに、残差平方和をbを含まない式に書き換えることができる。

最小二乗法

よってaで偏微分して、残差平方和を最小にするaを求める。これをAlt textと書くことにする。

最小二乗法

最小二乗法

が得られたことになる。

決定係数

次に、求めたパラメータa,bに対して、目的変数yが説明変数xによってどれだけ説明されているかを検証してみる。

モデルの当てはまりが悪ければ、説明変数を追加するなどして、モデルを改良するための一つのインデックスとなる。

今回は、モデルの当てはまりの良さを表す指標の一つとして、 決定係数 を導出する。

決定係数とは、上で導出したパラメータa,bを持つ回帰式の精度を表す値である。

一般に決定係数は、

最小二乗法

で定義される。第二項の分母は全変動と呼ばれ、データそのもののばらつき具合を表しており、分子は残差変動と呼ばれ、回帰モデルと実測値とのズレを表している。

即ち、決定係数が1に近いほど残差変動が小さいということであり、良い予測が出来ていると判断される。

関連するTheoremとして、「最小二乗法による直線フィッティングの場合、相関係数の二乗と決定係数は一致する」というものがある。

今回はこの証明は割愛するが、 こちらのサイト から是非確認してほしい。

参考文献

最小二乗法の意味と計算方法 - 回帰直線の求め方

線形回帰分析入門〜最小二乗法から決定係数まで

はじめに

 今回はロジスティック回帰についてやっていこうと思います。まずはロジスティック回帰の概要を説明して、最後には実際にAzureでiris(アヤメ)のデータでロジスティック回帰を使っていこうと思います。

勾配降下法

 ロジスティック回帰でパラメータの値を決めるときに勾配降下法を用いるので、簡単に説明をしておきます。

 勾配降下法は、ある関数J(w)が最小となるwを求める際に、あるwでの傾き(勾配)を求めて、降下の方向(傾きが小さくなる方)にwを更新し、その更新をwが収束する(勾配≒0)まで繰り返して収束したところでのwでJ(w)が最小であると決めます。その更新の式は次のようになります。

Microsoft Azure Machine Learningでロジスティクス回帰

ここでのαは学習率といい、降下の方向にどのくらいwを移動させるかを表します。ここでαが大きすぎると最小となる点を更新の際に飛び越えて振動してしまいます。逆に小さすぎるといつまでも収束しないので、適当な値をαに決めなければいけません。またwがn次元ベクトルの場合は、そのn個について同時に更新するということにも注意が必要です(詳しくはロジスティック回帰の説明中)。

Microsoft Azure Machine Learningでロジスティクス回帰

Microsoft Azure Machine Learningでロジスティクス回帰

ロジスティック回帰とは

 ロジスティック回帰とは、ある事象が発生するかどうかを、その確率を出すことにより判定することに使われる手法で、目的変数が2値のときに使われるアルゴリズムです。具体的に言うと、アヤメの花の種類A,B(目的変数)があったとき、その花の花弁の大きさなど(説明変数)から種類を判定したいときにロジスティック回帰を使うことで判定することができます。それではロジスティック回帰の流れを見ていきましょう。

 線形回帰では目的変数yを、パラメータwによって決められる説明変数xの関数h(x)で予測しました。

Microsoft Azure Machine Learningでロジスティクス回帰

 ロジスティック回帰では、このh(x)を下図のシグモイド関数に入れた形にして、その値を0以上1以下にすることで2値(目的変数y=0,1)の分類を可能にします。

Microsoft Azure Machine Learningでロジスティクス回帰

Microsoft Azure Machine Learningでロジスティクス回帰

このh(x)はy=1である確率として解釈できるので、

Microsoft Azure Machine Learningでロジスティクス回帰

のように分類する規則を決めて判定することができます。

 では、パラメータwを決め方について見ていきましょう。結論から言うと次のような目的関数J(w)を最小にするようなwを決めます。

Microsoft Azure Machine Learningでロジスティクス回帰

目的関数はy=0,1を正しく判定したときに最小(→0)、全然一致しないとき最大(→∞)になるように設定します。そこで、h(x)≧0.5(より1に近い)のときy=1と予測し、h(x)<0.5(より0に近い)のときにy=0と予測することから、logの性質を利用して目的関数を決めました。考え方は次のようになります。

Microsoft Azure Machine Learningでロジスティクス回帰

Microsoft Azure Machine Learningでロジスティクス回帰

これで目的関数の設定はできたので、これが最小となるパラメータwを決めていきましょう。ここで使われるのは勾配降下法です。

Microsoft Azure Machine Learningでロジスティクス回帰

ここでの勾配降下法は上の式において、j=0,1,...,nそれぞれについて同時に更新して、wの値が収束するまで更新を続けてwを決定します。

目的関数を最小とするパラメータwを決めることができたので、ロジスティック回帰による予測モデルが完成しました。これで未知のデータに対して予測することができます。

これで流れは掴めたと思いまので、実際にAzureを使ってロジスティック回帰を実行してみましょう。

Azureでロジスティック回帰

 今回はAzureのサンプルデータのIris Two Class Dataを使います。はじめにデータを見てみると(画像はデータの一部)、目的変数に2種類のiris(アヤメ)のクラスを0,1で与え、説明変数にsepal-length(がく片の縦幅)、sepal-width( がく片の横幅)、petal-length(花びらの縦幅)、petal-width(花びらの横幅)の4つを与えています。

Microsoft Azure Machine Learningでロジスティクス回帰

このデータに対してロジスティック回帰を行います。

Microsoft Azure Machine Learningでロジスティクス回帰

Azureでは上のようにするとロジスティック回帰ができますが、流れを整理すると次のようになります。

Microsoft Azure Machine Learningでロジスティクス回帰

Alt text

結果を見ると、一番右の列のScored Probabilitiesはクラス1である確率(h(x))を表していて、0.5以上でクラス1とScored Labelsで判定しています。ROC曲線で評価してみると、

Alt text

完全に予測することができています。今回はサンプルデータなのでこんなにうまく予測できていますが本来はこんなにうまくいきません。

次に縦軸にそれぞれの説明変数ごとにとり、横軸にScored Probabilitiesを取った散布図を見て、どの説明変数が判定に影響を与えているかを視覚的に考えてみます。

Microsoft Azure Machine Learningでロジスティクス回帰

Microsoft Azure Machine Learningでロジスティクス回帰

Microsoft Azure Machine Learningでロジスティクス回帰

Microsoft Azure Machine Learningでロジスティクス回帰

これを見ると、petal-lengthとpetal-widthは明確にその値が大きければクラス1に属する確率が高く、小さければクラス1に属する確率が低いことがわかります。sepal-lengthもpetalよりは弱くなりますが同様の傾向があることがわかります。それに対してsepal-widthは同じくらいの値を取っていても、クラス1である確率が大きかったり小さかったりと明確には言えません。更にどちらかと言うと、値が小さい方がクラス1の確率が高くなっています。その関係がパラメータに現れていることを確認すると、

Microsoft Azure Machine Learningでロジスティクス回帰

petal-length、petal-widthのweight(係数、重み)が大きくなっていて、sepal-lengthのweightがそれに比べ小さく、sepal-widthのweightは負でかつその絶対値は小さくなっていますので、散布図の傾向はしっかりとあたっています。今回はサンプルデータでやったので、かなりうまくいってわかりやすかったですが、本来はここまできれいにはならないでしょう。

まとめ

 今回はロジスティック回帰についてやりました。非常に有名で基本的な手法ですのでしっかりと理解しておくと良いでしょう。


その他のMicrosoft Azure Machine Learning Studioでやってみた記事も参考にしてください!
決定木アルゴリズムCARTを用いた性能評価
分位点回帰を用いた飛行機遅延予測
パラメーターチューニングを行う
ランダムフォレスト回帰を用いた人気ブログタイトル予測

参考文献

Coursera 機械学習 Andrew Ng

はじめに

 今回は2分類SVMについて見ていきますが、数学や機械学習の知識があまりない方も全体のイメージを掴めるよう数式を使うことを極力避けました。ですので厳密には間違っている表記もイメージしやすいよう、わざと入れていることを始めに断っておきます。

SVMを数式を追ってしっかりと理解したいという方には物足りない内容になっていると思いますがご了承ください。

SVMとは

 SVMとは、教師あり学習を用いるパターン認識モデルの一つで、回帰、分類両方につかうことができます。ここでは2分類SVMを考えていきます。

SVMは、「マージン最大化」という考え方を用いて分類する境界(決定境界)を決めます。この考え方によって他の分類モデルよりも高い識別性能を実現していますが、その理由とともにマージン最大化を用いて、次の赤と青のクラスの分類について見ていきます。

Alt text

ここでは簡単のために二次元で直線で分類することを考えますが、三次元以上になったときは下のように平面で切っていると考えてください。なので直線と出できたら基本的には平面に言い換えられると思ってください。

Alt text

・マージン最大化

 マージンとは、分類する境界とデータとの距離のことで、いくつも考えられる境界の中から、サポートベクトルという「分類する境界に一番近いデータ点(境界を決めるのに使うデータ)」との距離が最大となるような境界を見つけようというのがマージン最大化という考え方です。このとき、それぞれのクラスのサポートベクトルに対するマージンは同じであるとします。ただし、2クラスそれぞれのサポートベクトル間の距離をマージンということもありますが、結局その距離のちょうど半分にしたところに境界を設定しているということです。つまり、どちらでマージンを設定するにしろ、2つのクラスからなるべく離れたところに境界を引きたいということです。

マージン最大化の考え方を用いて赤と青の2つのクラスを分類してみると次のようになります。

Alt text

では、なぜマージン最大化を用いて分類することで高い識別性能が得られるのでしょうか。

 上の図のような分類を考えると、その分類する境界というのは無数に考えることができます。まず考えてほしいのは分類する目的の大前提として、今ある値を分類することにより、まだどちらのクラスの属するか分からない未知の値に対してどちらのクラスに属するかを正しく予測することがあります。つまり、分かっているデータに対して正しく分類できたところで、未知のデータに対しての正しく予測できている割合が極端に低くなるような境界では全くの無意味だということです。

Alt text

Alt text

例えば、図のように片方もしくは両方のクラスの値ギリギリにあるような境界を設定してしまうと、そこからほんの少しだけずれたようなデータに対して誤分類を起こしてしまう可能性が高くなります。そこで、マージン最大化を考えることにより、データが少しずれただけでは誤分類を起こさなくなります。これによりマージンを考えて決めた境界で分類することにより、それを考えずに境界を決めたモデルより「汎化能力(新しいデータに対して正しく予測する能力)」が高くなっています。このことから、SVMはマージン最大化を考えることにより、汎化性能が最も高い境界により分類を行うことを可能にしています。

・ソフトマージン

 ここまでは、2クラスに対して直線で分類可能(線形分離可能)なデータに対して考えてきましたが、データが次のようになっていたらどうでしょう。

Alt text

 データがこの様になっていた場合、直線で2クラスを完全に分類するのは不可能です。このようなデータに対して完全に分類しようとすると、もし誤分類をしてしまったデータに分類に大きく影響するような情報が含まれていた場合、汎化能力が下がってしまいます。ここで出てくるのがソフトマージンです。

実は先程までの、線形分離可能なデータに対して考えたマージンをハードマージンといい、これは完全に2つのクラスを分類できることを前提にしたマージンです。それに対してソフトマージンは、あらかじめ誤分類を許すことで汎化性能を高めることを考えたマージンです。もちろん、誤分類が多すぎては汎化性能を高めるどころか低くしてしまう一方なので、「境界線とデータがなるべく離れていること」・「誤分類数をなるべく少なくすること」の2つを達成するようにします。

そこで次のような値を最小にすることを考えて、境界を決めます。

Alt text

ここでCは、「どの程度まで誤分類を許すか」を表すパラメータです。Cが小さい場合、多少誤分類数が多くても値は大きくならないので、ある程度誤分類を許すことになります。それに対して、Cが大きい場合、誤分類数がより0に近くなければ値が大きくなってしまうので、あまり誤分類を許さないことになります。Cが無限に大きければ誤分類を許さなくなるので、上でのハードマージンと一致します。つまりCの大きさを調整すればハードマージン・ソフトマージンの両方を実現することができるので、C-SVMで両方の問題に対応できます。

 C-SVMで分類した様子は次のようになります。

Alt text

ここで、なんでマージン境界内に点が入ってくるのか、なんでサポートベクトルが色々増えているのかと思ったと思います。実は上で書いた式に少しだけ嘘が含まれていて、そこは誤分類数のところです。ここの値はダイレクトに誤分類数を表しているのではなく、誤分類したデータやマージン境界内にあるデータによって決まる値なんです。詳しく言うと、マージン境界より外で正しく分類できている点に対しては0、マージン境界内で正しく分類できるデータに対しては0から1の間の値、誤分類している値に対しては1より大きな値を与えます。なので、境界を決める際に誤分類のデータとマージン境界内のデータにより決めていることになります。そこでサポートベクトルの定義に戻ると、境界を決めるのに使う(影響のある)データなので、今までは境界から一番近いデータ(紫)がそれになっていましたが、ここではそれ以外にもマージン境界内のデータ(緑)と誤分類をしたデータ(黄色)が使われるのでそのデータもサポートベクトルになっているのです。そのそれぞれにも名前がついていて、マージン境界上のデータ(紫)が自由サポートベクトル、それ以外のサポートベクトル(黄・緑)を上限サポートベクトルといいます。実際にはこんな値が入りますが、結局一番影響を与える誤分類数をCでどの程度にするのかが一番重要ですので、そこをまずは抑えて、境界を決める要素が増えたんだなーと思っていいただければいいと思います。

Alt text

 ソフトマージンにより非線形分離不可能なデータに対してSVMを適用できましたが、ここでのCは自分で決めなければならず、まず最適なパラメータを見つける必要があります(これがSVMの欠点につながる)。ここでは詳しいことは述べませんが、その方法としてグリッドリサーチ(色々なパラメータを試して精度の良いものを採用する)などがあります。

・カーネルトリック

 ソフトマージンにより、直線で分離が不可能な場合でも誤分類により境界を決定することができましたが、直線で分離をしているので、ある程度の性能しか望むことができません。そこで登場するのがカーネルトリックです。この手法によりSVMは強力な威力を発揮します。

 この手法を考えるときに次のような2クラスを分類することを考えます。

Alt text

 これを分類しようとしたときに、今まで出てきたSVMを使ってやろうとしてもうまくいかないだろうと思うはずです。そこで、直線だけでなく曲線を使えるとしたら、下のような境界を使って分類することができれば良いですよね。

Alt text

 この境界を引くことをできるようにしたのがカーネルトリックです。

 では、どのようにこれを可能にしているのかを数式は使わず考え方を中心に説明します。参考書なんかを見ると特徴空間に変換して分類するみたいなことが書いてあると思います。これは、今ある特徴量(上の赤と青の位置を決めているもの)では分類できないものを、新しい特徴量を作って分類できるようにしようということです。

※特徴量のイメージをしやすいように、予測の流れを出しときます。

Alt text

ここでのカーネルのイメージとしては、直線で分類できないものを、マージン最大化の最初で出てきたようなデータがある程度分かれた状態にして、直線で分類できるようにするというものです。これを簡単な例で見ていきましょう。

 次のようなデータが数直線上にあったらどう頑張っても直線では赤と青のクラスに分けるごとができません。

Alt text

そこで二乗した値を作るとどうでしょう。

Alt text

すると、このように直線で分類することができるようになります。厳密に言うと違うのですが、イメージ的にはこのような変換をカーネルで行います。実はカーネルにも種類があって代表的なのはガウスカーネルと多項式カーネルですが、ここでは主にガウスカーネルについて考えていこうと思います。

 ガウスカーネルは簡単に言うと値と値の近さを表しているものです。例を見るとイメージが掴めると思うので、円の境界を引きたいと思った例で考えてみましょう。

 この例では感覚として、真ん中らへんとその周りに分けることを考えたと思います。その感覚で真ん中らへんとそれ以外をはっきり分けられるような特徴量を今あるデータ(特徴量)から作れないかなーと考えるわけです。そこでガウスカーネルによって特徴量を考えていきますが、近くにあるデータは似た特徴量を持っていてほしいじゃないですか。例えば真ん中らへんにあるデータに対しては小さいけど、周りにあるデータに対しては大きい特徴量があれば、下のようになって分類しやすくなります。

Alt text

ガウスカーネルはデータとデータの近さを基準としてこの変換を行います。まずある一点を基準として、他のすべてのデータとの近さに関する値を出します。これを、基準を変えてすべてのデータ間の近さを調べて、それを使った値を特徴量として変換を行います。ここでどのくらいの近さまでを同じクラス、似た特徴量を持ったとするのかという問題が起きます。これを決めるのにはカーネルの中にあるパラメータを決めて調整しなければいけません。ただ、基本的には近さでデータの特徴を決めたいんだということだけまずは理解してほしいです。

 分かりやすいように、3つのデータだけで考えてみましょう。それぞれの点からの距離を取って、ある点からAまでの距離を特徴量a、Bまでの特徴量をb、Cまでの特徴量をcとします。実際は今あるデータの特徴量を使ってガウスカーネルで変換しますが、ここでは簡単のため距離をそれぞれ設定しました。

Alt text

ここで、特徴量a、b、cをそれぞれの点でみると、CだけA、Bとは逆(A,Bからの距離が近いときはCは遠い)になっていることが分かると思います。つまり、クラスの違うCだけが仲間はずれとなっています。こういったことを、もっとデータ数が多くて、直線で分類できない問題に対してカーネルを使って変換することでやっているのがカーネルトリックです。多項式カーネルは、意味としては最初に二乗した例に近いことがあるかもしれませんが、やりたいことは同じです。

 では、元の例に戻ってカーネルで変換する様子の一部分見ると次のようになります。

Alt text

このように特徴量を変換するとイメージとしては次のようになり、分類が明らかにしやすい配置になっているのが分かると思います。

Alt text

 まとめると、直線で分類できないものをカーネルを使ってデータの特徴量を、クラスの違う特徴量に変えて直線で分類しているということです。特徴量を変換したあとは、マージン最大化で分類をするので、上のカーネルを使わなかった分類と同じです。では、どのようにしてカーネルのある無しを使い分けたらいいのかを見ていきましょう。

・カーネルのある無しの使い分けとSVMの欠点

 上のカーネルを使わないSVMと使うSVMを比べたとき、一見カーネルを使ったほうがそのままだと直線で分類できてものも分類できるからそっちを使えばいいと思うかもしれません。しかし、カーネルを使うのにも欠点があります。カーネルはより良い特徴量を取るために変換を行いましたが、もうすでに十分多くの特徴量が得ることができていたらどうでしょう。色んな特徴量があればそれだけ問題は複雑になるので、更にそこから変換を行うと今あるデータに厳密に従いすぎてしまいます(過学習という)。つまり新たなデータに対して無意味な境界になってしまうので、この場合はカーネルを用いないSVMを使ったほうがいいです。

 逆に、特徴量が少ない場合、つまり十分な特徴量は得られない場合はどうでしょう。この場合はデータが非常に単純な場合を除いて、上で見てきたようなような直線で分類できないような問題になっている可能性が高いので、カーネルを用いたSVMを使うといいです。

 ただ、データがかなり多い場合はカーネルを使うと、変換をするときに計算量が多くなってしまうので、この場合は変換をするのではなく特徴量を自分で増やして、十分にとってからカーネルを用いないSVMを使うといいです。

 また、SVMの欠点としてはパラメータを設定しなければならなかったり、カーネルを選ばなければならないことや。データが多いときはあまり効率的ではありません。この問題をクリアしている手法として「ランダムフォレスト」があります。これを使えばSVMより効率よく良い結果が得られるかもしれませんが、これは実際に使ってみないとどちらの手法が良いのかは判断できませんし(どちらにも長所・短所がある)、それぞれの特徴をしっかり理解することが重要です。

まとめ

 今回は2分類SVMについてやりました。数式をほとんど使わなかったので、逆に分かりづらいところもあったかもしれませんが、SVM全体のイメージは掴めたでしょうか。SVMは他にも1クラスに対して外れ値を検出するものや、回帰にも使えますし、ロジスティック回帰との関係を見ても面白いと思います。また、最後に出てきたランダムフォレストについては、他の記事を見てもらうと良いと思います。

参考文献

Logics of Blue サポートベクトルマシンの考え方

はじめてのパターン認識 平井有三(著) 森北出版

分位点回帰は、普通の直線回帰とは少し変わった、特殊な回帰ですが、正規分布に従わないデータを処理する際、柔軟な予測をすることができる便利なモデルです。今回は、理論編・実践編に分けて、分位点回帰を解説していきたいと思います。

理論編

1.回帰

回帰とはデータ処理の方法の一つで、簡単に言うとデータを予測するモデルを作る際に、「モデル化=簡略化」に伴う損失を最小限にすることです。そしてこの「損失」を定量化するためにモデルごとに様々な「損失関数」を定義します。「損失関数」の値を最小化するようなパラメーターを探すことが、いわゆる「学習」と呼ばれる作業になります。数多くある回帰ですが、その一つが今回紹介する「分位点回帰」です。

2.分位点

分位点回帰はその名の通り、「分位点」に注目した回帰です。「分位」とはデータを順番に並べた時に、上位何%に入るかを表現するときに使います。例えばquartileとは四分位のことで、データを四等分にできます。

0th quartile = 上位0%

1st quartile = 上位25%

2nd quartile = 上位50%

3rd quartile = 上位75%

4th quartile = 上位100%

他にもquintile=五分位など、何等分にデータを切るかは自由に設定することができます。

こういうふうにデータを区切ると、例えば身長が上位25%の人と身長が上位75%の人で変数の影響が違う場合、それらを具体的に見ることができます。これは分位点回帰が一般的な直線回帰や重回帰とは違う点です。

3.損失関数

分位点回帰の損失関数と、一般的な最小二乗法の損失関数とでは決定的な違いがあります。最小二乗法では全てのデータポイントにおける損失が均等に評価されるため、平均に対して回帰していくことになります。しかし、事故率や年収など、偏りがあるデータでは、平均における情報よりも中央値における情報の方が重要だったりします。そのため、分位点回帰などは「上位何%における変数の影響」という平均とは全く違う観点でデータを見ることができます。

「上位何%における変数の影響」を見るからといって、その上位何%のデータのみを使うわけではありません。データは常に全て使うのですが、データによって損失関数に対する影響が違う、というふうに捉えるとわかりやすいでしょうか。この損失関数を使うと、損失関数の微分が0<=損失関数が最小の時、上位τ%の値について予測できるような変数の係数が計算されているのです。

(もっと知りたい人向け)

具体的には損失関数は

Alt text

で定義されます。 ここで

Alt text

がquantileにあたる数字になります。

Alt text

は累積分布です。

この損失関数が何故うまくいくかというと、左辺を微分したものの値が0となるような u = q_τに対して、

Alt text

となり、整理すると

Alt text

なので、確かにq_τが上位t%の値だとわかります。

4.長所と短所

上でも説明したように、分位点回帰は偏りのあるデータを処理したり、特定の分位における変数の影響を予測するのに適しています。逆に、分布が正規分布に近い場合は、平均で回帰した方が正確な結果が出ることになります。

実践編

では実際のデータを使ってQuantile Regressionを試してみましょう。今回はMicrosoft Azure MLに実装されているものを使って、飛行機の遅延について予測するモデルを訓練していきましょう。

0.データ

今回のデータは飛行機の離着陸の遅延時間、空港、日時などをまとめたデータセットです。

Alt text

DerDelay, ArrDelayを見てみると、かなり左側に偏っていることがわかります。またCarrier(飛行機会社)も正規分布よりかなり偏っているので、Quantile Regressionを活かせそうだ、ということがわかります。通常は空白のセルの処理やデータの取捨選択が必要になりますが、今回はMicrosoft Azureに内装されたデータセットを使うので、その必要はなさそうです。

1.データの分割

学習をするにあたって、機械を学習させるための学習データ(training data)と、その学習を評価するデータ(evaluation data)の2種類が必要になってきます。そこで、元のデータをランダムに分割する"Split Data"を使います。今回は元データの60%を学習データに使用することにしました。もちろん、この値は調節可能です。

Alt text

Alt text

2 モデルの選択

今回はQuantile Modelを使ってみたいので、その一つであるFast Forest Quantile Regressionを使います。

Alt text

Fast Forest Quantile Regressionのパラメータは初期設定のままにしました。一部TreeやLeavesのような見慣れない単語が出てきますが、興味のある方はRandom Forest Regressionについての記事をご覧ください。

理論編で紹介した部分に当たるのは、下から2番目の"Quantiles to be estimated"になります。入力されている値を見ると、四分位なことがわかります。

Alt text

3.学習

実際の学習モジュールを追加していきます。ここでは、"Train Model"モジュールに対して、どの変数を予測したいか、を指定しなければなりません。今回は出発の遅延を調べたいので、DepDelayを選びます。

また、分割したデータのうち、学習用のデータ(左側)を入力として指定します。

Alt text

Alt text

4.評価と結果

学習が終わったら、モデルの精度を「見たこともないデータをどれだけ正確に予測できたか」という基準で測ります。ここで最初に分割しておいた評価データを使うことになります。

Alt text

学習結果を見てみましょう。

Alt text

一番左端が今回予測したDepDelayで、右側3列がQuantile Regressionで予測した結果になります。

例えば一番上のDepDelay=-4のデータでは、全体の中で第1四分位に属しているため、"Score for quantile 0.250"の値が一番正確です。

逆に、中ほどにあるDepdelay=65のデータは、全体の中で第4四分位に属しているため、"Score for quantile 0.750"の値が一番正確です。

この結果からわかることの一つは、全体の中でどの四分位に属しているかによって、変数の影響が違う、ということです。でなければ、どの予想も同じような数字を出力するはずです。このような柔軟性のある分析ができるところが、分位点回帰の利点になります。

以上、分位点回帰の理論と実践でした。
その他のMicrosoft Azure Machine Learning Studioでやってみた記事も参考にしてください!
決定木アルゴリズムCARTを用いた性能評価
ロジスティクス回帰を用いた Iris Two Class Dataの分類
パラメーターチューニングを行う
ランダムフォレスト回帰を用いた人気ブログタイトル予測

参考文献: 分位点回帰を使って、「その回帰予測どれくらい外れるの?」を説明する

1.単回帰分析とは

回帰とは、統計学においてYが連続値の時にY=f(x)というモデルをあてはめる事である。
これにより二つの事項に関する相関関係などをを分析することができる。


2.単回帰分析の成り立ち

19世紀にフランシス・ゴルトンによって「回帰」という言葉が誕生した。
ゴルトンは、遺伝子学の研究において分析を行い、その際に身長と遺伝子の関係を回帰モデルを用いた事で後の統計学で使われる回帰モデルが発展した。


3.単回帰分析の例

例えば、都道府県の人口密度と人口100万人あたりのコンビニの数を示したグラフがあるとする。
薬局の数yを目的変数、人口密度xを説明変数とするとき、y=ax+bのa,bは回帰係数である。またy=ax+bのような式は単回帰式と呼ばれる。


4.単回帰分析の特徴

単回帰式は説明変数xが一つのみの状態の式である。
例えば、アパートの賃料を予想する際には、 単回帰分析の場合は、目的変数を賃料とおき, 説明変数を部屋の広さのみで求めるのに対して、重回帰分析ではその説明変数が複数あるものである。


5.y=ax+bの式には誤差が生じるがどう対処する。

データにはy=ax+bの線から離れた点も存在する。 これらの誤差が大きければ大きいほど予測が不正確になる
。 そのため、誤差を小さくしなければ正確な予想ができない。 そこで誤差をuとおきy=ax+bに挿入してu=y-ax-bと表す。 その後、誤差uを最小とするために最適なa、bを最小二乗法で求めれば誤差の小さい単回帰分析ができる。 image


6.回帰分析を用いるメリット

  1. 散布図から当てはまる直線を引くことで分かりやすく理解できる。
  2. データが無いところも推論できる。


7.総評

以上のことから単回帰分析は散布図から求められ、y=ax+bというわかりやすい線によって求めたい数を把握できるためメリットは大きい。しかしながら、使われる場面は重回帰分析の方が多い。

1.重回帰分析の定義

重回帰分析とは、統計上のデータ解析手法の1つであり、 単回帰分析とは異なりある結果(目的変数)を説明する際に、 関連する複数の要因(説明変数)のうち、どの変数がどの程度、 結果を左右しているのかを関数の形で数値化し両者の関係を表し、 それを元にして将来の予測を行う統計手法のことです。

2.重回帰分析の使用用途例

  1. ビジネスで売上を予想する
  2. 身体検査で体重の予測を行う
  3. イベントの参加人数を予想する

3.重回帰式の表し方

重回帰分析は目的変数をyとおき、複数個の説明変数をxi(i=1,2,3...)とする際に、 以下の式で表す事ができます。( 説明変数は3つとした場合)

y=β0+β1x1+β2x2+β3x3

4.重回帰分析の手順

例として、カフェをこれから経営する予定のjさんがいると仮定します。
1.これからjさんはどのくらい売上が成り立つのか知りたいと考えました。
この際まずは、目的変数を決定します。この例では、目的変数は売上高です。

2.jさんはカフェを経営するために売上高に関連しそうなデータを収集する必要があります。
売上高を予想するには、都市人口、競合店舗、店舗面積、座席数、従業員数、メニュー数、利益率、広告費 などのデータが必要です。これらのデータは説明変数と呼び、目的変数が決まった後に説明変数を決定します。

3.これらのデータが目的変数を出すのに必要なのか否か検討する必要があります。
説明変数のデータの精度を上げるにはステップワイズ法で最適なデータを探します。 ステップワイズ法は、はじめに最も有効な説明変数を1個採用します。 その後まだ採用されていない説明変数の内で最も有用な説明変数を1個採用します。 これを繰り返し行うが最初の方で採用された説明変数も不要になる場合があるので採用された変数を 取り除くかどうかを確認する方法です。

4.これによって決めた説明変数をエクセルのツールを利用します。
エクセル以外にもネットにある計算ソフトも使うことができます。

5.以上のものを使い方程式に落とし込むと
Y=0.35✕店舗面積+0.33✕座席数+0.55✕従業員数.....+0.77

売上高  回帰係数  回帰係数  回帰係数     定数項

(数字は例です) 定数項は説明変数の影響を受けないベースの売上高の事です。

6.この数式をを元にjさんは売上高を高める方法として説明変数の寄与率の高いものに予算を多めに配分して寄与率の低いものは予算の配分を少なくするなどの調整を行います。
以上のような手順で分析を行います。

5.私見

私見では、単回帰分析に比べて重回帰分析は複雑さがあるため、 単回帰分析のように直線を引いて直感的に理解しにくい面がありますが、 いくつかの説明変数を用いて目的変数を割り出す事ができるという大きなメリットがあります。 特に重回帰分析はマーケティングで応用されることが多く、売上高の予想などに向いていることから ビジネスマンに最適かつ多様な面で使う事ができると考えられます。

1.SVMの定義

SVMとは、パターン認識の手法を用いて物事を分類することである。 パターン認識は事前に学習したデータを用いて、 新たなデータがどこに属すものかをあてはまる手法である。

2.分類する線を引くイメージ

集めたデータを元に最も適した線を引く。 クラス1に分類するものとクラス2に分類するものの間に 識別境界線を引くことで2つのクラスを分けることができます。 

3.識別境界線を引く方法

では、どのような基準で識別境界線を引くことができるのであろうか。 ハードマージンと呼ばれる関数が最大値になるベクトルが識別境界線となる。 つまり、マージンは、2クラスのデータの中で最も他クラスと近い位置にいるもの (これをサポートベクトルと呼ぶ)と識別境界f(x)=0との間のユークリッド距離のことです。 ただマージンを最大化して境界線を引くだけでは、境界線が平行移動すれば片方のクラスが 大きくなり、もう片方のクラスが小さくなる問題が生じる。 そのため下のグラフの赤いサポートクラスをd1と置き、青いサポートクラスをd2と置く。 そしてd1とd2を2で割れば最適点oが導かれる。この最適点oを通る識別境界線が クラス1とクラス2を分類するための最も適当な線となる。 image

4.識別境界線を用いて分類することができる例

  1. 迷惑メールと通常のメールの区別
  2. 郵便番号を認識して分類する
  3. 顔認識ができる。事前に画像ピクセルから出された値から顔を否かを識別できる。

5.私見

私見では、SVMを応用することであらゆる画像を認識して対象のものか否かを区別できる 便利なツールとして用いることができる。 近年のアマゾン問題における過度な労働から機械化を進める大きな要因になると考える。 例えば、画像認識を用いれば、ダンボールの位置や向きやサイズの状態を画像が判別して振り分け作業が可能となる。 この技術が発展すれば人手が多く必要な工場では機械が導入され労働状況の改善や企業の生産力の工場に寄与することとなる。

概要

 はじめまして。アクセルユニバースのインターンに参加してる宇田川と申します。機械学習において必須の知識である数理モデルについて、その中でも特に基本的な回帰モデルに関して書いていこうと思います。

 このブログは機械学習を始めたばかり、または興味を持ち始めたばかりの方にわかっていただくようにわかりやすく書きました。事前知識としては機械学習の知識はもちろん必要なく高校数学における数学Bの確率の範囲程度の知識があれば十分です。よって細かい数式を書くことは避けました。回帰モデルのイメージを掴んでいただけたら幸いです。

その他のMicrosoft Azure Machine Learning Studioでやってみた記事も参考にしてください!
決定木アルゴリズムCARTを用いた性能評価
ロジスティクス回帰を用いた Iris Two Class Dataの分類
分位点回帰を用いた飛行機遅延予測
ランダムフォレスト回帰を用いた人気ブログタイトル予測

回帰モデルとは

 回帰モデルの説明をする前に回帰の語源について簡単に説明します。
回帰という言葉は英語でregressionと書きます。この言葉は遺伝学者であり統計学者でもある19世紀のフランシス・ゴルトンによって造られました。ゴルトンは、背の高い祖先の子孫の身長が必ずしも遺伝せず、平均値に戻っていく、すなわち「後退(=regression)」する傾向があることを発見しました。これを「平均への回帰」といいいます。ゴルトンはこの事象を分析するために回帰モデルを発明しました。この発明が後に統計学の基礎となり回帰という言葉が誕生しました。

 では、回帰モデルについて書きましょう。回帰モデルとは関数をデータに適用することよって、ある(未知の、予測したい)変数yの変動を別の(既知の、予測するための)変数xの変動により説明・予測するための手法です。ここで登場した、説明したい変数yのことを目的変数、説明するために用いる変数xを説明変数と呼びます。説明変数xの数によって、1つであれば単回帰、2つ以上あれば重回帰という名前がついています。例として目的変数「頭の良さ」に対して、説明変数「大学の偏差値」のみで行うのが単回帰となり、目的変数「頭の良さ」に対して説明変数「コミュニケーション力」、「判断力」、「年齢」、「大学の偏差値」...と複数の説明変数を用いる場合が重回帰になります。

Alt text

1. 単回帰

 単回帰は先ほど説明したように説明変数xが一つになるので式で表すとy=ax+b(aは係数、bは定数項です。a,bをパラメータや回帰係数と言ったりします。a,bを上手に決めると目的変数yの予測がうまくできます。後ほど少し詳しく書きます。)の形になり直線によって目的変数yを予測するモデルとなります。もちろん直線によってyを予測することになってしまうので単回帰のみで分析することはほぼありません。単回帰によって大まかな予測することで大まかな推測ができその後、他のモデルによって精度よく分析をします。単回帰は式がとてもシンプルなので簡単に大まかな予測ができます。

Alt text

上の図からわかるように真の値と予測をしたyの値では誤差(上の図の緑線)が生じてしまいます。この誤差をεで表すと、先程のy=ax+bという式はy=ax+b+εと表せます。つまり、ε=y-ax-bとなり、この誤差は小さくしなければ良い予測ができたとは言えません。この誤差εを最小にするためのパラメータa,bを決めるのに有名な方法として最小2乗誤差法があります。最小2乗誤差法を説明をすると数学的になり数式が増えてしまうのでここではやめておきます。詳しく知りたい方は こちらのスライド21枚目を参考にしてみて下さい。ここではすでにわかっているn個の(x,y)の組(訓練データといいます。)を用いて最小2乗誤差法により最適なパラメータβ1,β0を求めています。

2. 重回帰

 重回帰は説明変数xが2つ以上になるので式で表すと、説明変数xがn個(x₁,x₂,...,xn. nは2以上)ある時、y=a₀+a₁x₁+a₂x₂+...+an*xn(a₀,a₁,...,anはパラメータ)の形になるのでn種類のxの変数によって目的変数yを予測することができます。説明変数が増えるので単回帰よりも予測の精度が高いのは明らかですね。

Alt text

また重回帰の場合もパラメータa₀,a₁,...,anを誤差が小さくなるように考える必要があり、この場合も最小2乗誤差法が使われています。ここでも詳しく知りたい方は こちらを参考にしてみて下さい。パラメータα,β1,β2,...,βkを求めるために訓練データ(x,y)を用いて計算をしています。

 重回帰の実用例を挙げましょう。

カフェをこれから経営する予定のjさんがいると仮定します。

(1)これからjさんはどのくらい売上が成り立つのか知りたいと考えました。まずは、目的変数を決定します。この例では、目的変数は売上高です。

(2)jさんはカフェを経営するために売上高に関連しそうなデータを収集する必要があります。売上高を予想するには、都市人口、競合店舗、店舗面積、座席数、従業員数、メニュー数、利益率、広告費(説明変数です。)などのデータが必要です。目的変数が決まった後に説明変数を決定します。

(3)これらのデータが目的変数を出すのに必要なのか否か検討する必要があります。説明変数のデータの精度を上げるにはステップワイズ法で最適なデータを探します。ステップワイズ法は、はじめに最も有効な説明変数を1個採用する。その後まだ採用されていない説明変数の内で最も有用な説明変数を1個採用します。これを繰り返し行うが最初の方で採用された説明変数も不要になる場合があるので採用された変数を取り除くかどうかを確認する方法です。

(4)以上のものを使い方程式に落とし込むと

Y=0.35✕店舗面積+0.33✕座席数+0.55✕従業員数.....+0.77

売上高  回帰係数  回帰係数  回帰係数     定数項

(数字は例です)

定数項は説明変数の影響を受けないベースの売上高の事です。

(5)この数式をを元にjさんは売上高を高める方法として説明変数の寄与率の高いものに予算を多めに配分して寄与率の低いものは予算の配分を少なくするなどの調整を行います。

このようにして重回帰は利用されます。

3. ベイズ回帰

 単回帰、重回帰(まとめて線形回帰と呼びましょう。)では最小2乗誤差を求めてパラメータを決めていました(パラメータを推定するとも言います)。ベイズ回帰は線形回帰を確率の問題に読み替えることにしました。つまり、最適なパラメータを求めるということは一番高い確率になるパラメータを求めるということになります。ではどのようにして一番高い確率になるパラメータを求めればよいでしょうか。答えはたくさんあるのですが一番シンプルな例として尤度を最大にすることを扱いましょう(これを最尤推定法と呼びます)。

 尤度(ゆうど)の説明からします。パラメータθの確率モデルP(X=x;θ)と、D={x₁,x₂,...,xn}というそれぞれ独立な実現値(実現値は統計的な用語でデータ x を変量 X の値と考えています。)の集合を考えます。尤度はモデルのもとでDが得られる確率のことという意味です。尤度を数式で表すとP(D;θ)=P(X=x₁;θ)×P(X=x₂; θ)×...×P(X=xn;θ)と書けます。

 少し余談ですが、この式は確率を表す式的には何も変わりません。では尤度と確率は何が違うでしょうか。それは、式で表している意味合いが異なります。確率はこれから起きる可能性のあること(事象といいます。)それぞれがどれくらいの割合で起きるのかを表します。一方、尤度とはすでに観測されている(訓練データと呼んでいましたね。)起きてしまったデータの確率を考えています。

 余談はこれくらいにして最尤推定の説明をしましょう。最尤推定は尤度P(D;θ)を最大にするパラメータθを求めることです。このθを求めるときにP(D;θ)が積の形になると扱いづらいので両辺に対数をとって和の形にしたものlogP(D;θ)=logP(X=x₁;θ)+logP(X=x₂; θ)+...+logP(X=xn;θ)を対数尤度と言い、最尤推定を求めるときは対数尤度から求めるのが一般的です。

 ではこれを線形回帰において考えるとどうなるでしょうか。ここでは数式をたくさん書くのは避けて結果だけ書きます。先程のパラメータθに当たるところを単回帰ではa,b、重回帰ではa₀,a₁,...,anと考えて、訓練データ(x,y)においてある組(x,y)に対する誤差εがε~N(0,σ²)(これはどの組(x,y)に対しても誤差εが平均E(ε)=0、分散Var(ε)=σ²となり、またある2つの組(x,y)の誤差をε、ε'とするとその共分散Cov(ε,ε')=0と仮定しています。すると誤差εは平均0、分散σ²の正規分布に従うという意味です。このような分布を事前分布と呼んでいます。)として、最尤推定法により計算をしていくと最小2乗誤差法と同様の式が出て最適なパラメータの値は等しく推定することができます。

 ではベイズ回帰ではなぜ確率で考えるという手間を踏んでいるのでしょう。色々なメリットがありますが、簡単なメリットを挙げると、事前分布を考えて推定することができる点です。事前分布は私達がすでにわかっている知識などを考慮し分布を決め打ちするのが通常です。このように私達の知識を推定の中に取り入れられることです。

最後に

 今回は回帰モデル、特に基本的な3つの回帰モデルを書きました。単回帰では式がシンプルである一方、誤差が大きく良い推定ができませんでした。それを克服したのが重回帰でした。重回帰は誤差が小さく良い推定ができる一方、式が複雑になってしまいました。またベイズ回帰では事前分布を考えることにより私達の事前知識を数式に取り入れることができました。このように基本的な3つの回帰モデルにはメリット・デメリットがありました。今後、新たなモデルを学ぶ上でも3つの回帰モデルは重要になるので必ず理解しましょう。次回は、今回の基本的な回帰モデルと同じくらい重要なニューラルネットワークについて書きます。

参考文献

機械学習をはじめよう 第12回 ベイズ線形回帰[前編]

Pythonでベイズ線形回帰を実装してみた

回帰分析(単回帰分析)をわかりやすく徹底解説!

尤度とは何者なのか?

こんにちは、システム部の大瀧です。

今回は初歩ということでGoogle Colaboratoryを使ってみようと思います。
せっかくなので実際に動くものとして、scikit-learnが用意しているbostonのデータセットを使って初歩的な単回帰分析を行ってみます。

1. Google Colaboratoryとは

Colaboratoryは、完全にクラウドで実行されるJupyterノートブック環境です。設定不要で、無料でご利用になれます。
Colaboratoryを使用すると、コードの記述と実行、解析の保存や共有、強力なコンピューティングリソースへのアクセスなどをブラウザからすべて無料で行えます。

Google Codelaboratoryへようこそ より

つまりGoogle Colaboratory(以下Colab, コラボと読むようです)は、端的にいうとクラウド版のjupyter notebookということです。
誰でも無料で簡単に利用することができるという敷居の低さや、GPU環境を無料で利用可能であることなどがColabのメリットです。

補足. jupyter notebookとは

「jupyter notebookが何か」を簡潔にいうとプログラムの実行環境のことなのですが、優れているのはnotebookというだけあってコードだけでなくメモやファイル、コードの実行結果などをノートのように残すことができる点です。
特にデータの処理を行ったグラフなどを残しておけるのは非常に見やすく、データを分析する助けになります。

2. 実際に動かしてみる

Colabの準備は簡単です。
Googleアカウントを用意しましょう。それだけです。

https://colab.research.google.com/にアクセスします。
以下のような画面が表示されるはずです。

blog_colab_01.png

次に新しいノートブックを作成します。
メニューの「ファイル」から「Python3の新しいノートブック」を選択すると真っさらなノートブックが作成されます。

blog_colab_02.png


画像の赤枠が「セル」と呼ばれ、コードはセル単位で実行することが可能です。
せっかくなので簡単にコードを記載してみます。
今回はscikit-learnというライブラリのBostonデータセットを使ってなんちゃって線形回帰を試してみたいと思います。

blog_colab_03.png

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_boston

# データセットの取得
# 米国ボストン市郊外における地域別の住宅価格のデータセット
boston = load_boston()

# 取得したデータをpandasのdataframeへ
boston_df = pd.DataFrame(boston.data, columns=boston.feature_names)
price = boston.target.reshape(-1,1)
lstat = boston_df['LSTAT'].values
plt.scatter(price, lstat)
plt.xlabel('house price') # x軸のラベル
plt.ylabel('% lower status of the population') # y軸のラベル
plt.grid() # グリッド線を表示
plt.show() # 図の表示

実行するコードをセルに書き込んだらセルの左上にある再生ボタン?を押しましょう。これでコードが実行されます。
もし複数のセルを実行したい場合は、メニューにある「ランタイム」の項目の「すべてのセルを実行」を選択してください。他にも一部のセルのみを実行することなどが可能です。

blog_colab_04.png

実行するとグラフが描画されます。
今回は「地域別住宅価格(X軸)」と「給与の低い職業に従事する人口の割合 (%)(Y軸)」のグラフです。プロットされたドットをみるとどうやら相関関係がありそうです。
当たり前かもしれませんが、住宅の価格が高い地域には給与の低い職業に従事する人が少ないようです。

ではこれらを線形回帰(今回は手抜き単回帰分析)します。
描画されたグラフはそのままに新たに分析結果を追加したグラフを描画します。
メニュー下の「+コード」を押します。

新たに作成されたセルに新たにコードを書き込み、今回書き込んだセルの左上にある再生ボタンをクリックすると、このセルのみが実行されます。
画像のように線形直線が描画された新たなグラフが表示されたでしょうか。

blog_colab_05.png

# 線形回帰モデルのクラスを読み込み
from sklearn.linear_model import LinearRegression
# 線形回帰のインスタンスを生成
lr = LinearRegression()

# 単回帰モデルの学習を実行
lr.fit(price, lstat)
plt.scatter(price, lstat)
plt.xlabel('house price') # x軸のラベル
plt.ylabel('% lower status of the population') # y軸のラベル
plt.grid()
plt.plot(price, lr.predict(price), color = 'red')
plt.show()

作成したファイルなのですが、アカウントのGoogle Drive内にColab Notebooksというフォルダができており、そこに保存されています。ここで察しがつくのですが、Google Driveに保存されているファイル(例えば集計データなど)をロードして、コードの中で使うことも容易になっており、そういう点もColabの魅了ですね。

今回のサンプルを公開しておきます[リンク]
このように簡単に公開できることも大きな魅力ですが、これらを自身のワークスペースに複製して編集することなどもできます。

今回のサンプルはグラフの描画などを行いましたが、単純にPythonを初めて触る際にも使い勝手が良いかと思いますので是非使ってみましょう。

このアーカイブについて

このページには、過去に書かれた記事のうち回帰カテゴリに属しているものが含まれています。

前のカテゴリは利用事例です。

次のカテゴリはニューラルネットワークです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。