見出し画像

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()

スクリーンショット 2020-09-04 8.26.49

↑結果(赤いほど、もしくは青いほど相関が高い)

(よくわからんけど)いい感じ!

これで例えば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)と比べてどうなの?てのも調べましょ

。。。

。。

は!次回!!ていうか明日!やります。

というわけで今日は学習までできました。

まだ、色々精度あげたりとか残っているみたいです。

というわけで

画像2

いいなと思ったら応援しよう!

マサト(ENTP)
いつもサポートありがとうございます。 難しい方は感想をコメントでいただけると嬉しいです。