Python学習

今日は祝日で休みなので気合入れていつもの時間に起きて勉強。
昨日の続きからでモデルの学習からスタート。
モデルの学習と予測は前回もやったから復習の感じで実装。
とりあえず流れ自体はだいぶ頭に入っているからやってみて問題はないかなと思った矢先に、、、

予測するときはpredict関数を使っていたから今回もそれでと思ったら今回は判定確率で算出するためにpredict_proba関数を使用すると、、、

初めはわけがわからず最近始めたchatGPTに問い合わせを、、
聞き方が悪いのかそれでもよくわからず、、

とりあえずの認識としてはpredict関数では(0か1か)で返していたのに対し、predict_proba関数では(0と1に分類される確率を配列に格納)して返す。ということかな???とざっくりと認識。
今のところはこれでいいやと諦め先に進む。

次は混合同列の計算、、、
名前だけ見ると、何それ?との感じではあるが実際にはよくみる予測値と実測値を表にしたデータ。
今回はこの表になるようデータを出力してかつ可視化してみるというようなもの。
混合同列を算出するためにはsklearn.metricsモジュールのconfusion_matrix関数を使用する。
confusion_matrix(y_true=実際のデータ, y_pred=予測結果のデータ)
データの可視化にはヒートマップを使用
データをヒートマップにするために混合同列をデータフレーム化させる。
ここでも初めかなり???が飛んだけどなんとなくは理解。
DataFrame関数でデータフレーム化してあとはheatmap関数で可視化。

次にROC曲線の描画とAUCの計算。
薬品業界の経験がある分なんとなくの理解はできるんだけど、、、
やっぱりよくわからんとこがあるな~と思いながらも
今は素振りの段階であるからふんわりとした認識でも構わず進む。
sklearn.metricsモジュールのroc_auc_score, roc_curve関数をインポート
auc_score = roc_suc_score(y_ture=実際のデータ, y_pred=予測結果のデータ)
fpr, tpr, thresholds = roc_curve(y_ture=実際のデータ, y_pred=予測結果のデータ)
ROC曲線は偽陽性率、真陽性率、閾値を算出。


今日は時間があるからもう少し先までということで次のステップが
等間隔のbin分割
この処理はある変数を複数の区分に分割することで新しい特徴量を作成するというもの。それをビニング(binning)というらしい。
今回はpandasライブラリのcut関数を使用。
例えばデータフレームXの中の変数1を等間隔に10分割する場合は
X_cut = pd.cut(X['変数1’], bins=10)
となる。
また、分割したbinの区切り(境界線)も取得する場合はretbindsオプションの使用。
X_cut, bin_indice = pd.cut(X['変数1’], bins=10, retbins=True)
binの境界値の取得にはretbins=Trueを指定して、結果を格納するために変数を2番目に指定する必要がある。
境界値を指定したい場合は先に指定した境界値をbins='指定した境界値の変数'とすればよい。
ちなみに、labels=Falseオプションを加えれば0始まりの連番のラベルが変数に格納される。←実際のところあんまりわかっていない。
そして、分割した結果をダミー変数化(get_dummies関数)
この時、引数のあとにprefix=変数.nameと入れたほうがいいようだった。入れないで実装したら列名の接頭語が出てこず何のデータかがわかりにくい。
その後は元のデータとダミーを横連結させる。
その場合はpandasのconcat関数を使う。axis=1でその行の処理にすることを忘れないようにしないと。※axis=0だと列

次は多項式・交互作用特徴量の生成
この2つはsklearn.preprocessingモジュールのPloynaminalFeaturesで同時に生成できる。
polynomial = PolynomialFeatures(degree=次数, include_bias=False) polynomial_result = polynomial.fit_transform(データ)
degreeオプションは何次まで生成するかの指定。例えば3次であれば次数が3となる。
include_bias=Falseと指定することで0次は出力されない。
これにどんな意味があるのかなとchatGPTで見てみたら曲線的なデータでは2次、3次と高次元に変換するとモデルの精度向上にかなり役立つらしい。
ほんとに便利だな~chatGPT
上記の処理を完了したら次は不要なものは除外して必要な特徴量にしていく。
モデルが自動で重要な特徴量を選択してくれる、組み込み法(モデルベース選択)という手法を使っていく。
組み込み法を使うためには、sklearn.feature_selectionモジュールの、SelectFromModel関数を使用。
組み込み法で使用するモデル (LogisticRegression)を指定する場合は、
fs_model = LogisticRegression(penalty="{正則化オプション}", solver="{最適化関数}", random_state=0)のように実装していく。
penaltyは過学習を防止するための制約条件。
正則オプションはl1(L1正則化)やl2(L2正則化)が指定できる。
2つ目のオプションのsolverは、最適化関数と呼ばれる 誤差を最小化するための関数の種類を表している。
注意点として、最適化関数の種類によっては使用できる正則化オプションの種類が限定されるため、
例えばL1正則化(penalty="l1")を指定する場合はsolver=liblinearを、L2正則化(penalty="l2")を指定する場合はsolver=lbfgsといったように、penaltyとsolverオプションは組み合わせて指定する必要があることに注意しなくてはならないようだ。
random_state=0は、繰り返し実行した際の出力を同じものにするため、乱数シードを固定するオプション。これをいれないとランダムに出力されるから別のものを出力する場合があるのかな?と認識している。
そのあとは特徴量選択の閾値の指定と初期化。SelectFromModel関数を使って
selector = SelectFromModel(変数, threshold=fs_threshold)
変数fs_thresholdには、特徴量を選ぶ際の基準値(閾値)を指定。
先にmean(平均値)などを指定しておく。

実際にこれまでのモデルを実装させてみる。
さらに、学習させたモデルにget_support関数を使うことで、特徴量選択の結果が重要な変数ならTrue、重要でない変数ならFalseのbool型のリストが返ってくるようにする。
この結果をloc関数に渡すことで元のデータから選択された特徴量の列だけを抽出することができる。

ここまで実装できたらあとはこれまでやった学習データと評価データの分割等のモデリングの流れを繰り返す。

とここまでで今回の実装のlearningは終了。次は今回の疾患リスクの予測の実装を実際にやってみる。
正直多項式・交互作用のあたりがだいぶ理解に苦しんでいるけど
とりあえずはこんな感じかということで数をこなしていきたい。

そして関係はないが今回初めて3000文字を超えた!!
なんかすごい人が毎日3000文字の日記をつけるとかいうことしたらかなり頭の整理ができるとか言ったいたけど、、
それはまあいいとして毎回これをやることでその日の復習と頭の整理ができるなとは思ってる。たまにめんどくさくなるけど、、

内容も少しずつ深くできたらと思う。
今回はこれにて

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