Condivisione della tecnologia

[Note sullo studio Python] Strumento di regolazione dei parametri Caso Optuna Titanic

2024-07-12

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

[Note sullo studio Python] Strumento di regolazione dei parametri Optuna e caso Titanic

Scuotimento dello sfondo:(Non leggerlo se vuoi risparmiare)
Di recente ho trovato uno stage come annotatore di intelligenza artificiale, ma durante tutto il processo stavo svolgendo lavori relativi al testo. Essenzialmente, stavo ancora stringendo le viti, volevo solo apprendere alcune competenze nell'adeguamento dei parametri e nell'implementazione per aumentare la mia competitività, in modo che il mio il curriculum sarebbe più facile da confezionare in futuro.
Naturalmente, la prima scelta per i tutorial è l'Università Bilibili. Come previsto, ho trovato uno strumento gratuito per la regolazione dei parametri che ha ricevuto molte recensioni positive.Optuna
A proposito, lo stage che ho fatto lo è statoAnnotazione di testo per la direzione sulla sicurezza dei contenuti(Detto umano: assicurarsi che il contenuto del set di formazione siacorrettezza politica), ma guardando altri video per imparare a usare Yolo5 per il riconoscimento di maschere e volti, ho scoperto che esiste un programma gratuitoAnnotazione dell'immagineLo strumento è molto facile da usare. L'ho testato io stesso. È molto facile da installare e utilizzare. Non presenta pubblicità o oneri. Si concentra sulla semplicità e sull'efficienza.
Nome dello strumento:EtichettaImg
Un articolo di account pubblico condiviso in precedenza dall'istruttore ha fornito un'introduzione molto completa:
Italiano: https://mp.weixin.qq.com/s/AE_rJwd9cKQkUGFGD6EfAg
Portale dei conti pubblici
Inserisci qui la descrizione dell'immagine
————————————————————————————————————————————

Testo: Informazioni su Optuna e sul processo di apprendimento
**Link al tutorial video: **https://www.bilibili.com/list/watchlater?oid=832000670&bvid=BV1c34y1G7E8&spm_id_from=333.1007.top_right_bar_window_view_later.content.click
Video dei maestri della Stazione B
Inserisci qui la descrizione dell'immagine
Metodo di installazione:
Inserisci qui la descrizione dell'immagine
Anaconda dovrebbe essere installato anche tramite conda. L'ho appena installato tramite pip come mostrato nel video per evitare problemi.
————————————————————————————————————————————

Collegamento al caso Kaggle utilizzato dai maestri:
https://www.kaggle.com/code/yunsuxiaozi/learn-to-use-the-optuna/notebook
portale
Inserisci qui la descrizione dell'immagine
Sebbene copiare e incollare sia divertente, per mantenere la sensazione e sentire i dettagli, si consiglia, se hai tempo, di scriverlo lentamente a mano. Anche se lo digiti in base ad esso, è meglio che copiare e incollando direttamente. Quando impari per la prima volta un'abilità, lento è veloce.
Allo stesso modo, se hai Anaconda sul tuo computer, si consiglia di creare un ambiente virtuale speciale per testare Optuna ed evitare conflitti.
————————————————————————————————————————————

Tutorial sulla costruzione dell'ambiente virtuale conda del master CSDN e sulla configurazione dell'ambiente virtuale jupyter:
Italiano: https://blog.csdn.net/fanstering/article/details/123459665
Puoi saltare questo passaggio se non hai Anaconda

Conosco già questo passaggio della creazione di un ambiente virtuale. L'ambiente e i pacchetti Optuna sono stati installati. Tuttavia, Jupyter segnala ancora che non è presente alcuna libreria Optuna quando l'ho installata secondo il tutorial di questo esperto.nb_condaIl problema verrà risolto più tardi.
Inserisci qui la descrizione dell'immagine
Inserisci qui la descrizione dell'immagine
————————————————————————————————————————————

Quindi entra nel processo familiare di scrittura del codice. Innanzitutto, importa le librerie Python richieste e installa tutto ciò che manca. Sia l'installazione pip che l'installazione conda sono accettabili. Anaconda consiglia quest'ultima.

Se segnala un errore spettrale: TqdmWarning: IProgress non trovato. Aggiornare jupyter e ipywidgets. Vedere https://ipywidgets.read
zhebuInserisci qui la descrizione dell'immagine

Non aver paura, devi solo aggiornare Jupyter.
Inserisci qui la descrizione dell'immagine
Inserisci qui la descrizione dell'immagine
Dopo aver completato i primi tre passaggi, ho aggiornato ed eseguito questo passaggio del programma e tutto è andato bene.
Inserisci qui la descrizione dell'immagine
————————————————————————————————
Inserisci qui la descrizione dell'immagine
Link per il download del set di dati: https://www.kaggle.com/competitions/titanic/data?select=train.csv
portale
Inserisci qui la descrizione dell'immagine
Inserisci qui la descrizione dell'immagine

total_df['Embarked_is_nan']=(total_df['Embarked']!=total_df['Embarked'])
  • 1

Questa riga di codice crea una nuova colonna "Embarked_is_nan", che viene utilizzata per contrassegnare valori nulli (NaN) nella colonna "Embarked". Se l'elemento nella colonna "Imbarcato" non è esso stesso (ovvero l'elemento è un NaN), la posizione corrispondente nella nuova colonna verrà impostata su True.
Questa è la prima volta che vedo questo tipo di scrittura.

keys=['Pclass','Sex','SibSp','Parch']
for key in keys:
    values=np.unique(train_df[key].values)
    
    if len(values)<10 and key!="Survived":
        print(f"key:{key},values:{values}") 
        
        key_target=train_df['Survived'].groupby([train_df[key]]).mean()
        keys=key_target.keys().values
        target=key_target.values
        key_target=pd.DataFrame({key:keys,key+"_target":target})
        total_df=pd.merge(total_df,key_target,on=key,how="left")
total_df.head()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

Questo pezzo di codice è un po' complicato. Innanzitutto filtra quattro caratteristiche importanti ['Pclass', 'Sex', 'SibSp', 'Parch'] e le memorizza nell'elenco delle chiavi a cui sono considerate potenzialmente correlate la situazione di sopravvivenza dei passeggeri.
Quindi scorrere l'elenco uno per uno per vedere quanti valori univoci ha ciascuna funzionalità nel set di addestramento.
Se il numero di valori univoci len (valori) di una colonna chiave è inferiore a 10, il codice analizzerà ulteriormente la relazione tra questa colonna e la situazione di sopravvivenza.
(Sono un po' confuso sul perché chiave! = "Sopravvissuto" è enfatizzato. Non c'è alcun valore di "Sopravvissuto" in questo elenco di chiavi??)
Stampalo e scopri che tutti e quattro gli attributi soddisfano le condizioni:
Inserisci qui la descrizione dell'immagine

key_target=train_df['Survived'].groupby([train_df[key]]).mean()
  • 1

In questo passaggio, nel training set train_df, il codice calcola il tasso di sopravvivenza medio della colonna "Sopravvissuto" corrispondente a ciascun valore univoco nell'elenco delle chiavi.
Inserisci qui la descrizione dell'immagine
Come si può vedere dalla figura, il valore del dataframe key_target cambia con il valore dell'attributo key in ogni ciclo. Ad esempio, quando viene elaborato key = Pclass, le chiavi di key_target sono 1, 2 e 3 e il. valore è il tasso di sopravvivenza medio corrispondente; elaborazione Quando chiave = sesso, le chiavi di key_target sono "Femmina" e "Maschio" e i valori sono anche i corrispondenti tassi di sopravvivenza medi.
I passaggi successivi sono un po' complicati. Disegna una tabella di parole per capirla:
Ci sono un totale di quattro attributi nelle chiavi. Uno di essi verrà utilizzato per ciascun caso. Infine, i dati dei quattro attributi verranno archiviati in total_df, riepilogati e restituiti.
Questo è il caso di PClass. PClass ha tre valori: 1/2/3 Il tasso di sopravvivenza medio viene calcolato per ciascun valore e memorizzato in key_target.
Quindi la chiave di key_target viene estratta e memorizzata nell'elenco delle chiavi (sì, questo elenco si chiama anche chiavi..., ma in questo momento i valori​​in esso dovrebbero essere i tre valori​​1/ 2/3 di PClass) e il valore viene memorizzato nell'elenco di destinazione (ovvero i tre numeri 0.629630, 0.472826, 0.242363), quindi nominare artificialmente le due colonne di chiave e valore. La colonna chiave è anche chiamata PClass e la colonna del valore è più personalizzata e dovrebbe essere chiamata "PClass_target".
Inserisci qui la descrizione dell'immagine
Per analogia, i key_target dei successivi tre attributi sono tutti in questa routine, ma la tabella total_df è in continua espansione.
Inserisci qui la descrizione dell'immagine
(maschio qui è una parola vietata, l'immagine è stata tagliata e un pezzo separato è stato aggiunto in seguito)
Fino a quando finalmente total_df diventa una tabella di grandi dimensioni:
Inserisci qui la descrizione dell'immagine
Ad essere onesti, per un caso Optuna il cui scopo principale è insegnare alle persone come utilizzare lo strumento di regolazione dei parametri, la logica scritta dall'autore originale in questo passaggio ha davvero aumentato il peso della comprensione per me...
Ho chiesto a Kimi di riscrivere questo codice in una versione più chiara e semplice, in modo che non sia facile confondere i tanti tasti e target che riempiono lo schermo:
Inserisci qui la descrizione dell'immagine
Questa parte non è il fulcro della fase di regolazione dei parametri. Se davvero non la capisci, puoi saltarla. ——————————————————————————————————————————
Usa la media per riempire i valori mancanti Segna i passaggi comuni nell'elaborazione dei dati che hai imparato.
Inserisci qui la descrizione dell'immagine
Supplemento: Quando ho seguito il corso di analisi dei dati e visualizzazione di Tableau, l'insegnante ha condiviso un post che introduceva specificamente molti tipi di dati mancanti e metodi di elaborazione: https://towardsdatascience.com/all-about-missing-data-handling-b94b8b5d2184
Aggiungi la descrizione del collegamento
Il post è in inglese ed è necessario registrarsi ed effettuare il login per visualizzarlo.
————————————————————————————————————————————
Dopo aver ottenuto il set di dati total_df con attributi sempre più completi, viene nuovamente suddiviso nel set di addestramento e nel set di test in base alla lunghezza precedente.
Inserisci qui la descrizione dell'immagine
————————————————————————————————————————————
Inserisci qui la descrizione dell'immagine
Qui viene menzionato che il rapporto tra set di addestramento e set di test è 8:2, ovvero 4:1, che è un rapporto di divisione molto comune.
L'autore originale probabilmente considerava test e valido la stessa cosa, quindi non c'era alcuna distinzione speciale nella denominazione.
Inserisci qui la descrizione dell'immagine
Ma in realtà questi due concetti non sono esattamente la stessa cosa (ma vedo che a volte la distinzione non è rigorosa). Qui utilizzo un metodo di scrittura unificato di test_X e test_y.
Inserisci qui la descrizione dell'immagine
Inserisci qui la descrizione dell'immagine
————————————————————————————————————————————
importareRegressore LGBM , sebbene il set di dati del Titanic sia utilizzato principalmente per problemi di classificazione (prevedere se un passeggero sopravviverà), l'autore originale lo tratta qui come un problema di regressione. Ho considerato che per i principianti sarebbe stato più facile iniziare scegliendo un tutorial con un set di dati semplice e familiare e una spiegazione video, quindi non mi sono preoccupato dei dettagli dei problemi di regressione o di classificazione. Una volta acquisito dimestichezza con il processo, è possibile trovare online dati più complessi e standardizzati per esercitarsi.
Link didattico supplementare: "Impostazione del parametro LGMBRegressor parametro lgbmclassifier"
Italiano: https://blog.51cto.com/u_12219/10333606
Aggiungi la descrizione del collegamento
(A proposito, non c'è un classificatore LGBM in questo post? Perché l'autore ha menzionato specificamente la gestione dei problemi di regressione nel video?)
————————————————————————————————————————————
RMSE come funzione di perdita, ovvero un indice di valutazione, è una funzione Python che calcola l'errore quadratico medio (Root Mean Square Error).Più piccolo è, meglio è
Inserisci qui la descrizione dell'immagine
————————————————————————————————————————————
Imposta i parametri dell'obiettivo dell'attività in base alla spiegazione del video originale dell'autore:
Per nomi di parametri specifici, significati e valori consigliati, fare riferimento al post di apprendimento supplementare "Impostazione del parametro LGMBRegressor Parametro lgbmclassifier" sopra.

def objective(trial):
    param = {
        'metric':'rmse',
        'random_state':trial.suggest_int('random_state', 2023, 2023),  #随机种子固定,所以设置为2023-2023
        'n_estimators':trial.suggest_int('n_estimators', 50, 300),  #迭代器数量 50-300 的整数
        'reg_alpha':trial.suggest_loguniform('reg_alpha', 1e-3, 10.0),
        'reg_lambda':trial.suggest_loguniform('reg_lambda', 1e-3, 10.0),  #对数正态分布的建议值
        'colsample_bytree':trial.suggest_float('colsample_bytree', 0.5, 1), #浮点数
        'subsample':trial.suggest_float('subsample', 0.5, 1),
        'learning_rate':trial.suggest_float('learning_rate', 1e-4, 0.1, log = True),
        'num_leaves':trial.suggest_int('num_leaves', 8, 64),  #整数
        'min_child_samples':trial.suggest_int('min_child_smaples', 1, 100),        
    }
    model = LGBMRegressor(**param)  #调用模型
    model.fit(train_X, train_y, eval_set = [(test_X, test_y)], early_stopping_rounds = 100, verbose = False)  #拟合
    preds = model.predict(test_X)  #计算测试集的损失
    rmse = RMSE(test_y, preds)
    return rmse
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

————————————————————————————————————————————
Codice chiave: chiama Optuna, crea un'attività di apprendimento, specifica la perdita minima e imposta il nome dell'attività:

#创建的研究命名,找最小值
study = optuna.create_study(direction = 'minimize', study_name = 'Optimize boosting hpyerparameters')  #创建了一个Optuna研究对象,用于优化超参数。
#关键代码:调用Optuna,创建一个学习任务,指定让损失最小,设置任务名称。
#目标函数,尝试的次数
study.optimize(objective, n_trials = 100) #将设定好参数的object任务传进来,尝试一百次
#输出最佳的参数
print('Best Trial: ',study.best_trial.params) #找到最佳参数  tudy.best_trial 表示在所有尝试中损失最小的那次试验,params 是一个字典,包含了那次试验中使用的超参数。
lgbm_params = study.best_trial.params #这行代码将最佳参数赋值给 lgbm_params 变量。这样可以将这些参数用于LightGBM模型或其他需要这些超参数的模型。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Inserisci qui la descrizione dell'immagine
————————————————————————————————————————————
L'idea va bene, ma abbiamo riscontrato uno strano errore: fit() ha ricevuto un argomento chiave inaspettato 'early_stopping_rounds':
Inserisci qui la descrizione dell'immagine
Il metodo di Kimi riportava ancora un errore dopo averlo provato, quindi probabilmente non dovremmo prenderci la colpa.Inserisci qui la descrizione dell'immagine
Inserisci qui la descrizione dell'immagine
I maestri di StackFlow forniscono due soluzioni:
https://stackoverflow.com/questions/76895269/lgbmclassifier-fit-got-an-unexpected-keyword-argument-early-stopping-rounds

portale
Inserisci qui la descrizione dell'immagine
Inserisci qui la descrizione dell'immagine
Tieni presente che è meglio utilizzare pip install, conda install sembra non essere in grado di installarsi.
Inserisci qui la descrizione dell'immagine
Ma ho scoperto che era inutile... ricevevo ancora lo stesso errore, non riconoscevo early_stopping_rounds e, anche dopo averlo eliminato, non riconoscevo il seguente parametro verbose...
Non è possibile modificare i parametri secondo il post supplementare precedente Sembra che l'aggiornamento delle informazioni sia in ritardo...
Inserisci qui la descrizione dell'immagine
Inserisci qui la descrizione dell'immagine

————————————————————————————————————————————
Durante il processo di ricerca ho trovato anche un punto soggetto a errori: early_stopping_rounds sembra avere solo un limite massimo di 100.
Italiano: https://blog.csdn.net/YangTinTin/article/details/120708391
portale
Inserisci qui la descrizione dell'immagine
————————————————————————————————————————————
Ho cercato manualmente su Internet e ho chiesto a Kimi, ma non ho ancora trovato un'alternativa molto efficace. Poiché vogliamo soprattutto provare l'utilizzo di Optuna, eliminiamo prima questi due parametri fastidiosi.

model.fit(train_X, train_y, eval_set=[(test_X, test_y)])  #拟合
  • 1

Codice obiettivo completo:

def objective(trial):
    param = {
        'metric':'rmse',
        'random_state':trial.suggest_int('random_state', 2023, 2023),  #随机种子固定,所以设置为2023-2023
        'n_estimators':trial.suggest_int('n_estimators', 50, 300),  #迭代器数量 50-300 的整数
        'reg_alpha':trial.suggest_loguniform('reg_alpha', 1e-3, 10.0),
        'reg_lambda':trial.suggest_loguniform('reg_lambda', 1e-3, 10.0),  #对数正态分布的建议值
        'colsample_bytree':trial.suggest_float('colsample_bytree', 0.5, 1), #浮点数
        'subsample':trial.suggest_float('subsample', 0.5, 1),
        'learning_rate':trial.suggest_float('learning_rate', 1e-4, 0.1, log = True),
        'num_leaves':trial.suggest_int('num_leaves', 8, 64),  #整数
        'min_child_samples':trial.suggest_int('min_child_smaples', 1, 100),        
    }
    model = LGBMRegressor(**param)  #调用模型
    model.fit(train_X, train_y, eval_set=[(test_X, test_y)])  #拟合
    preds = model.predict(test_X)  #计算测试集的损失
    rmse = RMSE(test_y, preds)
    return rmse
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

Allora puoiOttieniBest_TrialAvuto:
Inserisci qui la descrizione dell'immagine
————————————————————————————————————————————
Allo stesso modo, veniva utilizzato anche l'UP originalexgboost e catboostMetodi simili vengono utilizzati per trovare i parametri ottimali.
Non è difficile vedere che la differenza principale tra i tre diversi metodi è il parametro del parametro selezionato e il metodo della funzione specificato dal modello.
XGBoost:
Inserisci qui la descrizione dell'immagine
Inserisci qui la descrizione dell'immagine
Risultati XGBoost
Inserisci qui la descrizione dell'immagine
————————————————————————————————————————————
CatBoost:
Inserisci qui la descrizione dell'immagine
Inserisci qui la descrizione dell'immagine
Risultati CatBoost:
Inserisci qui la descrizione dell'immagine
————————————————————————————————————————————
ultimo usoConvalida incrociata K-foldOttieni i migliori risultati:
La convalida incrociata è anche un termine comunemente usato nell'apprendimento automatico.
Inserisci qui la descrizione dell'immagine

def accuracy(y_true, y_pred):
    return np.sum(y_true == y_pred)/len(y_true)
  • 1
  • 2

Inserisci qui la descrizione dell'immagine
Inserisci qui la descrizione dell'immagineInserisci qui la descrizione dell'immagine

Inserisci qui la descrizione dell'immagine
kf è un oggetto KFold, ovvero uno strumento nella libreria scikit-learn per implementare la convalida incrociata K-fold. KFold divide il set di dati inn_divide sottoinsiemi, ogni sottoinsiemeA turno, come set di convalidae il resto funge da set di allenamento.
for train_index, valid_index in kf.split(x): questa riga di codice eseguirà l'iterazione sull'oggetto KFold, restituendo due array per ogni iterazione: train_index e valid_index.train_index contiene l'indice del punto dati utilizzato per l'addestramento, mentre valid_index contiene l'indice del punto dati utilizzato per la convalida . In base all'indice del set completo X, y, è possibile ottenere ogni volta i dati del set di addestramento e del set di verifica. Questo processo è come interrompere l'intera classe, selezionando casualmente alcuni studenti ogni volta e chiamando un gruppo di studenti.
————————————————————————————————————————————
Ora ho riscontrato un altro bug comune. Anche se non so come sia successo, non so se Python dovrebbe assumersi nuovamente la colpa. (Poiché le forme dei set di dati X e Y erano esattamente le stesse di prima dell'autore, logicamente non ci saranno altre operazioni su di essi in seguito...)
Inserisci qui la descrizione dell'immagine
Inserisci qui la descrizione dell'immagine
Inserisci qui la descrizione dell'immagine
Non aver paura se incontri problemi, risolvili! Devi fidarti di Kimi su questo! (A proposito, anche i dipendenti dell'azienda di intelligenza artificiale dove sto facendo il tirocinio usano Kimi, quindi Kimi è relativamente affidabile e libero!!)
Inserisci qui la descrizione dell'immagine
Non dimenticare di disabilitare contemporaneamente i parametri early_stopping_rounds e verbose per evitare di causare un altro errore.
Inserisci qui la descrizione dell'immagine
Questo pezzo di codice è relativamente lungo e contiene molte ripetizioni. Fai attenzione a non commettere errori.

from sklearn.model_selection import KFold  #在机器学习库中导入k折交叉验证的函数
from xgboost import XGBRegressor
from lightgbm import  LGBMRegressor
from catboost import CatBoostRegressor  

def accuracy(y_true,y_pred):
    return np.sum(y_true==y_pred)/len(y_true)
print("start fit.")
folds = 10  #将数据分成10份
y=train_df['Survived']
X=train_df.drop(['Survived'],axis=1)

train_accuracy=[]
valid_accuracy=[]
# 存储已学习模型的列表
models = []

#将数据集随机打乱,并分成folds份
kf = KFold(n_splits=folds, shuffle=True, random_state=2023) 

#从x_train中按照9:1的比例分成训练集和验证集,并取出下标
for train_index, valid_index in kf.split(X):
    
    #根据下标取出训练集和验证集的数据
    x_train_cv = X.iloc[train_index]
    y_train_cv = y.iloc[train_index]
    x_valid_cv =X.iloc[valid_index]
    y_valid_cv = y.iloc[valid_index]
    
    model = LGBMRegressor(**lgbm_params)
    
    #模型用x_train_cv去训练,用x_train_cv和x_valid_cv一起去评估
    model.fit(
        x_train_cv, 
        y_train_cv, 
        eval_set = [(x_train_cv, y_train_cv), (x_valid_cv, y_valid_cv)], 
        #early_stopping_rounds=100,
        #verbose = 100, #迭代100次输出一个结果
    )
    
    #对训练集进行预测
    y_pred_train = model.predict(x_train_cv)        
    #对验证集进行预测
    y_pred_valid = model.predict(x_valid_cv) 
    
    y_pred_train=(y_pred_train>=0.5)
    y_pred_valid=(y_pred_valid>=0.5)
    
    train_acc=accuracy(y_pred_train,y_train_cv)
    valid_acc=accuracy(y_pred_valid,y_valid_cv)
    
    train_accuracy.append(train_acc)
    valid_accuracy.append(valid_acc)
    
    #将model保存进列表中
    models.append(model)
    
    model = XGBRegressor(**xgb_params)
    
    #模型用x_train_cv去训练,用x_train_cv和x_valid_cv一起去评估
    model.fit(
        x_train_cv, 
        y_train_cv, 
        eval_set = [(x_train_cv, y_train_cv), (x_valid_cv, y_valid_cv)], 
        #early_stopping_rounds=100,
        #verbose = 100, #迭代100次输出一个结果
    )
    
    #对训练集进行预测
    y_pred_train = model.predict(x_train_cv)        
    #对验证集进行预测
    y_pred_valid = model.predict(x_valid_cv) 
    
    y_pred_train=(y_pred_train>=0.5)
    y_pred_valid=(y_pred_valid>=0.5)
    
    train_acc=accuracy(y_pred_train,y_train_cv)
    valid_acc=accuracy(y_pred_valid,y_valid_cv)
    
    train_accuracy.append(train_acc)
    valid_accuracy.append(valid_acc)
    
    #将model保存进列表中
    models.append(model) 
    
    model = CatBoostRegressor(**cat_params)
    
    #模型用x_train_cv去训练,用x_train_cv和x_valid_cv一起去评估
    model.fit(
        x_train_cv, 
        y_train_cv, 
        eval_set = [(x_train_cv, y_train_cv), (x_valid_cv, y_valid_cv)], 
        #early_stopping_rounds=100,
        #verbose = 100, #迭代100次输出一个结果
    )
    
    #对训练集进行预测
    y_pred_train = model.predict(x_train_cv)        
    #对验证集进行预测
    y_pred_valid = model.predict(x_valid_cv) 
    
    y_pred_train=(y_pred_train>=0.5)
    y_pred_valid=(y_pred_valid>=0.5)
    
    train_acc=accuracy(y_pred_train,y_train_cv)
    valid_acc=accuracy(y_pred_valid,y_valid_cv)
    
    train_accuracy.append(train_acc)
    valid_accuracy.append(valid_acc)
    
    #将model保存进列表中
    models.append(model) 
    
    print(f"train_accuracy:{train_accuracy}, valid_accuracy:{valid_accuracy}")

train_accuracy=np.array(train_accuracy)
valid_accuracy=np.array(valid_accuracy)

print(f"mean_train_accuracy: {np.mean(train_accuracy)}")
print(f"mean_valid_accuracy: {np.mean(valid_accuracy)}")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120

L'output intermedio tra me e l'autore originale è leggermente diverso, non so cosa causi il divario:
Inserisci qui la descrizione dell'immagine
Inserisci qui la descrizione dell'immagine
Ma fortunatamente, sembra che i risultati finora non siano poi così negativi:
Inserisci qui la descrizione dell'immagine
Inserisci qui la descrizione dell'immagine
————————————————————————————————————————————
Testare le prestazioni di ciascun modello sul set di test:

test_X = test_df.drop(['Survived'], axis = 1).values

preds_test = []

#用每个保存的模型都对x_test预测一次,然后取平均值
for model in models:
    pred = model.predict(test_X)
    preds_test.append(pred)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
#将预测结果转换为np.array
preds_test_np = np.array(preds_test)

#按行对每个模型的预测结果取平均值
test_pred= preds_test_np.mean(axis = 0 )
test_pred=(test_pred >= 0.5).astype(np.int64) 
#平均预测值与 0.5 进行比较,根据比较结果(大于等于 0.5 为 True,否则为 False)将每个值转换为二进制形式(即 1 或 0),然后使用 astype(np.int64) 将布尔值转换为 64 位整数类型。
test_pred
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Inserisci qui la descrizione dell'immagine
Inserisci qui la descrizione dell'immagine
Inserisci qui la descrizione dell'immagine
Guarda l'output test_pred.shape. Non guardare la forma quadrata dell'array. Guarda la forma come un array unidimensionale con 418 elementi.
In Python, la forma di un array unidimensionale è solitamente rappresentata come (N,), dove N è il numero totale di elementi nell'array.
————————————————————————————————————————————
Come utilizzato nella frase test_pred=(test_pred &gt;= 0.5).astype(np.int64), ci sono molti esempi di creazione di una nuova colonna e confronto della dimensione per assegnare un valore Bool di True o False. Ci sono molti esempi in questo progetto:
Inserisci qui la descrizione dell'immagine
Inserisci qui la descrizione dell'immagine
————————————————————————————————————————————
Infine salva e scrivi nel file CSV:

submission=pd.read_csv("D:/StudyFiles/Optuna_Titanic/data/gender_submission.csv")  #读取CSV文件,并将其存储在变量submission中
submission['Survived']=test_pred  #更新了submission DataFrame中的'Survived'列,使其包含模型预测的生存概率或分类结果。
submission.to_csv("submission.csv",index=None) #将更新后的submission DataFrame保存为一个新的CSV文件"submission.csv"。参数index=None表示在保存CSV文件时不包括行索引。
submission.head()
  • 1
  • 2
  • 3
  • 4

Inserisci qui la descrizione dell'immagine
————————————————————————————————————————————
Invierò il mio pacchetto di codici alla home page CSDN. Gli amici bisognosi sono invitati a scaricarlo da soli. Ci vediamo nel prossimo tutorial.
Inserisci qui la descrizione dell'immagine
————————————————————————————————————————————
Altri contenuti didattici correlati:
(1) **9.1 Regolazione dei parametri del modello [Stanford 21 autunno: edizione cinese pratica dell'apprendimento automatico]: **Il video dell'insegnante Li Mu introduce alcune teorie sulla regolazione dei parametri. Se non capisci la regolazione dei parametri, puoi guardarlo per imparare conoscenza di base. .
https://www.bilibili.com/video/BV1vQ4y1e7LF/?spm_id_from=333.788.recommend_more_video.1&vd_source=cdfd0a0810bcc0bcdbcf373dafdf6a82
portale
(due) Questo strumento di regolazione automatica del ginseng è semplicemente troppo potente! Può soddisfare pienamente l'uso quotidiano dell'apprendimento automatico e della regolazione dei parametri di apprendimento profondo! Uno strumento indispensabile per i principianti!: Il contenuto del video non è buono come il video dimostrativo che ho seguito. Parla principalmente di Optuna brevemente senza casi pratici.
https://www.bilibili.com/video/BV1Zs421K7Qj/?spm_id_from=333.788.recommend_more_video.6&vd_source=cdfd0a0810bcc0bcdbcf373dafdf6a82
portale
Tuttavia, sono molto interessato al libro presentato da questo UP, perché per un principiante come me che manca di esperienza e ama trovare regole, spero davvero di avere una guida che possa introdurmi ad alcune formule e indicazioni universali.