機械学習の勉強として、しばらくは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]
正解データにかなり近い予測値が得られたので、今回の重回帰分析モデルは良くできていると言えよう。