Twitter Facebook はてブ Pocket LINE コピー. | 重回帰分析. ※多項式回帰は、表現力があがってトレーニングデータにフィットしやすいが、トレーニングデータへの過学習しやすいので注意が必要です, 線形モデルではこの式でいうところのAとかBとかCとかの係数と切片の最適な数値を求めていくのです format (i)) # csvファイル読み込み df_pivot = df. そのため、スクレイピングをせず、データベースよりデータを取得しています。, 815市区のデータをcity_info.csvに保存します。 city_info.csvの内容(最初の5行)は、以下。, とりあえず、重回帰分析を行います。 そのために必要なモジュールをimportします。, test_size=0.3にして、各データを次の比率に分割です。 回帰モデルとは. 回帰分析には、線形と非線形回帰がありまして線形回帰モデル以外は非線形回帰モデルになります(そのまんま), ・多項式回帰(非線形回帰) y=目的変数:予測したい数値 多重共線性になると、解が計算できなかったり、信頼性が低下してしまいます。そのため、高い相関値をもつ説明変数を取り除くなどの対策を取る必要があります。, 具体的には「正則化」と「次元削減」の2種類があり、それぞれ様々な手法があります。一部を紹介すると以下のようになります。, https://www.ydc.co.jp/column/0002/20190213l.html, 大きく、特徴を選択する方法(1部の入力変数のみを使用する、不要な入力変数を削除する)と特徴を抽出する方法(複数の変数を1つにまとめる、変換する)の2つがあります。それぞれの手法を紹介します。, 最後に、単回帰のときと同様に統計的な解釈を行います。ここは、statsmodelというライブラリを使って一気にやってしまいます。, 今まで求めた、モデル関数の回帰変数、切片、決定係数等、今まで求めた値がずらっと表示されています。, 闇のエンジニア/変なデジカメ開発中/ディープラーニング芸人/Raspberry Piとからあげ大好き/はてなブログ書いてます. y = Ax + Bx**2 + Cx***3 + D(3次元の場合) scikit-learn を用いた線形回帰の実行例: 各変数を正規化して重回帰分析. read_csv ('output{}.csv'. Python(StatsModels) で重回帰分析を理解し、分析の精度を上げる方法 30372 views. 単回帰のときと同様、データの読み込みと可視化を行います。 今回は、前回の最後で紹介したUC バークレー大学の UCI Machine Leaning Repository にて公開されている、「Wine Quality Data Set (ワインの品質)」の赤ワインのデータセットを利用します。 まずは、以下コマンドで、今回解析する対象となるデータをダウンロードします。 次に、pandasで分析するcsvファイルを読み込み、ファイルの中身の冒頭部分を確認します。 pandas, matplotlibなどのライブラリの使い方に関しては、以下ブログ記事を … Generalized Linear Models — scikit-learn 0.17.1 documentation Python/pandas/matplotlibを使ってcsvファイルを読み込んで素敵なグラフを描く方法(Mac/Raspberry Pi), xに説明変数全体、x1に説明変数として密度(density)、x2に説明変数として揮発酸(volatile acidity)、yに目的変数としてアルコール度数(alcohol)を入力します。, まずは、x1, x2, yをグラフで可視化します。matplotlibというライブラリを使います。, 重回帰の場合、更にパラメータの次元数が増える場合があります。その場合は、3次元にプロットすることは困難になります。, ここでは紹介しませんが、3次元以上のパラメータを可視化するとき、テクニックとしては、主成分分析を行って次元数を圧縮して可視化するなどの方法があります。, 重回帰分析で、入力変数が複数になったことで重要なこととして、正規化の必要性が挙げられます。, 何故正規化が必要かというと、入力変数の単位(m, mm)や比べる対象(温度、密度)が異なり、そのままの数字を使うと、影響度合いをうまく評価できないからです。1mの変化と1mmの変化を同じ尺度で考えてはいけないのは、直感的にも分かりますよね。, これらの変数ごとの粒度を揃えるためのデータに対して行われる前処理が正規化(normalization)です。正規化の代表的な手法は以下2つです。, 分野によっては「正規化=標準化」だったと定義が異なり紛らわしいですが、データを一定のルールに基づいて変形して、利用しやすくすることは全て正規化と呼ぶのが一般的なようです。, https://fisproject.jp/2016/06/data-standardization-using-python/, 平均と分散を使って、平均値が0、分散が1になるようにするのが標準化です。なお、標準偏差の二乗が分散なので、これ以降では分散=標準偏差として記載していきます、ご了承下さい。, 平均、分散(標準偏差)を使った標準化で紛らわしいのが、分散と不偏分散(不偏標準偏差)の違いです。, 統計が専門の人は分散といえば不偏分散を当たり前のように使うので、結構食い違うことがあります。, 不偏分散を使う理由は、統計的に扱うときに色々便利だかららしいのですが、この辺りは、私自身説明できるほど理解できていませんので、詳しい説明は以下リンク先など参照下さい(理解できるようになったら、このページにも追記します)。, また、更にややこしいのが、Pythonのライブラリのscikit-learn, pandas, numpy 機械学習でよく使われるR言語で、分散(標準偏差)をもとめるとき、デフォルトでの計算結果が、分散(population standard deviation)だったり不偏分散(sample standard deviation)だったりする点です。なので、初心者は値が合わずにパニックに陥ります(私はパニックでした)。, scikit-learnのStandardScalerメソッドでは、コマンド一発でいわゆる普通の分散を用いて標準化を行います。, pandasで正規化する場合は、デフォルトのstdメソッドは不偏分散を使って求めます。確認してみましょう。scikit-learnの求める値と異なる値になることがわかります。, 不偏分散でなく、いわゆる普通の分散を用いたい場合は、stdメソッドのddofオプションを使います。, pandasのstdメソッドのddofオプションのデフォルト値は不偏分散を求めるddof=1です。ddof=0を設定(いわゆる普通の)分散を使うと、scikit-learnの求める値と同じになります。確認してみます。, 結果は以下となります。scikit-learnのStandardScalerメソッドで求めた値と同じになりました。, 続いてNumpyで計算します。Numpyでは、デフォルトは普通の分散です。scikit-learnのStandardScalerメソッドの計算値と同じになることを確認して下さい。, pandasと同様にddofオプションを使うと、不偏分散も求められます。Numpyの場合はddof=1とします。, 分散か不偏分散かを意識して標準化を行うことが重要です。少なくとも、どちらで正規化をしているのかを把握するようにしておきましょう。そうしないと、思わぬ計算違いをしていまうことになります。, 最後に、平均、分散を使って正規化した変数の平均が0、分散が1になることを確認しましょう。分散のときは、分散か不偏分散かを意識します。, 例えば、ここで不偏分散を用いて計算するところで、普通の分散を用いて計算すると、間違った答えが出てきてしまいます。以下で、分散が1にならないことを確認しましょう。, この計算は、それほど複雑ではないのでscikit-learnを使って計算した例と、Numpyを使って計算した例を紹介します。, 上記の数字は、それぞれ編回帰係数、切片、決定係数です。正規化をしていないため、回帰変数の値が -277.78274856と-1.13941954と差が200倍以上と非常に大きいことが分かります。, 次は、先ほど行った標準化した値でScikit-learnを使った重回帰分析を行います。, StandardScalerを使用して正規化したxss_sk, yss_sk を用います。, 偏回帰係数の差が、2.5倍程度と正規化無しのときと比べて小さくなっています。正規化してから求めた偏回帰係数のことを、標準化偏回帰係数と呼び回帰係数と区別します。また入力が正規化されているので切片model_lr.intercept_は(ほぼ)0となっています。1.1769986e-14と完全に0になっていないのはScikit-learnの計算上の都合です。ほとんど問題にならないですが、気になる場合はLinearRegression()にfit_intercept=Falseのオプションをつけて計算すると完全に0になります。一方、scoreに関しては、正規化しても変わりません。, ここで、標準化偏回帰係数を用いて単純にxss_skを使ってyを計算(予測)すると、普通の回帰係数を用いて計算した結果と異なってしまい問題になります。, 実際に確認してみましょう。まず正規化無しで作成したモデルを使って予想します。これが本来求めたい値です。, 本来求めたい値と大きく異なります。これだと実際に予測したいときに困ってしまいますね。, この場合、正規化する前のモデルで逆変換して戻してあげる必要があります。scikit-learnには逆変換を行うinverse_transformがあるので、これを用いると簡単に変換できます。, 理解を深めるために、Numpyでも計算してみましょう。正規化するときと逆の計算をすればOKです。, 今回は学習の理解を深めるために、入力変数を正規化してから計算しましたが、実は標準化偏回帰係数と偏回帰係数は、以下の簡単な式で変換できます。, $\boldsymbol b^{\prime}$ : i番目の標準化偏差回帰係数、 $\boldsymbol b$ : i番目の偏差回帰係数、 $S_{ii}$ : $x$のi番目の分散、 $S_{yy}$ : $y$の分散, 参考: https://www.weblio.jp/content/標準化偏回帰係数, 偏差回帰係数から標準化偏差回帰係数にNumpyで計算して変換する場合は、以下の通りです。, このように、偏差回帰係数と標準化偏差回帰係数は簡単に変換できるので、正規化しないで重回帰分析をして偏回帰係数を求め、後から必要に応じて標準化偏回帰係数を求める方が計算上は楽です。, min-maxスケーリングでも、標準化のときと同様inverse_transformを使って変換できます。, 次にscikit-learnを使わず、Numpyで重回帰分析を行います。単回帰分析の場合は、回帰係数は共分散と分散から計算できましたが、重回帰分析の場合は、偏回帰係数を以下の行列演算で計算します(以下の式では ${\boldsymbol b}$ が偏回帰係数です)。, https://tutorials.chainer.org/ja/07_Regression_Analysis.html, 最初に、再度scikit-learnを使った重回帰での偏回帰係数の値を確認しましょう(x, yは標準化した値です), 次に、Numpyで行列演算を行い計算します。@は行列の積です。逆行列を求めるlinalgモジュールはLAとしてimportするのが通例のようなので、ここではそれに倣います, なお、Numpyで逆行列が計算できないときは、LinAlgError: Singular matrix というエラーが発生します。, 無理やり計算したい場合は、微小な値を加えるといったテクニックが必要になります。Numpyで手軽に求める場合は以下のようにpinvを使えば計算は可能です。, なお、今回は教科書的な式を計算しましたが、重回帰分析の計算は正規方程式 (normal equation) と呼ばれる以下の方程式を解くのが一般的です。詳細は、本記事コメント欄を参照下さい。, 続いて決定係数$R$ を求めます。$R$が1に近いほど、xがyを説明できていることになります。, 決定係数は、単回帰のときと同様、全変動($S_{all}$)、回帰変動($S_{reg}$), 残差変動($S_{res}$)から計算できますが、入力変数が多くなるほど1に近づくので、入力変数が複数あるときは入力変数の数($p$)で補正する「自由度調整済み決定係数」$R_f$を用います。$S_{all}$, $S_{reg}$, $S_{res}$, $R_f$には以下のような関係があります。, 以下で計算した$S_{all}$と$S_{reg} + S_{res}$が等しいことを確認します。, 以下の式より$R_f$を計算します。今回入力変数の数は2なので $p=2$となります。, 単回帰の要領で、補正を行わずに決定係数を求めると、上記の値より少し値が大きくなっているのがわかります。, 今回は、入力変数の数が2なので、それほど差がないですが、入力変数が増えるほどこの差が広がっていきます。, 詳細は以下サイト参照下さい。

œ乳瓶 ɣませ方 ǩ気穴 16, Ãラクエ Ãリューム Ãンキング 4, Lifebook S935 Âーボード交換 4, Japan Times Alpha ɟ声 4, ȥ武 Ů況 Âナウンサー 4, ǫ馬場 ň Ź均 Ãップ 5, Ãアノ Áっこいい曲 Ãック 4, Ãリアー ž部座席 Ťし方 5,

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.