Python 数学、統計、機械学習:散布図と相関分析(2) 単回帰分析
1.単回帰分析
- 単回帰分析とは、2つのデータ群を「原因」と「結果」でとらえたときに、その関係を「回帰直線」であらわすことのできる分析手法
- 単回帰式 y = ax + b を求めることで、値を予測できる
項目 | 内容 |
説明変数(x) | 原因系のデータ |
目的変数(y) | 結果系のデータ |
回帰係数(a) | 最小二乗法による傾き |
切片(b) | 最小二乗法によるy切片 |
決定係数 | 回帰式の精度判断基準として一般的に「単相関係数」を二乗した値が使われる。(決定係数、寄与率などと呼ばれる)0 から 1の値をとり、1に近いほど回帰式の精度がよい(xとyの関係が強い) |
2.試してみる
Python 数学、統計、機械学習:散布図と相関分析(1) で描いた散布図に回帰直線を重ねる
scikit-learn に含まれる、線形回帰モデルを利用する。
from sklearn import datasets from sklearn import linear_model import pandas as pd import matplotlib.pyplot as plt import math def liner_regression(*feature_index): """ https://pythondatascience.plavox.info/scikit-learn/%E7%B7%9A%E5%BD%A2%E5%9B%9E%E5%B8%B0 :return: """ # 線形回帰予測クラス lr = linear_model.LinearRegression() boston = datasets.load_boston() df_ex = pd.DataFrame(boston.data) df_ex.columns = boston.feature_names import pprint print(pprint.pprint(df_ex)) df_res = pd.DataFrame(boston.target) df_res.columns = ['Price'] y = df_res['Price'] fig = plt.figure() cnt = len(feature_index) cols = 1 if cnt == 1 else (2 if cnt < 6 else 4) rows = math.ceil(cnt / cols) idx = 1 for feature in feature_index: x = df_ex[feature] ax = fig.add_subplot(rows, cols, idx) ax.set_title(feature, fontdict={'fontsize': 10}, pad=2) ax.scatter(x, y, s=0.5) mat_x = x.reshape((-1, 1)) mat_y = y.reshape((-1, 1)) # 予測モデルを作成 # y = ax + b lr.fit(mat_x, mat_y) # a:回帰係数 a = lr.coef_ # b:切片 (誤差) b = lr.intercept_ # R^2:決定係数 r2 = lr.score(mat_x, mat_y) # 予測を実行 predict = lr.predict(mat_x) # 予測をプロット ax.plot(x, predict, 'k--', lw=0.5) label = "y = {0:.4f}x + {1:.4f}\nR^2 = {2:.4f}".format(a[0][0], b[0], r2) ax.text(x.min(), y.min(), label, fontdict={'fontsize': 8}) idx = idx + 1 plt.tight_layout() plt.show() if __name__ == "__main__": # liner_regression('CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT') liner_regression('RM', 'AGE', 'TAX', 'B')
以下のようなエラーがでるので、指示に従って、x.reshape(-1, 1) としています。
Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.
>>> import pandas as pd >>> df = pd.DataFrame([1,2,3]) >>> df.columns = ['x'] >>> x = df['x'] x 0 1 1 2 2 3 Name: x, dtype: int64 >>> x.reshape((-1,1)) array([[1], [2], [3]])
LinearRegressionのAPIについて以下サイトから引用させてもらいます。
https://pythondatascience.plavox.info/scikit-learn/%E7%B7%9A%E5%BD%A2%E5%9B%9E%E5%B8%B0
sklearn.linear_model.LinearRegression(fit_intercept=True, normalize=False, copy_X=True, n_jobs=1)
パラメータ | 内容 |
fit_intercept | False に設定すると切片を求める計算を含めない。目的変数が原点を必ず通る性質のデータを扱うときに利用。 (デフォルト値: True) |
normalize | True に設定すると、説明変数を事前に正規化します。 (デフォルト値: False) |
copy_X | メモリ内でデータを複製してから実行するかどうか。 (デフォルト値: True) |
n_jobs | 計算に使うジョブの数。-1 に設定すると、すべての CPU を使って計算します。 (デフォルト値: 1) |
属性 | 内容 |
coef_ | 偏回帰係数 |
intercept_ | 切片 |
メソッド | 内容 |
fit(X, y[, sample_weight]) | 線形回帰モデルのあてはめを実行 |
get_params([deep]) | 推定に用いたパラメータを取得 |
predict(X) | 作成したモデルを利用して予測を実行 |
score(X, y[, sample_weight]) | 決定係数 R2を出力 |
set_params(**params) | パラメータを設定 |