Scikit-learnで機械学習(回帰分析)

Scikit-learnで機械学習(回帰分析)

scikit-learnで回帰分析を行う方法です。データは付属のBoston house-prices(ボストン市の住宅価格)を利用します。

scikit-learnでボストン住宅価格を回帰分析する




データセット読み込みと内容確認

Boston house-pricesデータセットは、米国ボストン市郊外の地域別の13種類の特徴と住宅価格の統計情報です。13種の項目は以下の内容です。

CRIM犯罪発生率
ZN住居区画の密集度
INDUS非小売業の土地割合
CHASチャールズ川 (1: 川の周辺, 0: それ以外)
NOXNOx濃度
RM住居の平均部屋数
AGE1940年より前に建てられた物件割合
DIS5つのボストン市の雇用施設からの重み付き距離
RAD大きな道路へのアクセスしやすさ
TAX$10,000ドルあたりの所得税率
PTRATIO教師あたりの生徒数
B黒人の比率 1000(Bk – 0.63)^2
LSTAT低所得者の割合


回帰分析前の準備で、Bostonデータの読み込みとデータ内容を確認します。

  • ボストンデータセットの読み込み [1]
  • データセットdict_keysを確認 [2]
  • データをPasdasデータフレームに代入して内容確認 [3,4]
  • Seabornのpairplotで散布図行列を描画、ざっくり相関確認 [5,6]
In [1]:
# bostonデータ読み込み
from sklearn import datasets
boston = datasets.load_boston()
In [2]:
# bostonデータ確認(dict-keys)
boston.keys()
Out[2]:
dict_keys(['data', 'target', 'feature_names', 'DESCR'])
In [3]:
# bostonデータをPandasに代入してデータ確認
import pandas as pd
boston_df = pd.DataFrame(boston.data, columns=boston.feature_names) # 説明変数(data)
boston_df['PRICE'] = boston.target # 目的変数(target)追加
boston_df.head()
Out[3]:
CRIM ZN INDUS CHAS NOX RM AGE DIS RAD TAX PTRATIO B LSTAT PRICE
0 0.00632 18.0 2.31 0.0 0.538 6.575 65.2 4.0900 1.0 296.0 15.3 396.90 4.98 24.0
1 0.02731 0.0 7.07 0.0 0.469 6.421 78.9 4.9671 2.0 242.0 17.8 396.90 9.14 21.6
2 0.02729 0.0 7.07 0.0 0.469 7.185 61.1 4.9671 2.0 242.0 17.8 392.83 4.03 34.7
3 0.03237 0.0 2.18 0.0 0.458 6.998 45.8 6.0622 3.0 222.0 18.7 394.63 2.94 33.4
4 0.06905 0.0 2.18 0.0 0.458 7.147 54.2 6.0622 3.0 222.0 18.7 396.90 5.33 36.2
In [4]:
boston_df.describe() # 統計量
Out[4]:
CRIM ZN INDUS CHAS NOX RM AGE DIS RAD TAX PTRATIO B LSTAT PRICE
count 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000 506.000000
mean 3.593761 11.363636 11.136779 0.069170 0.554695 6.284634 68.574901 3.795043 9.549407 408.237154 18.455534 356.674032 12.653063 22.532806
std 8.596783 23.322453 6.860353 0.253994 0.115878 0.702617 28.148861 2.105710 8.707259 168.537116 2.164946 91.294864 7.141062 9.197104
min 0.006320 0.000000 0.460000 0.000000 0.385000 3.561000 2.900000 1.129600 1.000000 187.000000 12.600000 0.320000 1.730000 5.000000
25% 0.082045 0.000000 5.190000 0.000000 0.449000 5.885500 45.025000 2.100175 4.000000 279.000000 17.400000 375.377500 6.950000 17.025000
50% 0.256510 0.000000 9.690000 0.000000 0.538000 6.208500 77.500000 3.207450 5.000000 330.000000 19.050000 391.440000 11.360000 21.200000
75% 3.647423 12.500000 18.100000 0.000000 0.624000 6.623500 94.075000 5.188425 24.000000 666.000000 20.200000 396.225000 16.955000 25.000000
max 88.976200 100.000000 27.740000 1.000000 0.871000 8.780000 100.000000 12.126500 24.000000 711.000000 22.000000 396.900000 37.970000 50.000000
In [5]:
# 散布図行列でざっくり相関を確認(全項目14×14)
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns
sns.pairplot(boston_df) # seaborn.pariplotで散布図行列の描画
Out[5]:
<seaborn.axisgrid.PairGrid at 0xac593e2c>
In [6]:
# RM(部屋数)と価格を指定して散布図行列をプロット
sns.pairplot(boston_df[['RM', 'PRICE']])
Out[6]:
<seaborn.axisgrid.PairGrid at 0xa513aacc>


説明変数を一つだけ使って単回帰分析

始めは説明変数(特徴)を一つだけ使って回帰分析を行います。説明変数は正の相関が見られる部屋数(RM)を使います。目的変数は住宅価格です。

  • データセット読み込み、説明変数(部屋数)と目的変数(価格)変数に代入 [1]
  • モデル(LinearRegression)の作成と学習 [2]
  • 学習結果で得れれた回帰式の係数と切片を確認 [3]
  • 直線回帰式をMatplotlibで可視化 [4]
  • MSE値(平均二乗誤差)と\(R^2\)値を確認 [5]
In [1]:
from sklearn import datasets
import pandas as pd

# bostonデータ読み込み
boston = datasets.load_boston()

# RM(部屋数)とPRICE(価格)で回帰分析
X_RM = boston.data[:, [5]] # RM(部屋数)
y_PRICE = boston.target # target(価格)
In [2]:
# モデル作成
from sklearn import linear_model
clf = linear_model.LinearRegression() # 線形回帰

# RMとPRICEの全データで学習
clf.fit(X_RM, y_PRICE)
Out[2]:
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
In [3]:
# 学習で求められた回帰式(ax+b)の切片と係数を確認
a = clf.coef_ # 係数
b = clf.intercept_ # 切片
print('coefficient a = ', a) 
print('intercept b = ', b) 
coefficient a =  [ 9.10210898]
intercept b =  -34.6706207764
In [4]:
# 回帰式をグラフで可視化
%matplotlib inline
import matplotlib.pyplot as plt
plt.xkcd() # 手書き風
plt.scatter(X_RM, y_PRICE, c='gray', alpha=0.5) # データプロット

lreg_y = a * X_RM + b # clf.predict(X_RM)の出力値と同じ
plt.plot(X_RM, lreg_y, 'r') # 回帰直線プロット

plt.ylabel('Price in $1,000s')
plt.xlabel('Number of rooms')
plt.title('Boston house-prices')
Out[4]:
<matplotlib.text.Text at 0xaa2a346c>
In [5]:
# MSE(平均二乗誤差 Mean Squared Error、小さいほどモデルの誤差が少ない)
from sklearn.metrics import mean_squared_error
y_pred = clf.predict(X_RM)
mse = mean_squared_error(y_PRICE, y_pred)
print('MSE = ', mse)
MSE =  43.6005517712
In [6]:
# R^2の確認(モデルの当てはまり良さの指標、最も良い場合1)  
print('R^2 = ', clf.score(X_RM, y_PRICE))
R^2 =  0.483525455991


説明変数を全て使って重回帰分析

次は、13種類の説明変数(特徴)を全て利用して重回帰分析を行います。

  • データセット読み込み、説明変数(全て)と目的変数(価格)変数に代入 [1]
  • モデル(LinearRegression)の作成と学習 [2]
  • 学習結果で得れれた重回帰式の係数(13個)と切片を確認 [3,4]
  • MSE値(平均二乗誤差)と\(R^2\)値を確認 [5,6]
In [1]:
from sklearn import datasets
import pandas as pd

# bostonデータ読み込み
boston = datasets.load_boston()

X_ALL = boston.data # 全13種類
y_PRICE = boston.target # target(価格)
In [2]:
# モデル作成
from sklearn import linear_model
clf = linear_model.LinearRegression() # 線形回帰

# RMとPRICEの全データで学習
clf.fit(X_ALL, y_PRICE)
Out[2]:
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)

重回帰式
\[y = b + a_0 x_0 + a_1 x_1 + \dots + a_{12} x_{12}\]

In [3]:
# 重回帰式の切片
print('intercept b = ', clf.intercept_)
intercept b =  36.4911032804
In [4]:
# 重回帰式の係数
import pandas as pd
coef_df = pd.DataFrame(boston.feature_names, columns=['Feature'])
coef_df['coefficient'] = pd.Series(clf.coef_)
coef_df
Out[4]:
Feature coefficient
0 CRIM -0.107171
1 ZN 0.046395
2 INDUS 0.020860
3 CHAS 2.688561
4 NOX -17.795759
5 RM 3.804752
6 AGE 0.000751
7 DIS -1.475759
8 RAD 0.305655
9 TAX -0.012329
10 PTRATIO -0.953464
11 B 0.009393
12 LSTAT -0.525467
In [5]:
# MSE(平均二乗誤差 Mean Squared Error、小さいほどモデルの誤差が少ない)
from sklearn.metrics import mean_squared_error
y_pred = clf.predict(X_ALL)
mse = mean_squared_error(y_PRICE, y_pred)
print('MSE = ', mse)
MSE =  21.8977792177
In [6]:
# R^2の確認(モデルの当てはまり良さの指標、最も良い場合1)  
print('R^2 = ', clf.score(X_ALL, y_PRICE))
R^2 =  0.740607742865

単回帰分析のときより、MSE値が小さく\(R^2\)値も向上しています。


訓練データとテストデータに分割して重回帰分析(モデル検証)

最後に、訓練データとテストデータに分割してモデルの検証を行います。

  • データセット読み込み[1]
  • 訓練データとテストデータ(default=25%)に分割 [2]
  • 訓練データとテストデータの件数確認 [3]
  • モデル(LinearRegression)の作成と訓練データで学習 [4]
  • MSE値(平均二乗誤差)と\(R^2\)値を確認 [5,6]
In [1]:
from sklearn import datasets
import pandas as pd

# bostonデータ読み込み
boston = datasets.load_boston()
In [2]:
# Bostonデータを訓練データとテストデータに分割(default=25%)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
        boston.data, boston.target, random_state=0)
In [3]:
# 分割後のデータ件数
print('train = ', len(X_train))
print('test =', len(X_test))
train =  379
test = 127
In [4]:
# モデル作成
from sklearn import linear_model
clf = linear_model.LinearRegression() # 線形回帰

# 訓練データ(75%)で学習
clf.fit(X_train, y_train)
Out[4]:
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
In [ ]:
# テストデータ(25%)でモデルを検証
In [5]:
# MSE(平均二乗誤差 Mean Squared Error、小さいほどモデルの誤差が少ない)
from sklearn.metrics import mean_squared_error
pred = clf.predict(X_test)
mse = mean_squared_error(y_test, pred)
print('MSE = ', mse)
MSE =  29.7905591642
In [6]:
# R^2の確認(モデルの当てはまり良さの指標、最も良い場合1)  
print('R^2 = ', clf.score(X_test, y_test))
R^2 =  0.635362078667

ボストン住宅価格データを使った回帰分析は以上です。


スポンサーリンク

0 件のコメント :

コメントを投稿