100日後にプロになるワシ23日目(Python)
昨日はデータの分析をしました。
今日はデータの分析の続きとようやく機械学習までできました!
目的
「健康経営のための疾患リスク予測」
つまり患者のカルテのデータから疾患があるかどうかを予測するプログラムを作成する。
相関を確認する
今まで(前回の引っ越しの回数予想)は自分の経験や間に基づく関係性を調べていました。
例えば引っ越し数との関係性が高いのは土日かどうかとか、2月とか3月などの繁忙期かどうかなど。
ただ、今回の場合。
T_BillとかD_Billとか言われてもさっぱりわからん
Age Gender T_Bil D_Bil ALP ALT_GPT AST_GOT TP Alb AG_ratio
0 65 Female 1.0 0.2 187 16 18 6.8 3.3 0.92
1 62 Male 11.2 5.6 699 64 100 7.5 3.2 0.73
2 62 Male 7.6 4.2 490 60 68 7.0 3.3 0.87
3 58 Male 1.3 0.5 182 14 20 6.8 3.4 0.98
(↑今回のデータ)
だから相関関係を調べてどのデータがどのデータと紐づくかを調べる。
ま、実際機械学習するってなったら自分が詳しい分野だけってわけでもないだろうからこういうのは必要なんだろうな。。。という認識
というわけで、相関を調べるcorr()という関数を使う
これがまた超便利でcorr()だけでデータフレームのすべての相関が取れる
Age T_Bil D_Bil ALP ALT_GPT AST_GOT \
Age 1.000000 0.033965 0.030999 0.060460 -0.059396 -0.003819
T_Bil 0.033965 1.000000 0.881271 0.236756 0.241730 0.260367
D_Bil 0.030999 0.881271 1.000000 0.264557 0.261488 0.280029
ALP 0.060460 0.236756 0.264557 1.000000 0.147286 0.183362
ALT_GPT -0.059396 0.241730 0.261488 0.147286 1.000000 0.795303
AST_GOT -0.003819 0.260367 0.280029 0.183362 0.795303 1.000000
TP -0.228393 -0.016766 -0.010099 -0.025860 -0.034923 -0.024031
Alb -0.281486 -0.227373 -0.233630 -0.177643 -0.041113 -0.092083
AG_ratio -0.177030 -0.281890 -0.292797 -0.247580 -0.023351 -0.093665
disease 0.161895 0.315357 0.340468 0.245491 0.212509 0.199098
TP Alb AG_ratio disease
Age -0.228393 -0.281486 -0.177030 0.161895
T_Bil -0.016766 -0.227373 -0.281890 0.315357
D_Bil -0.010099 -0.233630 -0.292797 0.340468
ALP -0.025860 -0.177643 -0.247580 0.245491
ALT_GPT -0.034923 -0.041113 -0.023351 0.212509
AST_GOT -0.024031 -0.092083 -0.093665 0.199098
TP 1.000000 0.793025 0.207798 -0.048625
Alb 0.793025 1.000000 0.732303 -0.202018
AG_ratio 0.207798 0.732303 1.000000 -0.277248
disease -0.048625 -0.202018 -0.277248 1.000000
相関は1か-1に近いほど関係性が高いと言える。
ただ数値だと見にくいのでこれをかなり見やすくするのがヒートマップ。
seabornライブラリのheatmapがこれを扱えるので実行
plt.figure(figsize=(10,8))
sns.heatmap(df.corr(), vmin=-1.0, vmax=1.0, annot=True, cmap='coolwarm', linewidths=0.1)
plt.show()
↑結果(赤いほど、もしくは青いほど相関が高い)
(よくわからんけど)いい感じ!
これで例えばT_BillとD_Billが相関が高いとわかるし
TPとAlbが相関が高いとわかる。
つまりT_Billの値が高い時D_Billの値が高くなると想定できる
学習データの整形
ここは前回もやったのでちゃっちゃいきます。
性別を表すカラムのGenderはMaleなどの文字列で表されているのでこのままでは学習の都合が悪いです。
ですので、0、1の数値データに変更します。
そこで使用するのがlambda関数
df_Gender = df["Gender"].apply(lambda x: 1 if x=='Male' else 0)
↑こう!
これで整形終わり!
次は説明変数と目的変数の準備
説明変数は学習するためのデータ、目的変数はその答え
これは簡単で全体のデータから答えを抜き出したものが説明変数で、
答えだけ抽出したのが目的変数になる。
今回予測したい答えは疾患があるかどうかなのでdiseaseを抜き出します。
# 説明変数のデータフレーム
X = df.drop(["disease"], axis=1)
# 目的変数のデータフレーム
y = df["disease"]
drop関数を使うと指定したものを抜いたデータフレームができる
OK!!
検証用データの準備
今全データを説明変数と目的変数にしたので、
この全データを使って学習させてしまうと
このモデルのテストができません。
予想がどれだけ当たってるかを調べるには
答えがわかっているデータと
それを導くための学習用データが別に必要だからです。
なので、この全データを分割して学習用データとテストデータに分けます。
これもすでにライブラリがあってsklearn.model_selectionのtrain_test_splitを使います。
from sklearn.model_selection import train_test_split
# 検証用データを30%、学習用を70%で分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
print(X_train.head())
ここで、X_train, y_trainが学習用で
X_test,y_testがテスト用(評価用)です。
では早速学習しましょ
学習モデル
学習させる方法は色々ありますが、
時間の都合上割愛(爆)
今回は疾患かどうかを調べたいので
0 or 1の結果を求めるモデルに適したロジスティック回帰モデルを利用します。
とりあえずモデルのライブラリをインストールして↓
# ロジスティック回帰モデルのimport
from sklearn.linear_model import LogisticRegression
# モデルの初期化
lr = LogisticRegression()
実行は1行!
lr.fit(X_train, y_train)
trainで学習↑
今度は学習したモデルでX_testを使って予測してみます
y_pred = lr.predict(X_test)
print("y_predの結果(2値判定の結果): ", y_pred)
# 予測結果について
print("y_predのサイズ = 評価用データのサイズ = ", y_pred.shape, "\n")
print("疾患あり(1)と判定された数: ", sum(y_pred))
↑y_predがX_testで予想した結果
y_predの結果(2値判定の結果): [0 0 1 1 0 1 0 1 1 1 1 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1
0 0 1 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 0 0 0 0 1 1 1 0 1 1 1 1 0 0 0 0
0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 1 1 0 0 0 0 1 1 1 1
0 1 0 0 1 0 0 1 1 1 0 1 0 1 1 1 1 0 0 0 0 0 1 1 0 0 1 0 1 1 0 1 1 1 0 0 0
1 0 1 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0
0 0 0 1 0 0 0 1 1 0 1 1 0 1 0 0 1 0 1 0 1 0 0 1 0 0 0 0 1 1 0 0 1 1 0 0 1
0 1 1 0 0 0 1 1 0 0 0 1 0 1 0]
y_predのサイズ = 評価用データのサイズ = (237,)
疾患あり(1)と判定された数: 94
うーんようわからん笑
とりあえず疾患ありが94人と出たわけですな
じゃあ実際の答え(y_test)と比べてどうなの?てのも調べましょ
。。。
。。
は!次回!!ていうか明日!やります。
というわけで今日は学習までできました。
まだ、色々精度あげたりとか残っているみたいです。
というわけで