単項線形回帰の最小二乗法
1. 単項線形回帰
予備知識
(1) 分散
分散は、サンプルの分散の程度を測定するために使用されます。サンプルがすべて等しい場合、分散は 0 になります。分散が小さいほど、サンプルはより集中しており、そうでない場合、サンプルはより分散しています。
分散の計算式は次のとおりです。
Pythonアプリケーション:
print(np.var([6, 8, 10, 14, 18], ddof=1))
Numpy には分散を直接計算できる var メソッドがあり、ddof パラメータはベッセル (不偏推定) 補正係数 (ベッセル補正) であり、サンプル分散の不偏推定量を取得するには 1 に設定されます。
(2) 共分散
共分散は、2 つの変数の全体的な変化の傾向を表します。2 つの変数の傾向が一貫している場合、つまり、一方がその期待値よりも大きく、もう一方がそれ自体の期待値よりも大きい場合、2 つの変数間の共分散は正になります。2 つの変数の傾向が逆の場合、つまり、一方が期待値よりも大きく、もう一方が自身の期待値よりも小さい場合、2 つの変数間の共分散は負になります。2 つの変数に相関がない場合、共分散は 0 であり、変数の線形独立性は他の相関が存在しないことを意味するものではありません。
共分散の式は次のとおりです。
Pythonアプリケーション:
print(np.cov([6, 8, 10, 14, 18], [7, 9, 13, 17.5, 18])[0][1])
単変量線形回帰式
2番目に、重回帰を解く最小二乗法
重回帰式
マトリックス形式で書くと次のようになります。
これは、Numpy の行列演算を通じて Python を使用して実行できます。
Numpy は、このプロセスを実装するための最小二乗関数も提供します。
3.多項式回帰(線形回帰ではなくなりました)
上の例では、説明変数と応答変数の関係が線形であると仮定しました。必ずしもそうとは限りません。以下では、指数項 (次数が 1 より大きい) を追加する特別なタイプの重線形回帰である多項式回帰を使用します。現実世界の曲線関係は多項式を追加することで実現され、その実装は重線形回帰に似ています。
場合:
import numpy as np from sklearn.linear_model
import LinearRegression from sklearn.preprocessing
import PolynomialFeatures
X_train = [[6], [8], [10], [14], [18]]
y_train = [[7], [9], [13], [17.5], [18]]
X_test = [[6], [8], [11], [16]]
y_test = [[8], [12], [15], [18]]
regressor = LinearRegression()
regressor.fit(X_train, y_train)
xx = np.linspace(0, 26, 100)
yy = regressor.predict(xx.reshape(xx.shape[0], 1))
plt = runplt()
plt.plot(X_train, y_train, 'k.')
plt.plot(xx, yy)
quadratic_featurizer = PolynomialFeatures(degree=2)
X_train_quadratic = quadratic_featurizer.fit_transform(X_train)
X_test_quadratic = quadratic_featurizer.transform(X_test)
regressor_quadratic = LinearRegression()
regressor_quadratic.fit(X_train_quadratic, y_train)
xx_quadratic = quadratic_featurizer.transform(xx.reshape(xx.shape[0], 1))
plt.plot(xx, regressor_quadratic.predict(xx_quadratic), 'r-')
plt.show()
print(X_train)
print(X_train_quadratic)
print(X_test)
print(X_test_quadratic)
print('一元线性回归 r-squared', regressor.score(X_test, y_test))
print('二次回归 r-squared', regressor_quadratic.score(X_test_quadratic, y_ test))
4. 最適化
前の計算はコスト関数を最小化するものとして理解でき、コスト関数は次のように計算されます。
こちらが説明変数行列ですが、変数の数が多い(数万個)と計算量が非常に多くなります。また、 の行列式が 0、つまり特異行列の場合、逆行列を求めることはできません。ここでは、パラメータ推定の別の方法である勾配降下法を紹介します。フィッティングの目標は変更されておらず、パラメータ推定には依然としてコスト関数の最小化を使用しています。
モデルに適合する勾配降下法
確率的勾配降下法 (SGD)
以下では、scikit-learn の SGDRegressor クラスを使用してモデルパラメータを計算します。さまざまなコスト関数を最適化することで線形モデルを適合できます。デフォルトのコスト関数は残差二乗和です。
二乗残差の合計によって形成されるコスト関数は凸関数であるため、勾配降下法では大域的最小値を見つけることができます。
場合:
import numpy as np
from sklearn.datasets import load_boston
from sklearn.linear_model import SGDRegressor
from sklearn.cross_validation import cross_val_score
from sklearn.preprocessing import StandardScaler
from sklearn.cross_validation import train_test_split
data = load_boston()
X_train, X_test, y_train, y_test = train_test_split(data.data, data.targe t)
X_scaler = StandardScaler()
y_scaler = StandardScaler()
X_train = X_scaler.fit_transform(X_train)
y_train = y_scaler.fit_transform(y_train)
X_test = X_scaler.transform(X_test)
y_test = y_scaler.transform(y_test)
regressor = SGDRegressor(loss='squared_loss')
scores = cross_val_score(regressor, X_train, y_train, cv=5)
print('交叉验证R方值:', scores)
print('交叉验证R方均值:', np.mean(scores))
regressor.fit_transform(X_train, y_train)
print('测试集R方值:', regressor.score(X_test, y_test))
リッジリターン
リッジ回帰は、係数の大きさにペナルティを課すことで、通常の最小二乗法の問題の一部に対処します。リッジ係数は、ペナルティを伴う残差二乗和を最小化します。