Teknologian jakaminen

[Python Study Notes] Parametrien säätötyökalu Optuna Titanic Case

2024-07-12

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

[Python Study Notes] Parametrien säätötyökalu Optuna & Titanic Case

Taustan tärinä:(Älä lue, jos haluat säästää rahaa)
Löysin äskettäin työharjoittelupaikan tekoälyn kirjoittajana, mutta tein koko prosessin ajan tekstiin liittyvää työtä. Pohjimmiltaan halusin vain opetella joitain taitoja parametrien säätämisessä ja käyttöönotossa kilpailukyvyn parantamiseksi ansioluettelo olisi helpompi pakata tulevaisuudessa.
Tietenkin ensimmäinen valinta opetusohjelmiin on Bilibili University Kuten odotettiin, löysin ilmaisen parametrien säätötyökalun, joka on saanut monia positiivisia arvosteluja.Optuna
Muuten, harjoittelu, jonka tein, oliTekstihuomautus sisällön turvallisuuteen(Ihmisen sanonta: Varmista, että harjoitussarjan sisältö onpoliittinen korrektius), mutta kun katsoin muita videoita oppiakseni käyttämään Yolo5:tä maskin ja kasvojentunnistukseen, sain tietää, että on olemassa ilmainenKuvan huomautusTyökalu on erittäin helppokäyttöinen. Se on erittäin helppo asentaa ja käyttää.
Työkalun nimi:LabelImg
Ohjaajan aiemmin jakama julkinen tiliartikkeli antoi erittäin kattavan johdannon:
https://mp.weixin.qq.com/s/AE_rJwd9cKQkUGFGD6EfAg
Julkinen tiliportaali
Lisää kuvan kuvaus tähän
————————————————————————————————————————————

Teksti: Optunasta ja oppimisprosessista
**Opetusvideolinkki: **https://www.bilibili.com/list/watchlater?oid=832000670&bvid=BV1c34y1G7E8&spm_id_from=333.1007.top_right_bar_window_view_later.content.click
Videoita Station B -mestareista
Lisää kuvan kuvaus tähän
Asennusmenetelmä:
Lisää kuvan kuvaus tähän
Anaconda tulisi asentaa myös condan kautta.
————————————————————————————————————————————

Mestarien käyttämä Kaggle-tapauslinkki:
https://www.kaggle.com/code/yunsuxiaozi/learn-to-use-the-optuna/notebook
portaali
Lisää kuvan kuvaus tähän
Vaikka kopioiminen ja liittäminen on hauskaa, fiiliksen ja yksityiskohtien tuntemisen säilyttämiseksi on suositeltavaa kirjoittaa se hitaasti käsin vaikka kirjoittaisit sen mukaan, se on parempi kuin kopioida ja liittämällä suoraan. Kun oppii ensimmäisen taidon, hidas on nopea.
Vastaavasti, jos tietokoneessasi on Anaconda, on suositeltavaa rakentaa erityinen virtuaaliympäristö Optunan testaamiseksi konfliktien välttämiseksi.
————————————————————————————————————————————

CSDN-masterin conda-virtuaaliympäristön rakentamisen ja Jupyter-virtuaaliympäristön konfiguroinnin opetusohjelmat:
https://blog.csdn.net/fanstering/article/details/123459665
Voit ohittaa tämän vaiheen, jos sinulla ei ole Anacondaa

Olen jo perehtynyt tähän virtuaaliympäristön perustamiseen. Ympäristö ja Optuna-paketit ovat kuitenkin asennettuina.nb_condaOngelma ratkaistaan ​​myöhemmin.
Lisää kuvan kuvaus tähän
Lisää kuvan kuvaus tähän
————————————————————————————————————————————

Syötä sitten tuttu koodin kirjoitusprosessi, tuo ensin tarvittavat Python-kirjastot ja asenna puuttuvat asiat. Sekä pip-asennus että conda-asennus hyväksytään Anaconda suosittelee jälkimmäistä.

Jos hän ilmoittaa haamuvirheestä: TqdmVaroitus: IProgressia ei löydy. Päivitä jupyter ja ipywidgets. Katso https://ipywidgets.read
zhebuLisää kuvan kuvaus tähän

Älä pelkää, sinun tarvitsee vain päivittää Jupyter.
Lisää kuvan kuvaus tähän
Lisää kuvan kuvaus tähän
Kun olin suorittanut kolme ensimmäistä vaihetta, päivitin ja suoritin tämän ohjelman vaiheen, ja kaikki oli kunnossa.
Lisää kuvan kuvaus tähän
————————————————————————————————
Lisää kuvan kuvaus tähän
Tietojoukon latauslinkki: https://www.kaggle.com/competitions/titanic/data?select=train.csv
portaali
Lisää kuvan kuvaus tähän
Lisää kuvan kuvaus tähän

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

Tämä koodirivi luo uuden sarakkeen Embarked_is_nan, jota käytetään merkitsemään nolla-arvot (NaN) Embarked-sarakkeessa. Jos Embarked-sarakkeen elementti ei ole itse (eli elementti on NaN), uuden sarakkeen vastaavaksi paikaksi asetetaan True.
Tämä on ensimmäinen kerta, kun näen tämän kaltaisen tekstin.

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

Tämä koodi on hieman monimutkainen. Se suodattaa ensin neljä tärkeää ominaisuutta ['Pclass', 'Sex', 'SibSp', "Parch"] ja tallentaa ne avainluetteloon matkustajien selviytymistilanne.
Toista sitten luetteloa yksitellen nähdäksesi, kuinka monta yksilöllistä arvoa harjoitussarjan kullekin ominaisuudelle on.
Jos avainsarakkeen yksilöllisten arvojen (arvojen) määrä on alle 10, koodi analysoi edelleen tämän sarakkeen ja selviytymistilanteen välistä suhdetta.
(Olen hieman hämmentynyt siitä, miksi avain! = "Survived" on korostettu. Tässä avainluettelossa ei ole "Survived" -arvoa??)
Tulosta se ja huomaa, että kaikki neljä attribuuttia täyttävät ehdot:
Lisää kuvan kuvaus tähän

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

Tässä vaiheessa koulutusjoukossa train_df koodi laskee 'Survived'-sarakkeen keskimääräisen eloonjäämisasteen, joka vastaa kutakin avainluettelon ainutlaatuista arvoa.
Lisää kuvan kuvaus tähän
Kuten kuvasta voidaan nähdä, key_target-tietokehyksen arvo muuttuu avainattribuutin arvon kanssa jokaisessa syklissä. Esimerkiksi kun avain = Pluokka käsitellään, avain_kohde-avaimet ovat 1, 2 ja 3, ja arvo on vastaava keskimääräinen eloonjäämisprosentti. Kun avain = sukupuoli, key_target-avaimet ovat "nainen" ja "mies", ja arvot ovat myös vastaavat keskimääräiset eloonjäämisluvut.
Seuraavat vaiheet ovat hieman monimutkaisia ​​​​piirrä sanataulukko ymmärtääksesi sen:
Avaimissa on yhteensä neljä attribuuttia. Lopuksi neljän attribuutin tiedot tallennetaan tiedostoon total_df, yhteenveto ja palautetaan.
Tässä tapauksessa PClassilla on kolme arvoa: 1/2/3 Keskimääräinen eloonjäämisaste lasketaan kullekin arvolle ja tallennetaan key_target-kenttään.
Sitten avaimet otetaan pois ja tallennetaan avainlistaan ​​(kyllä, tätä listaa kutsutaan myös avaimille..., mutta tällä hetkellä sen arvojen tulee olla kolme arvoa ​​1/ 2/3 PClassista) ja arvot tallennetaan kohdeluetteloon (eli kolme numeroa 0,629630, 0,472826, 0,242363) ja nimeä sitten kaksi avainsaraketta kutsutaan myös PClassiksi, ja arvosarake on yksilöllisempi, ja sen nimi pitäisi olla "PClass_target".
Lisää kuvan kuvaus tähän
Analogisesti seuraavien kolmen attribuutin key_target ovat kaikki tässä rutiinissa, mutta total_df-taulukko laajenee jatkuvasti.
Lisää kuvan kuvaus tähän
(mies tässä on sanan ulkopuolella, kuva leikattiin pois ja erillinen pala lisättiin myöhemmin)
Kunnes lopulta total_df:stä tulee suuri taulukko:
Lisää kuvan kuvaus tähän
Ollakseni rehellinen, Optuna-tapauksessa, jonka päätarkoituksena on opettaa ihmisiä käyttämään parametrien säätötyökalua, alkuperäisen kirjoittajan tässä vaiheessa kirjoittama logiikka lisäsi minulle todella ymmärtämisen taakkaa...
Pyysin Kimiä kirjoittamaan tästä koodista selkeämmän ja yksinkertaisemman version, jotta ei ole helppoa sekoittaa niin monia ruudun täyttäviä avaimia ja kohteita:
Lisää kuvan kuvaus tähän
Tämä osa ei ole parametrien säätövaiheen painopiste, jos et todellakaan ymmärrä sitä, voit ohittaa sen. ———————————————————————————————————————————
Käytä keskiarvoa puuttuvien arvojen täyttämiseen. Merkitse oppimaasi tietojenkäsittelyn yleiset vaiheet.
Lisää kuvan kuvaus tähän
Täydennys: Kun kävin aiemmin data-analyysin ja Tableau-visualisointikurssin, opettaja jakoi postauksen, jossa esiteltiin erityisesti monenlaisia ​​puuttuvia tietoja ja käsittelymenetelmiä: https://towardsdatascience.com/all-about-missing-data-handling- b94b8b5d2184
Lisää linkin kuvaus
Viesti on englanninkielinen ja sinun tulee rekisteröityä ja kirjautua sisään nähdäksesi sen.
————————————————————————————————————————————
Kun tietojoukko total_df sisältää yhä kattavammat attribuutit, se jaetaan takaisin harjoitusjoukkoon ja testijoukkoon edellisen pituuden mukaan.
Lisää kuvan kuvaus tähän
————————————————————————————————————————————
Lisää kuvan kuvaus tähän
Tässä mainitaan, että harjoitussarjan ja testisarjan suhde on 8:2 eli 4:1, mikä on hyvin yleinen jakosuhde.
Alkuperäinen kirjoittaja luultavasti piti testiä ja validia samana asiana, joten nimeämisessä ei ollut erityistä eroa.
Lisää kuvan kuvaus tähän
Mutta itse asiassa nämä kaksi käsitettä eivät ole täsmälleen samat (mutta näen, että ero ei ole joskus tiukka). Käytän tässä yhtenäistä kirjoitusmenetelmää test_X ja test_y.
Lisää kuvan kuvaus tähän
Lisää kuvan kuvaus tähän
————————————————————————————————————————————
tuontiLGBM-regressori , vaikka Titanicin tietojoukkoa käytetään enimmäkseen luokitusongelmiin (matkustajan selviytymisen ennustamiseen), alkuperäinen kirjoittaja käsittelee sitä tässä regressioongelmana. Ajattelin, että aloittelijan olisi helpompi aloittaa valitsemalla opetusohjelma, jossa on yksinkertainen ja tuttu tietojoukko ja videoselitys, joten en murehtinut regression tai luokitteluongelmien yksityiskohtia. Kun olet perehtynyt prosessiin, voit löytää monimutkaisempaa ja standardoitua tietoa verkosta harjoittettavaksi.
Täydentävä oppimislinkki: "LGBMRegressor parametriasetus lgbmclassifier parametri"
https://blog.51cto.com/u_12219/10333606
Lisää linkin kuvaus
(Eikö tässä viestissä muuten ole LGBM-luokitusta? Miksi kirjoittaja mainitsi videossa nimenomaan regressioongelmien käsittelyn?)
————————————————————————————————————————————
RMSE häviöfunktiona eli arviointiindeksinä on Python-funktio, joka laskee neliövirheen (Root Mean Square Error).Mitä pienempi sen parempi
Lisää kuvan kuvaus tähän
————————————————————————————————————————————
Aseta tehtävän tavoitteen parametrit alkuperäisen kirjoittajan videon selityksen mukaan:
Tarkat parametrien nimet, merkitykset ja suositellut arvot ovat yllä olevassa täydentävässä oppimisviestissä "LGBMRegressor Parameter Setting lgbmclassifier Parameter".

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

————————————————————————————————————————————
Avainkoodi: Soita Optunaan, luo oppimistehtävä, määritä minimihäviö ja aseta tehtävän nimi:

#创建的研究命名,找最小值
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

Lisää kuvan kuvaus tähän
————————————————————————————————————————————
Idea on hyvä, mutta kohtasimme oudon virheen: fit() sai odottamattoman avainsana-argumentin "early_stopping_rounds":
Lisää kuvan kuvaus tähän
Kimin menetelmä ilmoitti silti virheestä kokeilun jälkeen, joten emme luultavasti ole meidän syyllisiä.Lisää kuvan kuvaus tähän
Lisää kuvan kuvaus tähän
StackFlow'n mestarit tarjoavat kaksi ratkaisua:
https://stackoverflow.com/questions/76895269/lgbmclassifier-fit-got-an-unexpected-keyword-argument-early-stopping-rounds

portaali
Lisää kuvan kuvaus tähän
Lisää kuvan kuvaus tähän
Huomaa, että on parasta käyttää pip asennusta, conda install ei näytä pystyvän asentamaan.
Lisää kuvan kuvaus tähän
Mutta huomasin, että siitä ei ollut hyötyä... Sain edelleen saman virheen, en tunnistanut early_stopping_rounds, ja edes sen poistamisen jälkeen en tunnistanut seuraavaa monisanaista parametria...
Parametreja ei voi muuttaa edellisen lisäpostauksen mukaan. Näyttää siltä, ​​että tietojen päivitys on myöhässä...
Lisää kuvan kuvaus tähän
Lisää kuvan kuvaus tähän

————————————————————————————————————————————
Hakuprosessin aikana löysin myös virhealtisen kohdan: early_stopping_rounds näyttää olevan vain 100 enimmäisraja.
https://blog.csdn.net/YangTinTin/article/details/120708391
portaali
Lisää kuvan kuvaus tähän
————————————————————————————————————————————
Etsin manuaalisesti netistä ja kysyin Kimiltä, ​​mutta en ole vielä löytänyt kovin tehokasta vaihtoehtoa. Koska haluamme pääasiassa kokeilla Optunan käyttöä, poistamme ensin nämä kaksi hankalaa parametria.

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

Täydellinen tavoitekoodi:

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

Sitten voitGetBest_TrialSain:
Lisää kuvan kuvaus tähän
————————————————————————————————————————————
Samoin alkuperäinen UP myös käytettyxgboost ja catboostSamanlaisia ​​menetelmiä käytetään optimaalisten parametrien löytämiseen.
Ei ole vaikea nähdä, että tärkein ero kolmen eri menetelmän välillä on valittu parametriparametri ja mallin määrittelemä funktiomenetelmä.
XGBoost:
Lisää kuvan kuvaus tähän
Lisää kuvan kuvaus tähän
XGBoost tulokset
Lisää kuvan kuvaus tähän
————————————————————————————————————————————
CatBoost:
Lisää kuvan kuvaus tähän
Lisää kuvan kuvaus tähän
CatBoost tulokset:
Lisää kuvan kuvaus tähän
————————————————————————————————————————————
viimeksi käytettyK-kertainen ristiin validointiSaat parhaat tulokset:
Ristivalidointi on myös yleisesti käytetty termi koneoppimisessa.
Lisää kuvan kuvaus tähän

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

Lisää kuvan kuvaus tähän
Lisää kuvan kuvaus tähänLisää kuvan kuvaus tähän

Lisää kuvan kuvaus tähän
kf on KFold-objekti, joka on scikit-learn-kirjaston työkalu K-kertaisen ristiinvalidoinnin toteuttamiseen. KFold jakaa tietojoukonn_jakaa osajoukkoja, jokainen osajoukkoOta vuorotellen vahvistusjoukkona, ja loput toimivat harjoitussarjana.
Train_index:lle valid_index kf.split(x):ssä: Tämä koodirivi toistuu KFold-objektin yli ja palauttaa kaksi taulukkoa jokaiselle iteraatiolle: train_index ja valid_index.train_index sisältää koulutuksessa käytetyn datapisteen indeksin, kun taas valid_index sisältää validointiin käytetyn datapisteen indeksin . Koko sarjan X, y indeksin mukaan voit saada koulutussarjan ja varmistusjoukon tiedot jokaiselta kerralla. Tämä prosessi on kuin koko luokan häiritseminen, joka kerta valitaan satunnaisesti muutama oppilas ja kutsuttaisiin joukko opiskelijoita.
————————————————————————————————————————————
Nyt olen törmännyt toiseen yleiseen virheeseen. Vaikka en tiedä kuinka se tapahtui, en tiedä pitäisikö Python ottaa syytteen uudelleen. (Koska X- ja Y-aineistojen muodot olivat täsmälleen samat kuin kirjoittajan aiemmin, loogisesti niille ei tehdä muita operaatioita myöhemmin...)
Lisää kuvan kuvaus tähän
Lisää kuvan kuvaus tähän
Lisää kuvan kuvaus tähän
Älä pelkää, jos kohtaat ongelmia, vaan korjaa ne! Sinun täytyy luottaa Kimiin tässä! (Muuten, myös sen tekoälyyrityksen työntekijät, jossa harjoittelen, käyttävät Kimiä, joten Kimi on suhteellisen luotettava, ja se on ilmaista!!)
Lisää kuvan kuvaus tähän
Älä unohda poistaa early_stopping_rounds- ja verbose-parametreja käytöstä samanaikaisesti, jotta vältytään uusilta virheiltä.
Lisää kuvan kuvaus tähän
Tämä koodinpätkä on suhteellisen pitkä, ja siinä on paljon toistoja. Älä tee virheitä.

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

Välitulos minun ja alkuperäisen kirjoittajan välillä on hieman erilainen, en tiedä mikä aiheuttaa eron:
Lisää kuvan kuvaus tähän
Lisää kuvan kuvaus tähän
Mutta onneksi tulokset eivät ole toistaiseksi kovin huonoja:
Lisää kuvan kuvaus tähän
Lisää kuvan kuvaus tähän
————————————————————————————————————————————
Testaa kunkin mallin suorituskykyä testisarjassa:

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

Lisää kuvan kuvaus tähän
Lisää kuvan kuvaus tähän
Lisää kuvan kuvaus tähän
Katso tulosta test_pred.shape Älä katso taulukon neliömäistä muotoa yksiulotteisena taulukkona.
Pythonissa yksiulotteisen taulukon muoto esitetään yleensä muodossa (N,), missä N on taulukon elementtien kokonaismäärä.
————————————————————————————————————————————
Kuten lauseessa test_pred=(test_pred &gt;= 0.5).astype(np.int64), on monia esimerkkejä uuden sarakkeen luomisesta ja koon vertaamisesta Tosi- tai epätosi-arvon määrittämiseksi. Tässä on monia esimerkkejä projekti:
Lisää kuvan kuvaus tähän
Lisää kuvan kuvaus tähän
————————————————————————————————————————————
Lopuksi tallenna ja kirjoita CSV-tiedostoon:

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

Lisää kuvan kuvaus tähän
————————————————————————————————————————————
Lähetän koodipaketini CSDN:n kotisivulle.
Lisää kuvan kuvaus tähän
————————————————————————————————————————————
Muu aiheeseen liittyvä oppimissisältö:
(1) **9.1 Mallin parametrien säätö [Stanford 21 Fall: Practical Machine Learning Chinese Edition]: **Opettaja Li Mu:n video esittelee joitain teorioita parametrien säätämisestä. Jos et ymmärrä parametrien säätämistä, voit katsoa sen perustieto. .
https://www.bilibili.com/video/BV1vQ4y1e7LF/?spm_id_from=333.788.recommend_more_video.1&vd_source=cdfd0a0810bcc0bcdbcf373dafdf6a82
portaali
(kaksi) Tämä automaattinen ginseng-säätötyökalu on yksinkertaisesti liian tehokas! Se vastaa täysin koneoppimisen päivittäiseen käyttöön ja syvän oppimisparametrien säätöön! Pakollinen työkalu aloittelijoille!: Videon sisältö ei ole niin hyvä kuin seuraamani esittelyvideo. Siinä puhutaan pääosin Optunasta lyhyesti ilman käytännön tapauksia.
https://www.bilibili.com/video/BV1Zs421K7Qj/?spm_id_from=333.788.recommend_more_video.6&vd_source=cdfd0a0810bcc0bcdbcf373dafdf6a82
portaali
Olen kuitenkin erittäin kiinnostunut tämän UP:n esittelemästä kirjasta, koska minun kaltaiselleni aloittelijalle, jolla ei ole kokemusta ja joka pitää sääntöjen löytämisestä, toivon todella saavani oppaan, joka esittelee minulle joitain universaaleja kaavoja ja ohjeita.