てつまぐとは?

【機械学習基礎2】線形回帰を使って、値を予測する

機械学習を最初に学ぶときは線形回帰から始めていきます。

中学で習う、下記のような1次式から始めるので、簡単すぎと思うかもしれませんが、機械学習の基礎的な考えがわかります。

本記事の内容

線型回帰について

線型回帰を使ってみる

 

難しい数学の知識はできるだけ省いてできるだけ簡単に説明します。

ただ、中盤以降はpythonの基礎的な知識は必要です。

線形回帰

機械学習の入門では、必須の線形回帰です。

値を予測をするAIを開発すると思ってください。

y = w * x + bのような1次式をAIとは言わないとは思いますが、画像の物体検知AIなども、ここでの知識がベースになります。

今回は、家の価格を予測する事例を考えます。

冒頭でも出しましたが、「家の面積」と「家の価格」のデータをプロットしたものと想定します。

まだ、価格がわからない家があったとしましょう。

今から、その家を購入したいと思ったとき、できるだけお得に購入したいですね。

お得かどうかは、参考にできる価格があると良いでしょう。

そのために家の価格を予測する必要があります。

機械学習が行ってくれること

こういうとき、機械学習はどのようなことを行なってくれるのでしょうか?

手元には下記のように、6つプロットされたx:家の面積とy:家の価格のデータがありますが、このままでは、wとbがわからないので、近似式がわかりません。

近似式がわからないと、予測したい家の面積が分かったとしても、家の価格が求められません。

機械学習では、このwとbを求めてくれます。

式について

中学校では、y = a * x + bでしたが、ここでは、y = w * x + bでしたね。

それぞれ、呼び方があります。

y: 目的変数
x: 説明変数 / 特徴量
w: 重み
b: バイアス
w, b: パラメータ

xは特徴量という方が多いと思います。

単回帰と重回帰

xの特徴量が1つの場合を単回帰といいますが、複数ある場合は重回帰といいます。

家の価格が面積だけで正確に求まるわけないよと思った方は、この重回帰を使うことになります。

例えば、家の面積だけでなく、部屋数、リビングの面積などです。

重回帰は下記のように表されます。

$$ y = b + w_1x_1 + … + w_mx_m $$

単回帰から、特徴量xがm個に増えたものです。

\(x^2\)を増やすと2次式ですが、特徴量が増えたと考えても良いでしょう。

\(b\)は\(w_0\)とする場合もあります。

勾配降下法

機械が決めてくれるwやbの最適な値とはなんでしょう?

どうやって決めれば良いのでしょうか?

それは、以下のように「今あるデータ」と「1次式」の差が一番小さくなるところです。

今あるデータは教師データといい、1次式などはモデルともいいます。

機械には左より、右のようになるwとbを求めて欲しいものです。

そのために、赤い線の教師データとモデルの差を最小になるwとbを機械に求めてもらう必要があります。

その方法に勾配降下法というものを使います。

勾配降下法では、教師データとモデルの差をlossとして定義して、lossが最小になるようなwとbを探します。

lossのことを損失関数とも呼びます。

今回であれば、lossには一般的に使われる、平均二乗誤差で考えると良いでしょう。

$$ loss = ((Y_1-\hat{Y_1})^2 + (Y_2-\hat{Y_2})^2 + (Y_3-\hat{Y_3})^2 + (Y_4-\hat{Y_4})^2 + (Y_5-\hat{Y_5})^2 + (Y_6-\hat{Y_6})^2)/6 $$

\( \hat{Y}\)はワイハットと呼びます。1次式のモデルで算出されるYの値を指します。

このlossはwやbの値によって、大きなったり、小さくなったりしますね。

wの変化による、lossの変化を下記図で示します。

機械はこの小さくなるところを探します。この過程は機械が学習しているといって良いでしょう。

このとき、大きく動かすか、小さく動かすかで、lossが最小にならない場合もありますし、最小になるまで時間がかかる場合もあります。

この動かす量を学習率(learning rate)というもので調整します。

今回は、勾配降下法というものを紹介しましたが、これを最適化アルゴリズム(optimizer)と言います。

他にも色々な種類がありますが、必ず学習率は調整するので覚えておく必要があります。

今回使うscikit learnでは、実はこの知識がなくても使うことができますが、この線形回帰の段階でなんとなく理解しておかないと画像AIとかでは何をしているのかわからなくなってしまいますので、覚えておくと良いでしょう。

 

scikit learn

scikit learnは線形回帰などの機械学習を簡単に実行してくれるライブラリです。

インストール

Anacondaなどpythonの使える環境のTerminalやコマンドプロンプトで下記を実行します。

 

線型回帰を使ってみる

さてでは、実際にscikit learnを使って線型回帰を使って、値を予測していきましょう。

ライブラリをインポート

ライブラリには、グラフも表示したいのでmatplotlibと数値演算用のnumpyをインポートします。

データを用意

次にデータを用意しますが、分かりやすさのため、w=2、b=1の乱数を混ぜたデータを10点用意してそのデータで動かしていきましょう。

データは下記コードで用意します。

データを作っているところは慣れている方は「pythonに慣れている方はこちらでもOK」のところを使ってください。

データを途中整形していますが、機械学習ではよく下記のような表データで読み込みます。

その場合、xは(n行, m列)、yはn個のデータで使います。

ですので、今回はxをn=10、m=1のデータにしたいので、reshapeメソッドで[10行,1列]にしています。

学習

学習は、簡単でLinearRegressionを呼び出して、fitメソッドに、xとyを入れるだけです。

学習というと大袈裟かもしれませんが、lossの最小化をします。

特に何も指定することなく、fitを使うだけで後はメソッド内でしてくれます。

確認

学習後のwとbを確認してみましょう。

coef_とintercept_で確認ができます。

乱数を入れていたので、少し値は違いますが、おおよそw = 2 、 b = 1に近い数字になっています。

*データは乱数を混ぜているので、結果は実行毎に違います。大体w=2、b=1になっていればOKです。

新しいデータで予測

手元にあるデータで学習が終わったので、教師データにはないデータで、予測をしてみましょう。

今回は、適当に5.5と10.3を使います。

大体合ってそうですね。

*データは乱数を混ぜているので、結果は実行毎に違います。

これで、線形回帰で学習させ、新しいデータを予測することができました。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です