一次線形方程式を使用してボストンの住宅価格を予測する
ロードされたデータはsklearnでリリースされ、1993年以前にボストンによって収集された506軒の家のデータと価格から取得されます。 load_boston()は、データをロードするために使用されます。
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
import time
from sklearn.linear_model import LinearRegression
boston =load_boston()
X = boston.data
y = boston.target
print("X.shape:{}. y.shape:{}".format(X.shape, y.shape))print('boston.feature_name:{}'.format(boston.feature_names))
X_train, X_test, y_train, y_test =train_test_split(X, y, test_size=0.2, random_state=3)
model =LinearRegression()
start = time.clock()
model.fit(X_train, y_train)
train_score = model.score(X_train, y_train)
cv_score = model.score(X_test, y_test)print('time used:{0:.6f}; train_score:{1:.6f}, sv_score:{2:.6f}'.format((time.clock()-start),
train_score, cv_score))
出力は次のとおりです。
X.shape:(506,13). y.shape:(506,)
boston.feature_name:['CRIM''ZN''INDUS''CHAS''NOX''RM''AGE''DIS''RAD''TAX''PTRATIO''B''LSTAT']
time used:0.012403; train_score:0.723941, sv_score:0.794958
テストセットの正解率は高くなく、適合性が低いはずであることがわかります。
線形回帰に多項式を使用する
上記の例は適合不足であり、モデルが単純すぎてデータを適合できないことを示しています。ここで、モデルの複雑さを増し、多項式を導入します。
たとえば、元の機能が2つの機能[a、b]である場合、
次数が2の場合、多項式特性は[1、a、b、a ^ 2、ab、b ^ 2]になります。次数が他の値である場合は、類推によって推測することができます。
多項式機能は、データとモデルの複雑さを増すことと同等であり、より適切なフィッティングを可能にします。
次のコードは、パイプラインを使用して多項式機能と線形回帰機能を接続し、最後に次数が1、2、および3のときにスコアをテストします。
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
import time
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipeline
def polynomial_model(degree=1):
polynomial_features =PolynomialFeatures(degree=degree, include_bias=False)
linear_regression =LinearRegression(normalize=True)
pipeline =Pipeline([('polynomial_features', polynomial_features),('linear_regression', linear_regression)])return pipeline
boston =load_boston()
X = boston.data
y = boston.target
print("X.shape:{}. y.shape:{}".format(X.shape, y.shape))print('boston.feature_name:{}'.format(boston.feature_names))
X_train, X_test, y_train, y_test =train_test_split(X, y, test_size=0.2, random_state=3)for i inrange(1,4):print('degree:{}'.format( i ))
model =polynomial_model(degree=i)
start = time.clock()
model.fit(X_train, y_train)
train_score = model.score(X_train, y_train)
cv_score = model.score(X_test, y_test)print('time used:{0:.6f}; train_score:{1:.6f}, sv_score:{2:.6f}'.format((time.clock()-start),
train_score, cv_score))
出力は次のとおりです。
X.shape:(506,13). y.shape:(506,)
boston.feature_name:['CRIM''ZN''INDUS''CHAS''NOX''RM''AGE''DIS''RAD''TAX''PTRATIO''B''LSTAT']
degree:1
time used:0.003576; train_score:0.723941, sv_score:0.794958
degree:2
time used:0.030123; train_score:0.930547, sv_score:0.860465
degree:3
time used:0.137346; train_score:1.000000, sv_score:-104.429619
次数1は、上記の多項式を使用しない場合と同じであることがわかります。トレーニングセットの次数のスコアは3で、テストセットのスコアは負であり、明らかに過適合です。
したがって、最終的には次数2のモデルを選択する必要があります。
2次多項式は1次多項式よりもはるかに優れていますが、テストセットとトレーニングセットのスコアの間にはまだ大きなギャップがあります。これがデータ不足の理由である可能性があります。モデルの精度をさらに向上させるには、より多くの情報が必要です。
正規方程式解と勾配降下の比較
最適解を概算するための勾配降下法に加えて、最終解は、通常の方程式解法を使用して直接計算することもできます。
Wu Endaのコースによると、線形回帰の最適なソリューションは次のとおりです。
theta = (X^T * X)^-1 * X^T * y
実際、2つの方法にはそれぞれ長所と短所があります。
勾配降下法:
短所:学習率を選択する必要があり、複数の反復が必要です
利点:固有値が多い場合(10,000を超える場合)でも、良好な速度で動作できます
通常の方程式の解:
利点:学習率を設定する必要がなく、複数回繰り返す必要がありません
短所:Xの転置と逆、複雑さO3を計算する必要があります;特に多くの固有値(10,000を超える)がある場合は遅くなります
分類などの非線形計算では、正規方程式解法は適用できないため、勾配降下法の用途は広くなります。
上記のsklearn + python:線形回帰の場合は、エディターによって共有されるすべてのコンテンツです。参照を提供したいと思います。