Κοινή χρήση τεχνολογίας

[Machine Learning Practical Combat] Datawhale Summer Camp: Baseline Intensive Reading Notes 2

2024-07-08

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

# AI Summer Camp # Datawhale # Summer Camp

Εκτός από τη διασταυρούμενη επικύρωση στην αρχική γραμμή βάσης, υπάρχει επίσης μια βασική μέθοδος βελτιστοποίησης, δηλαδή η μηχανική χαρακτηριστικών.

Ο τρόπος βελτιστοποίησης των χαρακτηριστικών σχετίζεται με τον τρόπο με τον οποίο βελτιώνουμε την ακρίβεια της πρόβλεψης του μοντέλου. Η μηχανική χαρακτηριστικών είναι συχνά ένα μέρος που τα άτομα με βαθιά κατανόηση του τομέα του προβλήματος μπορούν να κάνουν καλά, επειδή πρέπει να σκεφτούμε τον μετασχηματισμό.

Εκτός από τα χαρακτηριστικά του Smiles, υπάρχουν πολλά χαρακτηριστικά που μπορούν να εξαγάγουν πολύτιμες πληροφορίες. Για παράδειγμα, το InChI αποτελείται από μια σειρά εξαρτημάτων και παρέχει λεπτομερείς πληροφορίες σχετικά με τη μοριακή δομή.για παράδειγμαΑναγνώριση έναρξης, μοριακός τύπος, πίνακας σύνδεσης, αριθμός ατόμων υδρογόνου, πλήθος δεσμών πολλαπλών περιστρεφόμενων, στερεοχημικές πληροφορίες, πληροφορίες ισομερών, πληροφορίες μείγματος ή ταυτομερούς, πληροφορίες πολλαπλότητας φορτίου και σπιν, κ.λπ.

Επιπλέον, εάν θέλετε να βελτιώσετε την ακρίβεια του μοντέλου, δεν είναι κακή ιδέα να αλλάξετε το μοντέλο.

Βελτιστοποίηση χαρακτηριστικών

Εκχύλισμα μοριακού τύπου

Από τη συμβολοσειρά InChI μπορούμε να δούμε ότι ο μοριακός τύπος δίνεται απευθείας/C47H61N7O6S μέρος. Αυτό σημαίνει ότι το μόριο αποτελείται από 47 άτομα άνθρακα, 61 άτομα υδρογόνου, 7 άτομα αζώτου, 6 άτομα οξυγόνου και 1 άτομο θείου.

Υπολογίστε το μοριακό βάρος

Το μοριακό βάρος μπορεί να βρεθεί πολλαπλασιάζοντας την ατομική μάζα κάθε ατόμου με τον αριθμό του και στη συνέχεια προσθέτοντάς τα μαζί.

αρέσει

  • Η ατομική μάζα του άνθρακα (C) είναι περίπου 12,01 g/mol

  • Η ατομική μάζα του υδρογόνου (Η) είναι περίπου 1,008 g/mol

  • Η ατομική μάζα του αζώτου (Ν) είναι περίπου 14,01 g/mol

  • Η ατομική μάζα του οξυγόνου (Ο) είναι περίπου 16,00 g/mol

  • Η ατομική μάζα του θείου (S) είναι περίπου 32,07 g/mol

Πολλαπλασιαζόμενοι με τις ποσότητες και αθροιζόμενοι, παίρνουμε το μοριακό βάρος.

Ατομική καταμέτρηση

Μετρήστε απευθείας τον αριθμό των διαφορετικών ατόμων και επεκτείνετε τα.

import pandas as pd
import re

atomic_masses = {
    'H': 1.008, 'He': 4.002602, 'Li': 6.94, 'Be': 9.0122, 'B': 10.81, 'C': 12.01,
    'N': 14.01, 'O': 16.00, 'F': 19.00, 'Ne': 20.180, 'Na': 22.990, 'Mg': 24.305,
    'Al': 26.982, 'Si': 28.085, 'P': 30.97, 'S': 32.07, 'Cl': 35.45, 'Ar': 39.95,
    'K': 39.10, 'Ca': 40.08, 'Sc': 44.956, 'Ti': 47.867, 'V': 50.942, 'Cr': 52.00,
    'Mn': 54.938, 'Fe': 55.845, 'Co': 58.933, 'Ni': 58.69, 'Cu': 63.55, 'Zn': 65.38
}

# 函数用于解析单个InChI字符串
def parse_inchi(row):
    inchi_str = row['InChI']
    formula = ''
    molecular_weight = 0
    element_counts = {}

    # 提取分子式
    formula_match = re.search(r"InChI=1S/([^/] )/c", inchi_str)
    if formula_match:
        formula = formula_match.group(1)

    # 计算分子量和原子计数
    for element, count in re.findall(r"([A-Z][a-z]*)([0-9]*)", formula):
        count = int(count) if count else 1
        element_mass = atomic_masses.get(element.upper(), 0)
        molecular_weight  = element_mass * count
        element_counts[element.upper()] = count

    return pd.Series({
        'Formula': formula,
        'MolecularWeight': molecular_weight,
        'ElementCounts': element_counts
    })

# 应用函数到DataFrame的每一行
train[['Formula', 'MolecularWeight', 'ElementCounts']] = train.apply(parse_inchi, axis=1)

# 定义存在的key
keys = ['H', 'He', 'Li', 'Be', 'B', 'C', 'N', 'O', 'F', 'Ne', 'Na', 'Mg', 'Al', 'Si', 'P', 'S', 'Cl', 'Ar', 'K', 'Ca', 'Sc', 'Ti', 'V', 'Cr', 'Mn', 'Fe', 'Co', 'Ni', 'Cu', 'Zn']

# 创建一个空的DataFrame,列名为keys
df_expanded = pd.DataFrame({key: pd.Series() for key in keys})

# 遍历数据,填充DataFrame
for index, item in enumerate(train['ElementCounts'].values):
    for key in keys:
        # 将字典中的值填充到相应的列中
        df_expanded.at[index, key] = item.get(key, 0)

df_expanded = pd.DataFrame(df_expanded)

Μοντέλο fusion

Όπως αναφέρθηκε την τελευταία φορά, χρησιμοποιούμε το μοντέλο catboost Δεν έχουμε δοκιμάσει το lightgbm και το xgboost. Μπορείτε να εκτελέσετε αυτά τα τρία μοντέλα με τη σειρά και στη συνέχεια να κάνετε μέσο όρο των αποτελεσμάτων των τριών μοντέλων για τη σύντηξη (αυτό είναι επίσης ένας τομέας που μπορεί να βελτιωθεί. ).

def cv_model(clf, train_x, train_y, test_x, clf_name, seed = 2023):
    folds = 5
    kf = KFold(n_splits=folds, shuffle=True, random_state=seed)
    oof = np.zeros(train_x.shape[0])
    test_predict = np.zeros(test_x.shape[0])
    cv_scores = []
    for i, (train_index, valid_index) in enumerate(kf.split(train_x, train_y)):
        print('************************************ {} ************************************'.format(str(i 1)))
        trn_x, trn_y, val_x, val_y = train_x.iloc[train_index], train_y[train_index], train_x.iloc[valid_index], train_y[valid_index]

        if clf_name == "lgb":
            train_matrix = clf.Dataset(trn_x, label=trn_y)
            valid_matrix = clf.Dataset(val_x, label=val_y)
            params = {
                'boosting_type': 'gbdt',
                'objective': 'binary',
                'min_child_weight': 6,
                'num_leaves': 2 ** 6,
                'lambda_l2': 10,
                'feature_fraction': 0.8,
                'bagging_fraction': 0.8,
                'bagging_freq': 4,
                'learning_rate': 0.35,
                'seed': 2024,
                'nthread' : 16,
                'verbose' : -1,
            }
            model = clf.train(params, train_matrix, 2000, valid_sets=[train_matrix, valid_matrix],
                              categorical_feature=[], verbose_eval=1000, early_stopping_rounds=100)
            val_pred = model.predict(val_x, num_iteration=model.best_iteration)
            test_pred = model.predict(test_x, num_iteration=model.best_iteration)

        if clf_name == "xgb":
            xgb_params = {
              'booster': 'gbtree', 
              'objective': 'binary:logistic',
              'num_class':3,
              'max_depth': 5,
              'lambda': 10,
              'subsample': 0.7,
              'colsample_bytree': 0.7,
              'colsample_bylevel': 0.7,
              'eta': 0.35,
              'tree_method': 'hist',
              'seed': 520,
              'nthread': 16
              }
            train_matrix = clf.DMatrix(trn_x , label=trn_y)
            valid_matrix = clf.DMatrix(val_x , label=val_y)
            test_matrix = clf.DMatrix(test_x)

            watchlist = [(train_matrix, 'train'),(valid_matrix, 'eval')]

            model = clf.train(xgb_params, train_matrix, num_boost_round=2000, evals=watchlist, verbose_eval=1000, early_stopping_rounds=100)
            val_pred  = model.predict(valid_matrix)
            test_pred = model.predict(test_matrix)

        if clf_name == "cat":
            params = {'learning_rate': 0.35, 'depth': 5, 'bootstrap_type':'Bernoulli','random_seed':2024,
                      'od_type': 'Iter', 'od_wait': 100, 'random_seed': 11, 'allow_writing_files': False}

            model = clf(iterations=2000, **params)
            model.fit(trn_x, trn_y, eval_set=(val_x, val_y),
                      metric_period=1000,
                      use_best_model=True, 
                      cat_features=[],
                      verbose=1)

            val_pred  = model.predict_proba(val_x)
            test_pred = model.predict_proba(test_x)

        oof[valid_index] = val_pred
        test_predict  = test_pred / kf.n_splits

        F1_score = f1_score(val_y, np.where(val_pred