Sklearn + python:線形回帰の場合

一次線形方程式を使用してボストンの住宅価格を予測する

ロードされたデータは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:線形回帰の場合は、エディターによって共有されるすべてのコンテンツです。参照を提供したいと思います。

Recommended Posts

Sklearn + python:線形回帰の場合
Pythonデータサイエンス:線形回帰
Pythonデータサイエンス:線形回帰診断