機械学習の勉強として、しばらくはscikit-learnで用意されたデータを使って様々な分析をおこなっていこうと思う。

さて、今回は「糖尿病患者の診療データ」を使った重回帰分析がテーマだ。

データセットの読み込み〜モデルの学習

コードを書くのも慣れてきたので一気にモデルの学習までおこなう。

from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
from sklearn import linear_model
import pandas as pd

diabetes = load_diabetes()

c_name = ['age', 'sex', 'bmi', 'map', 'tc', 'ldl', 'hdl', 'tch', 'ltg', 'glu']

x = diabetes.data
y = diabetes.target

x_test, x_train, y_test, y_train = train_test_split(x, y, test_size=0.2, shuffle=True)

model = linear_model.LinearRegression()
model.fit(x_train, y_train)

たったこれだけのコードで重回帰分析の学習モデルが完成する。

では、まず学習済みモデルの回帰係数を確認してみよう。

# 回帰係数
print(model.coef_)

# 切片
print(model.intercept_)

# 項目ごとの回帰係数
df_tmp = pd.DataFrame([model.coef_, c_name]).T
df_tmp

今回の学習結果では「bmi」の回帰係数が高く、目的変数(1年後の疾患進行状況)に大きく影響を与えることが分かった。

モデルの決定係数(精度)の確認

では次にモデルの決定係数を確認し、予測の精度を見てみよう。

print(model.score(x_train, y_train))
print(model.score(x_test, y_test))

# 0.5857997450223474
# 0.4539700642000357

重回帰分析の決定係数の目安は50%なので、まずまずの結果だ。

実際にテストデータを一つ予測してみると次の結果が得られた。

# 正解
print(y_test[0])

# 予測データ
print(model.predict([x_test[0]]))

# 93.0
# [95.78318084]

正解データにかなり近い予測値が得られたので、今回の重回帰分析モデルは良くできていると言えよう。