【初心者】コピペでできる線形回帰

スポンサーリンク
Python




非エンジニアサラリーマンがお届けする、コピペでできる機械学習シリーズの線形回帰編です。問題解決にコードは最低限でいいと考えています。コードはコピーして、データ収集や結果の解釈に力を注いで下さい。

だれでも、すぐに実践できるようにscikit-learnのデータセットを使います。また、自身のデータでもすぐにコピペできるように、scikit-learnのデータセットを一旦データフレームにしてから機械学習を実施していきます。それでは、やっていきましょう!

環境構築は、【2020年最新】Anacondaのインストール方法

【超重要】はじめてのデータ収集方法

必要なライブラリをインポート

import pandas as pd
import numpy as np
from sklearn.datasets import load_boston
import matplotlib.pyplot as plt
%matplotlib inline

今回のデータセットはscikit-learnのデータセットにあるbostonを使用します。

データセットを整える

目的変数:住宅価格(の中央値)
説明変数:さまざまな検査結果(ここでは詳細は言及しません、ゴメンナサイ)

boston = load_boston()
df = pd.DataFrame(data = boston.data, columns = boston.feature_names)
df['PRICE'] = boston.target
df

上のコードはデータフレームにするためのコードです。
bostonのデータセットで実践する場合は上のコードを実行して下さい。
自身のデータを使用する場合は、以下のコードから実行して下さい。

機械学習がしやすいデータの形に整える

X = df.iloc[:,:-1].values  # 説明変数(最後の列以外)
y = df.iloc[:,-1].values   # 目的変数(最後の列のみ)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size = 0.25,
    random_state = 1)

訓練用のデータとテスト用のデータに分割する

線形回帰

from sklearn.linear_model import LinearRegression
lm=LinearRegression(n_jobs=-1,
                    normalize=True)
lm.fit(X_train, y_train)
y_train_pred = lm.predict(X_train)
y_test_pred = lm.predict(X_test)

y_train_predは、線形回帰で学習し、訓練データの説明変数で訓練データの目的変数を予測した値
y_test_predは、テストデータの説明変数で、テストデータの目的変数を予測した値

# 偏回帰係数
print(pd.DataFrame({"Name":df.columns.drop('PRICE'),  # 測定項目のなかで、目的変数を指定する
                    "Coefficients":lm.coef_}).sort_values('Coefficients'))

編回帰係数は目的変数に対して、どの程度影響力があるかを示します。以下が出力で、「NOX」がもっとも影響力が大きく、値がマイナスなので「NOX」が下がれば、目的変数である「PRICE」が上がります。

出力:

       Name  Coefficients
       NOX    -21.232624
       DIS     -1.471583
   PTRATIO     -0.996138
     LSTAT     -0.557414
      CRIM     -0.114429
       TAX     -0.010675
         B      0.006277
       AGE      0.006911
     INDUS      0.038300
        ZN      0.057130
       RAD      0.305784
      CHAS      2.428546
        RM      2.877234

以下のコードは、予測した値と、実際の値がどの程度差があるかを可視化したものです。

plt.scatter(y_train_pred,  y_train_pred - y_train,
            c='steelblue', marker='o', edgecolor='white',
            label='Training data')
plt.scatter(y_test_pred,  y_test_pred - y_test,
            c='limegreen', marker='s', edgecolor='white',
            label='Test data')
plt.xlabel('Predicted values')
plt.ylabel('Residuals')
plt.legend(loc='upper left')
plt.hlines(y=0, xmin=-10, xmax=50, color='r', lw=1.5, alpha=0.5)
plt.xlim([-10, 50])
plt.tight_layout()
plt.savefig('graph.jpg')
plt.show()

赤線で示しているのが、差が0で予測と実際の値が一致してるということです。
すなわち、点が赤線に近い近いほうが予測精度が高いことが分かります。

出力:

モデルの評価(線形回帰)

from sklearn.metrics import r2_score
from sklearn.metrics import mean_squared_error

print('MSE  train: %.3f, test: %.3f' % (
        mean_squared_error(y_train, y_train_pred),
        mean_squared_error(y_test, y_test_pred)))
print('RMSE train: %.3f,  test: %.3f' %(
        np.sqrt(mean_squared_error(y_train, y_train_pred)),
        np.sqrt(mean_squared_error(y_test, y_test_pred))))
print('R^2  train: %.3f,  test: %.3f' % (
        r2_score(y_train, y_train_pred),
        r2_score(y_test, y_test_pred)))

出力:

MSE train: 22.478, test: 21.898
RMSE train: 4.741, test: 4.680
R^2 train: 0.717, test: 0.779

初心者のための回帰問題の評価指標

MSEとRMSEは予測と実際の値がどの程度差があったのかを数値化したものです。どちらも、数値が小さいほうがよいです。R²は数値が大きいほうがよいです。

つまり、編回帰係数(Coefficients)がもっとも大きい「NOX(窒素酸化物の濃度)」が少なければ、住宅価格は向上する(かも)という解釈ができることになります。

線形回帰は古くから用いられており、特に統計学の分野では今でも現役です。影響度が分かるので、影響が大きい変数に対する良い変化が、目的変数をよくすることに繋がるかもしれません。

【初心者用】Pythonでできる統計手法|重回帰分析





コメント

タイトルとURLをコピーしました