医療職からデータサイエンティストへスマートフォン用の表示で見る医療職からデータサイエンティストへ統計学、機械学習に関する記事をまとめています。R機械学習の教師あり学習の中でも、重回帰モデルはとても有名です。統計学でも有名なこのモデルですが、機械学習では、最急降下法というもっとも基本的かつ、重要なアルゴリズムを使ってパラメーターを求めることができます。今回は、最急降下法を使って重回帰モデルのパラメーターを推定し、回帰問題を解いていきます。コードはPythonとRの両方を使って、スクラッチからコードを書いていきますので、機械学習アルゴリズムを0から理解したいという方は参考にしてみてください。(Rコードは最後にまとめて記述してあります。)最急降下法とは?最急降下法を使った単回帰モデル本題の重回帰モデルのその前に最急降下法による重回帰モデルまとめ参考書籍Rコード最急降下法とは?最急降下法とは、ある関数を最小にするようなパラメーターを求めるためのアルゴリズムで、複雑な関数に対しても対応できます。こんな感じの関数になります。3ですが、これを最急降下法を使って求めていきましょう。最急降下法には微分の考えがとても重要なのです。3であると求めることができました。ここまではただの数学です。値決めて、それぞれの傾きを求めてみます。値が3から離れるほど傾きの絶対値は大きくなっています。更新しながら関数を最小とする値を求めるのが最急降下法のメカニズムです。傾きがもっとも急なところに降りていくという意味からこの名前がついています。大きくプラス側に更新されますし、プラス側に小さくずれている場合は、傾きは小さなプラスの値になるため、小さくマイナス方向に更新されます。イメージとしてはボールを転がして、最終的には凹みの最下部にくる感じですね。最急降下法を式で表すとこんな感じになります。学習率と呼ばれ、求めた傾きをどれぐらいパラメーターの更新に反映させるかを表し、1より小さい値にします(1以上だと発散してしまうため)。実際に値を入れて確かめてみましょう。値がマイナス側に更新されて小さくなりました。一度更新してみましょう。これを繰り返していきます。Pythonで実装してみましょう。alpha*(2*theta-6)plt.plot(theta_lis)plt.ylabel("theta")plt.xlabel("iteration")plt.show()1000回値を更新しました。大体200回ぐらい繰り返したところで、[tes:\theta]の値は3に近づいているようです。値を確認してみるとtheta>3.0000000050489004ほぼ3になっていますね。最急降下法を使った単回帰モデルさて、お次は視覚的にも理解しやすい単回帰モデルを例に最急降下法を使ってパラメーターを求めてみましょう。単回帰モデルのパラメーター(切片と傾き)は最小二乗法で求められます。Error又の名をコスト)を最小にするように切片と傾きを求めます。)を最急降下法で求めることになります。これを機械学習の世界ではコスト関数を最小にするパラメーターを求めると呼ぶこともあります。するかというと、上記のコスト関数をそれぞれのパラメーターで偏微分して、それぞれの傾きを使って値を更新していきます。以下のようにコスト関数を定義します。コスト関数は微分の便宜上、1/mではなく、1/2mを使うことが一般的です。これをそれぞれのパラメーターで偏微分してみます。偏微分は難しそうに聞こえて、普通の微分となんら変わりません。偏微分する変数以外を全て定数として扱うだけのなので、合成関数の微分を使って(合成関数の微分も難しくないので是非調べてみてください。)で偏微分で偏微分となります。通常であれば、それぞれを傾き0として求めるのですが、ここに最急降下法を導入して、とすれば、先ほど同様にコスト関数を最小とするパラメーターを求めることができますね。Pythonでこれを実装してみましょう。データは有名なボストンデータセットを使って、部屋の広さと家賃の関係を単回帰モデルで実装します。pd.DataFrame(boston.data,columns=boston.feature_names)とりあえず、家賃と部屋の広さのグラフにしてみます。横軸が部屋の広さ、縦軸が家賃です。plt.grid(which='major',color='gray',linestyle='-')plt.scatter(data["RM"],boston.target)plt.xlabel("Room")plt.ylabel("Medv")plt.show()みたところ回帰直線が引けそうです。最急降下法を実装していきます。temp1plt.plot(cost)plt.xlabel("Cost")plt.ylabel("Iteration")plt.show()今回の学習率は0.04にしました。ここを色々変えて結果がどうなるかも試してみてください。それれぞれの繰り返しごとにコストも格納していきます。thetaをいったんtempという変数に格納するのは、theta0もtheta1も更新される前の値を使うためです。今回は10000回パラメータを更新しました。コストは前半に大きく減少し、徐々に減っているように見えます。パラメーターを確認してみます。print(theta0)print(theta1)>-34.377040288363766>9.055956640093719切片が-34、傾きが9の回帰直線パラメータが求まりました。グラフに加えてみます。plt.grid(which='major',color='gray',linestyle='-')plt.scatter(data["RM"],boston.target)plt.plot(data["RM"],theta0+theta1*data["RM"],color="red")plt.xlabel("Room")plt.ylabel("Medv")plt.show()おお!もっともらしい回帰直線が引けました。これが最急降下法を使った単回帰モデルパラメーターの求め方です。本題の重回帰モデルのその前にさて、本題の重回帰を最急降下法を使って求めていく前に、ベクトル化の概念をご説明します。書くのも面倒ですし、パラメーターを一つ一つ更新するのも手間です。そこで、変数がいくつあっても一つの文字で表してしまおうというのがベクトル化です。一つ一つパラメーターを扱う必要がないため計算もとても速くなります。通常の重回帰モデルは以下のようになります。これをベクトル化するとどうなるかというとと表すことが出来ます。これをサンプル(m)だけならべればよいので、となって、同様に同じ式で表すことができます。上矢印は縦に並ぶベクトルであることを表しています。yはm行1列の行列で、Xはm行3列の行列になります。ベクトル化は慣れが必要かと思いますが、よくわからんという方は以下の本がおすすめです。見るこのベクトル化を使って、最急降下法の式も書き直してみましょう。転置を表し、m行3列の行列を3行m列に変換しています。3行1列の行列となるため、一気にパラメーターを更新することが出来るのです。最急降下法による重回帰モデルいよいよ今までの知識を総動員して、最急降下法による重回帰モデルのパラメーターを求めてみましょう。先ほど同様にボストンデータセットを使い、部屋の広さに加えて、低所得者の割合を表す変数の2変数による重回帰モデルを作ります。Xとyを定義しておきましょう。boston.targetXはm行2列の行列ですが、切片の項を加える必要があるため最初の列に1の列を加えます。切片と変数を合わせて3行1列の行列になります。#reshapeで3行1列にする。パラメーターの更新を行うコードを書いてみます。0.23675723])numpyのdotは行列の掛け算を行う関数です。これらの処理をまとめて、コストの格納とパラメーター更新を行う関数を定義しておきます。[cost,theta]これで準備が整いました!いよいよパラメーターを求めていきます。今回は1000回の更新を行います。-0.66204958]>15.268362109644587という関係性にあるようです。試しにsklearnを使って重回帰を行った結果と比較してみましょう。-0.64235833]若干値は違いますが、大枠はあっているようです。ついでにコストも比較してみましょう。sm.add_constant(X)#コスト関数で求める(1/(2*m))*np.sum(np.square(np.dot(X,theta)-y))>15.256234388649734こちらの方が若干性能が良いようです。最急降下法では学習率や更新回数を調整することで、性能を上げることができるので、いろいろやってみてください。最急降下法を使わなくても重回帰モデルのパラメーターを求めることが出来るのですが、なぜ最急降下法のアルゴリズムが重要なのでしょうか?実は簡単な線形モデルであれば、正規方程式という行列演算を用いてそれぞれのパラメーターを求めています。すべての偏微分方程式をイコール0として求めているイメージです。今回のような簡単なモデルであれば、正規方程式によるパラメーター推定の方が効率がよいです。正規方程式は変数の数が膨大になると、解をもとめることが困難になります。そのため、ビックデータを前提とする機械学習モデルでは、最急降下法を基本とする様々な勾配アルゴリズムと呼ばれるものを駆使して、パラメーターを求めるのです。まとめ今回は機械学習モデルの中でも、もっとも基本的な重回帰モデルを、勾配アルゴリズムの中でも最も基本的な最急降下法を使って実装しました。今回の内容はシンプルではありますが、教師あり学習の様々なモデルのベースとなるところですので、理解を深めておきたいところです。※本記事は筆者が個人的に学んだことをまとめた記事なります。所属する組織の意見・見解とは無関係です。数学の記法や詳細な理論、用語等で誤りがあった際はご指摘頂けると幸いです。参考書籍ベクトルや行列の基礎から、最急降下法などのアルゴリズム、ニューラルネットワークまで機械学習を学ぶための前提知識が網羅されています。本書の立ち位置は機械学習を学ぶための知識を学ぶための本とされ、まさにその通りの内容です。はてなブログPro大学院で疫学統計を学んでいます。データサイエンティストを目指して、初心者目線から統計学、機械学習など学んだことをまとめていきます。パッケージ{prophet}を使って、ブログアクセス数を予測する。medi_data0826スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。