【機械学習】NumpyとScikit-learnで重回帰分析をやってみた。

機械学習

こんにちは!エンジニアのオオイシです。

Scikit-learnを使って線形回帰モデルを作成し、重回帰分析をやってみたので手順を紹介して行きます。

重回帰分析で線形代数を使ったパラメーターを求めるには、

$${w} = ({X}^{T}{X})^{-1}{X}^{T}{y}$$

の式が使えます。

しかし、Scikit-learnを使うと難しい算術式は使わなくても実装が可能なので、今回は、

の2つを試して比較してみました。

重回帰分析とは

回帰分析とは、統計学上のデータ解析手法のひとつで、

  1. 過去のデータの傾向をみて結果を予測する
  2. 結果への影響量を測る

を分析します。

例えば、賃貸アパートの家賃と広さの関係を見ると、

  • 家賃: 8万円 → 広さ: 30平米
  • 家賃: 12万円 → 広さ: 45平米
  • 家賃: 15万円 → 広さ: 50平米

といったデータがあるときに、これらのデータを学習させて「広さ40平米の場合には家賃いくらになるか?」などを予測することができます。

重回帰分析の場合は、家賃が8万円を考えた時に、

  • 広さ
  • 駅からの距離
  • 築年数

などの複数の要素から予測しようというものです。

厳密には、広さ、距離、築年数それぞれの家賃に与える影響度をみる

w(重み)=パラメータ

を導出します。

Scikit-learnで重回帰分析を実装してみる

今回は、サンプルデータは次のようにしました。

  • X = 広さ、距離、築年数
  • y  = 家賃

$${X} = \begin{bmatrix}1&20&1&1 \\1&25&3&4 \\1&30&4&6 \\1&40&5&20 \end{bmatrix} y=\begin{bmatrix}7\\8\\9\\11 \end{bmatrix}$$

列の1番目の1は切片を表現しますが、中央化して切片は考慮しなくて良いのでダミーデータが入ります。

インストール

NumpyとScikit-learnをインストールします。

サンプルデータの準備

少ないサンプルデータのため、手動でベクトルデータを作成します。

  • numpy.array( 値 ) → ベクトル(配列)の作成

学習モデルの準備

Scikit-learnには、回帰分析を行うクラスとしてLinearRegressionがあります。

これを使って学習のためのモデルを作成します。

  • モデル.fit(X, y) → モデルの学習
  • モデル.coef_ → 学習後の最適なパラメータ値
  • モデル.intercept_→ 学習後の切片
fitメソッド( ) でカンタンに学習させることができました。

予測する

予想値をみてみます。

  • モデル.predict(ベクトル) → 予測
27平米、駅から3km、築8年で9.5万円と予測できました。

サンプルデータが少ないですが、それっぽい結果が得られましたね!?

Numpyで重回帰分析を実装してみる

Scikit-learnを使うととても簡単に実装できましたが、Numpyを使って愚直に実装してみました。

パラメータを求めるための式を使って実装します。

$${w} = ({X}^{T}{X})^{-1}{X}^{T}{y}$$

予測値は次の式で求まります。

$${y}=\displaystyle \sum_{ i = 0 }^{ n } a_n x_n$$

 

Scikit-learnで得られた結果と同じパラメーターと予測値になりました。

しかし、Numpyだと計算を間違いそうなので、Scikit-learnを使う方が良さそうですね!