データの加工を行う
1.化学反応式を正規表現に分解する
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.データ加工結果
ec番号に対応した特徴ベクトルの値が生成されている
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.一桁目の学習、検証
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のパラメータ選択を行う