見出し画像

久々にScikit Learnを弄ってみたー糖尿病患者の1年後の疾患進行状況を回帰分析

タイトルの通り。最近プログラミングの学習がうまく進んでいなかったので復習を兼ねてニューラルネットを用いた簡単な回帰分析をやってみました。
今回はカルフォルニアの住宅価格の予測を参考に糖尿病患者 の 1 年後の疾患進行状況の予測をするという、世の為人の為になりそうなことをやってます。

インポート

必要なライブラリーとデータをインポートします。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_diabetes
from sklearn.neural_network import MLPRegressor
from sklearn.model_selection import train_test_split
from sklearn import preprocessing
from sklearn import decomposition

事前準備

説明変数・目的変数に分けます。また、np.shape, df.head(), sns.pairplotを使ってデータの構造と相関を大まかに検討します。

diabetes = load_diabetes()
X = diabetes.data
y = diabetes.target

print(np.shape(X))
print(np.shape(y))

df = pd.DataFrame(X, columns= diabetes.feature_names)
df["Price"] = y

df.head()sns.pairplot(df)
plt.show()

スクリーンショット 2021-09-28 173418

画像2

この糖尿病患者のデータは正規化済みの説明変数が10個、そして目的変数が1つという構造です。実際視覚化してみると各説明変数には緩い相関がありそうだという事が分かります。

学習

モデルの学習を行います。今回は説明変数の正規化が終わっているので前処理は必要ありません。MLPRegressorの.fitメソッドを実行するとモデルが学習開始。

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.10, random_state = 1)

NN = MLPRegressor(alpha = 0.5, max_iter = 30000, hidden_layer_sizes = (10,20,10,), activation = "relu")
NN.fit(X_train, y_train)

train_score = NN.score(X_train, y_train)
test_score = NN.score(X_test, y_test)
y_pred = NN.predict(X_test)

print("Train score = ",train_score, "|", " Test score = ", test_score)
print("Train SQ score = ",np.sqrt(train_score), "|", " Test SQ score = ", np.sqrt(test_score))

スクリーンショット 2021-09-28 175350

何度かAlpha値を弄ったり、ニューラルネットの構造を変えたりしたんですがなかなか成績が上がらない... 決定係数の訓練精度は良くて0.60汎化精度は0.32チョイ位が限界でした。これが自分の今の知識でできるニューラルネットの限界かなあ。

結果出力・視覚化

import statistics

plt.figure(figsize = (18,6))
predict_accuracy = y_pred / y_test
plt.plot(predict_accuracy, alpha = 1.0, label = "Predict_accuracy", color = "Blue")
plt.show()

AVG_predict_acc = statistics.mean(predict_accuracy)
APA_norm = abs(predict_accuracy - 1)
predict_variance = statistics.mean(APA_norm)

print("Average predict accuracy = " + str(AVG_predict_acc))
print("Predict variance = " + str(predict_variance))

スクリーンショット 2021-09-28 175641

誤差を倍数で表したグラフ・誤差の平均と分散の値を求めたのがこちら。分散の値はそのモデルの実際の平均誤差と解釈することができます。汎化誤差が31%程というまあまあの成績の予測ができるモデルができたわけですが、場合によっては2倍・半分くらいの誤差があるケースもあるようなのでちょっと実用には耐えられなさそうです... 患者のデータが442件と少ないので、これが数万件ほどあればもっと正確なAIが作れるんじゃないでしょうか?

この記事が気に入ったらサポートをしてみませんか?