#author("2024-03-06T07:45:19+00:00","","")
#author("2024-03-06T07:46:20+00:00","","")
[[技術資料(堀)]]

----
目次
#contents
----

*Day0:事前知識 [#j82bebaa]
参考サイト

(1)ランダムフォレストに関して
「https://dse-souken.com/2021/03/26/ai-15/」
「https://ebi-works.com/random-forest/」
「https://www.habe-lab.org/habe/RFtutorial/CVIM_RFtutorial.pdf」
 
(2)多クラス分類に関して
「https://gotutiyan.hatenablog.com/entry/2020/09/22/175141」
「https://tech-blog.optim.co.jp/entry/2021/05/31/100000」
「https://zenn.dev/hellorusk/articles/46734584386c49057e1b」
 
(3)交差検証に関して
「https://www.codexa.net/cross_validation/」
「https://free.kikagaku.ai/tutorial/basic_of_machine_learning/learn/machine_learning_hyperparameters」
 ※層化k分割交差検証
 「https://zenn.dev/monda/articles/kaggle-cv-template」
 
(4)特徴選択(ラッパー法)に関して
「https://qiita.com/shimopino/items/5fee7504c7acf044a521#step-forward」
 
(5)オーバーサンプリング(SMOTE)に関して
「https://qiita.com/ps010/items/38880fad0b8e71464a54」


**ランダムフォレスト [#g48145a8]
ランダムフォレストは、アンサンブル学習による機械学習アルゴリズムの一つであり、決定木を複数集めて、強力なモデルを作る~
#ref(1.1.JPG,,)

**多クラス分類での評価 [#y37389bd]
通常の二値分類では、~
#ref(2.1.JPG,,)

再現率…5 / (5 + 2) = 約 71.4 %、適合率…5 / (5 + 1) = 約 83.3 %~
F値…2 * 0.714 * 0.833 / (0.714 + 0.833) = 約 76.9 %~
多クラスの場合では、
#ref(3.1.JPG,,)
再現率… 4 / (4 + 2) = 66.7 %、適合率は…4 / (4 + 9) = 30.8% 、F値…42.1 % になり、和食に関する F値が求まる。同様に、洋食に関する F値 は 30.8%、中華に関する F値は 66.7 % と計算できる。それぞれのF値の平均をとり、macro-F1…(42.1% + 30.8% + 66.7%) / 3 = 46.5%~

**クロスバリデーション(交差検証) [#ace820f3]
クロスバリデーション(交差検証)とは、学習用のデータを複数の分割パターンで学習データと検証データに分けてモデルの汎化性能(未知のデータに対する予測能力)を検証することで、分割した学習データで学習し、検証データで予測し精度を検証する。複数の分割パターンで検証を行うことでより正確なモデルの精度を測ることができる。最終的なテストデータへの予測は、各モデルでの平均とすることが多い。
#ref(4.1.JPG,,)

**特徴量選択(ラッパー法) [#v4008258]
特徴量選択のメリット~
1.変数を少なくすることで解釈性を上げる~
2.計算コストを下げて、学習時間を短縮する~
3.過適合を避けて汎用性を向上させる~
4.高次元データによって、パフォーマンスが下がることを防ぐ。~

**ラッパー法 [#i6cd2fa6]
機械学習モデルを使用して特徴量の組み合わせを評価する~
1.特徴量の組み合わせを選択する~
2.[1]で選択した特徴量を使用してモデルを学習させる~
3.性能を評価する~
を繰り返し実行する。~

**SMOTE [#tec371cd]
検出した少数派の近接データを線でつなぎ、その線分上の任意の点を人工データとしてランダムに生成する
#ref(5.1.JPG,,)



*Day1:データの加工を行う [#j0be664c]
**プログラム [#f0f285d1]
#ref(ECprediction_dataset.ipynb)
データの加工を行う~
1.化学反応式を正規表現に分解する~
#ref(1.JPG,,)

2.特性値が計算できない化合物を削除する~
反応式は、オリジナル81204→削除後69779になる~

3.210次元の特徴ベクトルを作成する~
反応式の左辺の特徴ベクトル作成

       left_vec = [[list(Descriptors.CalcMolDescriptors(left_mols[i][j]).values()) for j in range(len(left_mols[i]))] for i in range(len(left_mols))]
  
右辺

   right_vec = [[list(Descriptors.CalcMolDescriptors(right_mols[i][j]).values()) for j in range(len(right_mols[i]))] for i in range(len(right_mols))]

4.データ加工結果~
#ref(2.JPG,,)

ec番号に対応した特徴ベクトルの値が生成されている


*Day2: モデル生成と学習[#z7cdc7c3]
**プログラム [#ffe2e7a3]
#ref(ECprediction_model.ipynb)
1.	学習データとテストデータに分割する 
 Xtrain, Xtest, Ytrain, Ytest = train_test_split(ECXXXX,  # データの分割
                                                ECXXXX.index,  # ラベルの分割
                                                test_size=0.2,  # train:test = 4:1 
                                                random_state=42, # 乱数シード(再現のため)
                                                stratify=ECXXXX.index  # 元ラベルの分布に基づいて層化抽出

2.EC番号のラベルを1桁のみに~
3.テストデータ作成~
4.記述子選択~
5.F1-scoreが最も高い記述子組合せを出力する~
6.一桁目の学習、検証~
#ref(3.JPG,,)

7.	EC 1.X.X (EC 1の2,3桁目)クラス分類
### 記述子選択
(1)記述子を1種追加したn種の記述子組合せを選択
 (2)学習データを層化抽出し,検証用学習データと検証用テストデータに分割
 (3)検証用学習データにSMOTEを適用し,n種の記述子からRF分類モデルを作成
 (4)検証用テストデータを用い,Macro F1-Scoreで分類精度を評価
 (5)(4)をk分割の回数だけ行い,平均値を出力
 (6)(2)~(5)を 200-n 通りの記述子組合せで行い,平均値が最も高い記述子組合せを選択する
 (7) n = n+1 として,k_featuresの数まで(1)~(6)を繰り返す

# 記述子選択インスタンス
  sfs1XX = SFS(pipe_mis_smote_rfc,  # 分類器 or パイプラインを入力
             k_features=30,  # 選択する記述子の上限
             forward=True,  # forward法
             floating=False, 
             verbose=2, 
             scoring='f1_macro',  # F1-Scoreで評価
             cv=StratifiedKFold(n_splits=5, shuffle=True, random_state=42)  # 層化5分割交差検証
            )

8.RFのパラメータ調整(グリッドサーチ)
### グリッドサーチ
#(1)パラメータ組合せのうち1パターンを選択
# (2)学習データを層化抽出し,検証用学習データと検証用テストデータに分割
# (3)検証用学習データにSMOTEを適用し,n種の記述子からRF分類モデルを作成
# (4)検証用テストデータを用い,Macro F1-Scoreで分類精度を評価
# (5)(2)~(4)をk分割の回数だけ行い,平均値を出力
# (6)(1)~(5)を全パラメータ組合せで行い,平均値が最も高いパラメータ組合せを選択する
 
  param_dic = {
    '  rfc__n_estimators': [10, 20, 30, 50, 80, 100, 150, 200, 250, 300, 500, 800, 1000],
      'rfc__max_depth': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 20, 25, 30]
 }


ここで、パラメータ調整を行う。
rfc__n_estimators・・・ランダムフォレストの決定木数~
'rfc__max_depth'・・・ランダムフォレストの最大深さ~
をグリッドサーチにより求める。
 

9.(7),(8)の方法を用いてEC 2. X. X~EC 6. X .Xまでの記述子選択、RFのパラメータ選択を行う
*Day3:検証 [#v22903c1]
#ref(4.JPG,,)

f1-score のaccuracyを見ると87.8%になっている
f1-score のaccuracyを見ると約87.9%になっており、高い精度で予測していることが分かる。



トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS