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

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

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
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)

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

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

1
2
3
4
5
6
7
8
9
# 回帰係数
print(model.coef_)
 
# 切片
print(model.intercept_)
 
# 項目ごとの回帰係数
df_tmp = pd.DataFrame([model.coef_, c_name]).T
df_tmp

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

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

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

1
2
3
4
5
print(model.score(x_train, y_train))
print(model.score(x_test, y_test))
 
# 0.5857997450223474
# 0.4539700642000357

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

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

1
2
3
4
5
6
7
8
# 正解
print(y_test[0])
 
# 予測データ
print(model.predict([x_test[0]]))
 
# 93.0
# [95.78318084]

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