重回帰のチュートリアルへようこそ。
重回帰の概念と機械学習におけるその使用法について見ていきます。
重回帰の概念に入る前に、単回帰の概念を紹介します。
単回帰とは?
回帰とは、与えられたデータから値を予測する機械学習の手法の一つです。
例えば、従業員の詳細と給与に関するデータセットがあるとします。
このデータセットには、「経験年数」や「給与」などの属性が含まれます。
ここで、この業界で8年間働いているであろう人の給料を予測するために、回帰を使うことができます。
単純な線形回帰では、データに対して最適な直線を求め、この直線に基づいて値を予測します。
この直線の方程式は次のようになります。
y = b0 + b1 * x1
|
上の式で、yは独立変数x1を使って予測される従属変数です。
ここで、b0 と b1 は定数です。
重回帰とは?
重回帰は、モデルが予測結果のために1つ以上の独立変数に依存する単回帰の拡張です。
重回帰の式は、次のようになります。
y = b0 + b1 * x1 + b2 * x2 + .... + bn * xn
|
ここで、y は従属変数で、x1, x2,…,xn はyの値を予測するために使用される独立変数です。
重回帰モデル構築のステップ
モデルを構築する前に、5つのステップを実行する必要があります。
これらのステップを以下に説明します。
ステップ1: 変数の特定
モデルの構築を開始する前に、結果に影響を与える主要な属性である従属変数と独立変数を理解することが重要です。
従って、変数を正しく識別するために十分な時間を費やすことを確認してください。
ステップ 2: キャベット/仮定を確認する
重回帰には5つの仮定があることに注意することがとても大切です。
これらは以下の通りです。
- 線形性
線形性 * ホモソデスティシティ - 多変量正規性
- 誤差の独立性
- 多重共線性の欠如
ステップ3:ダミー変数の作成
従属変数と独立変数の関係を確認したい場合、ダミー変数が登場します。
カテゴリー変数がある場合、ダミー変数を作成します。
このために、我々は、0と1の列を作成します。
例えば、いくつかの州の名前があり、我々のデータセットにはニューヨークとカリフォルニアの2つだけです。
この0と1がダミー変数です。
この記事もチェック:Pythonでデータセットから別のデータセットへピボットテーブルを作成する
ステップ4:ダミー変数の罠を回避する
ダミー変数を作成した後、ダミートラップのシナリオに到達しないようにすることが必要です。
線形回帰において、1つ以上の変数が別の変数を予測する現象は、しばしば多重共線性と呼ばれる。
この結果、我々のモデルがダミー変数D1とD2の効果を区別することができないシナリオがあるかもしれません。
このような状況は、ダミー変数の罠です。
この問題の解決策としては、ダミー変数の片方を省略することが考えられる。
上記のニューヨークとカリフォルニアの例では、ニューヨークとカリフォルニアの 2 列ではなく、以下のように 1 列で 0 と 1 とだけ表記することができる。
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
dataset = pd.read_csv( '50_Startups.csv' )
dataset.head() |
ステップ 5: 最後に、モデルを構築する
出力変数を決定するために、多くの独立変数が入力されました。
しかし、1つの方針として、ガベージ・イン・ガベージ・アウトを念頭に置く必要があります。
これは、必要な変数だけをモデルに入力し、すべての変数を入力してはいけないという意味です。
すべての変数を入力すると、エラーを起こしやすいモデルになってしまう可能性があります。
また、モデルを構築する際には、そのモデルをユーザーに見せる必要があることも覚えておいてほしい。
あまりに多くの変数を説明するのは、比較的困難です。
モデルを構築する際に従うことができる5つの方法があります。
ステップワイズ回帰の手法があります。
- オールイン
- 後退排除(Backward Elimination
- フォワード選択
- 双方向の消去
- スコープ比較
これらのモデルのそれぞれについて詳しく説明することは、この記事の範囲外です。
しかし、今回はその一例を見てみることにします。
Python による多重線形回帰の実装
50のスタートアップがあげた利益を示すデータセットを考えてみましょう。
matplotlib ライブラリで作業することにします。
データセットへのリンクは – https://github.com/content-anu/dataset-multiple-regression です。
データセットのインポート
X = dataset.iloc[:,: - 1 ].values
y = dataset.iloc[:, 4 ].values
|
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelEncoder_X = LabelEncoder()
X[:, 3 ] = labelEncoder_X.fit_transform(X[ : , 3 ])
from sklearn.compose import ColumnTransformer
ct = ColumnTransformer([( 'encoder' , OneHotEncoder(), [ 3 ])], remainder = 'passthrough' )
X = np.array(ct.fit_transform(X), dtype = np. float )
|
このように、上に示したデータセットのサンプルでは、3つの独立変数 – R&D spend, Administration and marketing spendがあることに気づきます。
これらは従属変数であるProfitの計算に寄与しています。
データサイエンティストの役割は、これらの分野のどれに投資することが会社の利益を増やすことになるかを分析することです。
データ前処理
特徴量の行列と依存ベクトルを構築します。
ここで、特徴量の行列とは、独立変数の行列のことです。
X = X[:, 1 :]
|
カテゴリカル変数のエンコード
このモデルにはカテゴリ変数がある。
State」はカテゴリカル変数です。
ラベルエンコーダを使用します。
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2 , random_state = 0 )
|
ラベル・エンコードを先に行ったのは、One hotエンコードは数値データに変換してからでないと行えないからです。
ダミー変数を作るには数値が必要です。
ダミー変数の罠を回避する
以下のコードでは、Xから最初の列を削除して、すべての行を配置しています。
インデックス0だけを無視します。
これはダミー変数の罠を回避するためです。
from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(X_train, y_train) |
テストセットと学習セットの分割
一般に、データセットの20%をテストセット、80%を学習セットと考える。
学習セットとは、このパラメータに従ってモデルを学習し、「テストセット」に対してテストを行い、テストの出力が先のデータセットで与えられた出力と一致するかどうかを確認することを意味します。
y_pred = regressor.predict(X_test)
y_test |
モデルのフィッティング
y_pred |
上記のコードスニペットの出力は、以下のような小さな行になります。
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
dataset = pd.read_csv( '50_Startups.csv' )
dataset.head() # data preprocessing X = dataset.iloc[:,: - 1 ].values
y = dataset.iloc[:, 4 ].values
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelEncoder_X = LabelEncoder()
X[:, 3 ] = labelEncoder_X.fit_transform(X[ : , 3 ])
from sklearn.compose import ColumnTransformer
ct = ColumnTransformer([( 'encoder' , OneHotEncoder(), [ 3 ])], remainder = 'passthrough' )
X = np.array(ct.fit_transform(X), dtype = np. float )
X = X[:, 1 :]
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2 , random_state = 0 )
# Fitting the model from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(X_train, y_train) # predicting the test set results y_pred = regressor.predict(X_test)
y_test y_pred |
テストセットの結果を予測する
我々は、テスト集合の利益のすべての予測を含むベクトルを作成します。
そして、予測された利益は、y_pred.というベクトルに入れられます(テスト集合のすべてのオブザベーションの予測を含む)。
predict’ メソッドは、テスト集合の予測を作成します。
したがって、入力はテスト集合です。
predict のパラメータは、配列またはスパース行列でなければならず、したがって入力は X_test です。
今までのモデルフィットがデータセットに最適なモデルである必要はありません。
モデルを構築するとき、すべての独立変数を使用しました。
しかし、この独立変数の中に、統計的に有意な(大きな影響を与える)従属変数があるとしたらどうでしょうか?
また、全く有意でない変数があったとしたらどうでしょうか?
したがって、それぞれの独立変数が強力で、統計的に有意で、確実に効果を持つように、独立変数の最適なチームが必要です。
この効果は、正(独立変数が1単位減少すると、利益が増加する)にも負(独立変数が1単位増加すると、利益が減少する)にもなりえます。
我々は、統計モデルを用いて後方消去を実行します。
しかし、このトピックはこの記事で説明しません。
Python による重回帰の完全なコード
出力は以下のような予測値になります。
まとめ
結論として、線形回帰の利点は、どのようなサイズのデータセットでも動作し、特徴の関連性についての情報を与えることです。
しかし、これらのモデルは特定の仮定に基づいて動作するため、欠点とみなすことができます。