概要
scikit-learn
のLinearRegression
は、最も単純な多重線形回帰モデルを提供する。
モデルの利用方法の概要は以下の手順。
LinearRegression
のクラスをインポートする- モデルのインスタンスを生成する
fit()
メソッドに訓練データを与えて学習させる
学習済みのモデルの利用方法は以下の通り。
score()
メソッドにテストデータを与えて適合度を計算するpredict()
メソッドに説明変数を与えてターゲットを予測- モデルインスタンスのプロパティーからモデルのパラメーターを利用
- 切片は
intercept_
、重み係数はcoef_(
末尾のアンダースコアに注意)
- 切片は
利用例
配列による場合
以下はscikit-learnのBoston hose pricesデータのうち、2つの特徴量RM(1戸あたり部屋数)とLSTAT(下位層の人口比率)を取り出して、線形回帰のモデルを適用している。
特徴量の一部をとりだすのに、ファンシー・インデックスでリストの要素に2つの変数のインデックスを指定している。また、特徴量データXとターゲットデータyをtrain_test_split()
を使って訓練データとテストデータに分けている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
from sklearn.datasets import load_boston from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression ds = load_boston() X = ds.data[:, [5, 12]] y = ds.target X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0) lr = LinearRegression() lr.fit(X_train, y_train) print("Score:{}".format(lr.score(X_test, y_test))) print("Prediction for (7, 5):{}".format(lr.predict([[7, 5]]))) print("Intercept:{}".format(lr.intercept_)) print("Coefficients:{}".format(lr.coef_)) # Score:0.5692445415835343 # Prediction for (7, 5):[31.14766768] # Intercept:-0.6047107435077521 # Coefficients:[ 5.01785312 -0.67451869] |
DataFrameによる場合
以下の例では、データセットの本体(data)をpandasのDataFrame
として構成し、2つの特徴量RMとLSTATを指定して取り出している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import pandas as pd from sklearn.datasets import load_boston from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression ds = load_boston() df = pd.DataFrame(ds.data, columns=ds.feature_names) X = df[['RM', 'LSTAT']] y = ds['target'] X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0) lr = LinearRegression() lr.fit(X_train, y_train) print("Score:{}".format(lr.score(X_test, y_test))) print("Prediction for (7, 5):{}".format(lr.predict([[7, 5]]))) print("Intercept:{}".format(lr.intercept_)) print("Coefficients:{}".format(lr.coef_)) # Score:0.5692445415835343 # Prediction for (7, 5):[31.14766768] # Intercept:-0.6047107435077521 # Coefficients:[ 5.01785312 -0.67451869] |
利用方法
モデルクラスのインポート
scikit-learn.linear_model
パッケージからLinearRegression
クラスをインポートする。
1 |
from sklearn.linear_model import LinearRegression |
モデルのインスタンスの生成
LinearRegression
の場合、ハイパーパラメーターの指定はない。
1 |
lr = LinearRegression(fit_intercept=True, normalize=False, copy_X=True, n_jobs=None) |
fit_intercept
- 切片を計算しない場合
False
を指定。デフォルトはTrue
で切片も計算されるが、原点を通るべき場合にはFalse
を指定する。 normalize
True
を指定すると、特徴量Xが学習の前に正規化(normalize)される(平均を引いてL2ノルムで割る)。デフォルトはFalse
。fit_intercept=False
にセットされた場合は無視される。説明変数を標準化(standardize)する場合はこの引数をFalse
にしてsklearn.preprocessing.StandardScaler
を使う。copy_X
True
を指定するとXはコピーされ、False
の場合は上書きされる。デフォルトはTrue
。n_jobs
- 計算のジョブの数を指定する。デフォルトはNoneで1に相当。n_targets > 1のときのみ適用される。
モデルの学習
fit()
メソッドに特徴量とターゲットの訓練データを与えてモデルに学習させる(回帰係数を決定する)。
1 |
lr.fit(X, y) |
X
- 特徴量の配列。2次元配列で、各列が各々の説明変数に対応し、行数はデータ数を想定している。変数が1つで1次元配列の時は
reshape(-1, 1)
かスライス([:, n:n+1]
)を使って1列の列ベクトルに変換する必要がある。 y
- ターゲットの配列で、通常は1変数で1次元配列。
3つ目の引数sample_weight
は省略。
適合度の計算
score()
メソッドに特徴量とターゲットを与えて適合度を計算する。
1 |
lr.score(X, y) |
戻り値は適合度を示す実数で、回帰計算の決定係数R2で計算される。
(1)
モデルによる予測
predict()
メソッドに特徴量を与えて、ターゲットの予測結果を得る。
1 |
y_pred = lr.predict(X) |
ここで特徴量Xは複数のデータセットの2次元配列を想定しており、1組のデータの場合でも2次元配列とする必要がある。
1 |
y_pred = lr.pred([[x1, x2,..., xm]]) |
また、結果は複数のデータセットに対する1次元配列で返されるため、ターゲットが1つの場合でも要素数1の1次元配列となる。
切片・係数の利用
fit()メソッドによる学習後、モデルの学習結果として切片と特徴量に対する重み係数を得ることができる。
各々モデル・インスタンスのプロパティーとして保持されており、切片はintercept_
で1つの実数、重み係数はcoeff_
で特徴量の数と同じ要素数の1次元配列となる(特徴量が1つの場合も要素数1の1次元配列)。
1 2 |
ic = lr.intercept_ cf = lr.coef_ |
末尾のアンダースコアに注意。
実行例