機械学習の線形回帰問題をPythonで。scikit-learnのLinearRegressionクラスのサンプルなど。機械学習の線形回帰問題をPythonで。scikit-learnのLinearRegressionクラスのサンプルなど。2019-07-12機械学習の線形回帰問題をPythonで。scikit-learnのLinearRegressionクラスのサンプルなど。AI:機械学習関連やってみた線形回帰問題をPythonで解く「scikit-learn」の「LinearRegression」クラスの使い方と決定係数での評価について、基本的なところを、おさらいしておこうかと思います。回帰問題とは回帰問題をざっくりいうなら、こんな感じかなと思います。入力データと出力データの組から対応する規則を学んで、未知の入力データに対して適切な出力を生成・・つまり予測・・できるようにする回帰問題には「線形回帰」と「非線形回帰」があって、今回は「線形回帰」をとりあげるのですが、理論的なことについては、個人的には以下のリンクの記事の内容程度を「ざっくり」理解しているレベルです(;^_^A。gihyo.jpgihyo.jpなので、回帰とはなんぞや・・と、説明するのは遠慮して、リンクだけのせます。今回やろうとしていることさて。そんな「ざっくり」程度の理解で何をしようとしているか?と言えば、scikit-learnのLinearRegressionクラスの使い方についての整理です。機械学習の話で最初の方に必ずでてくる基本中の基本みたいなクラスなので、引数の与え方とか結果の評価の仕方とかの基本形を押さえておきたいな・・と。・・、ノイズの入ったランダムなデータを学習させて、ノイズが加わる前の「正解」を線形回帰で予測する形で3パターンほどやってみることにします。サンプルとしては以下の3つです。2」までの乱数をXとして計算したものです。単回帰(変数が1つ)の一次式の場合の例です。5」の間の乱数を加算してばらけさせてます。これを学習して、正解にどれくらい近い式を導けるかを試します。sk_linear_sample01.py乱数を発生させる部分のソースです。「np.random.rand()」が、0.0から1.0の乱数を返すので、それい4をかけて、2を引くことで、無理やり「-2から2」の乱数にするという方法をつかってます。2」までの乱数をXに計算したものです。単回帰(変数がひとつ)の二次式の場合の式になります。5」の間の乱数を加算してばらけさせてます。これを学習して、正解にどれくらい近い式を導けるかを試しますsk_linear_sample02.py上記の元データを発生させる部分のソースです。2」までの乱数をXとして計算したものです。重回帰(変数が複数・・今回は2つ)の例です。5」の間の乱数を加算してばらけさせてます。これを学習して、正解にどれくらい近い式を導けるかを試します。グラフは変数2つだと3Dにした方が良いのですが、平面のグラフで表現するために、変数「x」と[z」それぞれのグラフで表現しています。sk_linear_sample03.py上記の元データを発生させるソースです。全サンプル共通の補足事項について各サンプルに、元に学習・予測を行って、予測結果を決定係数で評価してみます。個別のサンプルのところで繰り返し書くと読みづらいので、共通した補足事項を先に書いておきます。決定係数について決定係数というのは、予測精度の客観的な指標です。分類問題の場合は分類結果が正解か不正解かがはっきりしているので、Accuracy(正答率)など明確な評価基準があります。arakan-pgm-ai.hatenablog.comでも、それは回帰問題には適用できなくて、かといって、なんとなく予測した数値をグラフで見て「何となくいけてそうだな」ですませるわけにもいかないので、客観的な指標として「決定係数」を使うというわけです。bellcurve.jp決定係数の求め方ですが、使われるやり方が2通りあります。linear_model.LinearRegressionクラスのscoreメソッドを使う方法がひとつ。model.score(x,true_y)もうひとつは、sklearn.metrics.r2_scoreを使う方法です。r2_score(true_y,predict_y)どちらも結果は同じです。上記は内部でr2_scoreを呼び出しているだけらしいので当然ですが。ちなみに「true_y」は正解、「predict_y」は予測結果となります。学習と評価でエラーがでる場合があります学習と評価には「scikit-learnのLinearRegression」を使います。変数「x」「y」で学習評価する場合の基本形はこんな感じです。model.predict(x)model.fitやmodel.predictに渡す時に、以下のようなエラーがでるときがあります。instead:これは、たとえば以下のように次元を明示しないで生成したようなデータとかがはいってきた時に発生します。-2この例だと、本来以下のように、shapeを指定してなければいけないところ、されていないので次元があっていないわけです。-2まあ、この例のように自分でデータを生成しているのなら、発生元を直せばいいのですが、そうでなくて外部からデータを受け取る場合もあるので、その場合は、model.fit等に渡す前にreshapeしてやる必要があります。