τα στοιχεία επικοινωνίας μου
Ταχυδρομείο[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Κούνημα φόντου:(Μην το διαβάσετε αν θέλετε να εξοικονομήσετε χρήματα)
Βρήκα πρόσφατα μια πρακτική άσκηση ως σχολιαστής τεχνητής νοημοσύνης, αλλά έκανα εργασία σχετική με το κείμενο σε όλη τη διάρκεια της διαδικασίας, ήθελα απλώς να μάθω κάποιες δεξιότητες στην προσαρμογή των παραμέτρων και την ανάπτυξη, ώστε να αυξήσω την ανταγωνιστικότητά μου το βιογραφικό θα ήταν ευκολότερο να συσκευαστεί στο μέλλον.
Φυσικά, η πρώτη επιλογή για μαθήματα είναι το Bilibili University Όπως ήταν αναμενόμενο, βρήκα ένα δωρεάν εργαλείο προσαρμογής παραμέτρων που έχει λάβει πολλές θετικές κριτικές.Optuna。
Παρεμπιπτόντως, η πρακτική που έκανα ήτανΣχολιασμός κειμένου για κατεύθυνση ασφάλειας περιεχομένου(Ανθρώπινο ρητό: Βεβαιωθείτε ότι το περιεχόμενο του σετ εκπαίδευσης είναιπολιτική ορθότητα), αλλά όταν παρακολούθησα άλλα βίντεο για να μάθω πώς να χρησιμοποιώ το Yolo5 για αναγνώριση μάσκας και προσώπου, έμαθα ότι υπάρχει δωρεάνΣχολιασμός εικόναςΤο εργαλείο είναι πολύ εύκολο στη χρήση. Το έχω δοκιμάσει πολύ εύκολα.
Όνομα εργαλείου:LabelImg
Ένα άρθρο δημόσιου λογαριασμού που κοινοποιήθηκε από τον εκπαιδευτή προηγουμένως έδωσε μια πολύ περιεκτική εισαγωγή:
https://mp.weixin.qq.com/s/AE_rJwd9cKQkUGFGD6EfAg
Πύλη δημόσιου λογαριασμού
————————————————————————————————————————————
Κείμενο: Σχετικά με το Optuna και τη μαθησιακή διαδικασία
**Σύνδεσμος εκμάθησης βίντεο: **https://www.bilibili.com/list/watchlater?oid=832000670&bvid=BV1c34y1G7E8&spm_id_from=333.1007.top_right_bar_window_view_later.content.click
Βίντεο των masters του Σταθμού Β
Μέθοδος εγκατάστασης:
Το Anaconda θα πρέπει επίσης να εγκατασταθεί μέσω της conda.
————————————————————————————————————————————
Σύνδεσμος θήκης Kaggle που χρησιμοποιείται από πλοιάρχους:
https://www.kaggle.com/code/yunsuxiaozi/learn-to-use-the-optuna/notebook
πύλη
Αν και η αντιγραφή και η επικόλληση είναι διασκεδαστική, για να διατηρήσετε την αίσθηση + την αίσθηση των λεπτομερειών, συνιστάται αν έχετε χρόνο να το γράψετε σιγά σιγά, ακόμα κι αν το πληκτρολογήσετε σύμφωνα με αυτό, είναι καλύτερο από το να αντιγράψετε επικόλληση απευθείας. Όταν μαθαίνεις για πρώτη φορά μια δεξιότητα, το αργό είναι γρήγορο.
Ομοίως, εάν έχετε Anaconda στον υπολογιστή σας, συνιστάται να δημιουργήσετε ένα ειδικό εικονικό περιβάλλον για να δοκιμάσετε το Optuna για την αποφυγή διενέξεων.
————————————————————————————————————————————
Εκμάθηση κατασκευής εικονικού περιβάλλοντος conda του CSDN master και διαμόρφωσης εικονικού περιβάλλοντος jupyter:
https://blog.csdn.net/fanstering/article/details/123459665
Μπορείτε να παραλείψετε αυτό το βήμα εάν δεν έχετε Anaconda
Είμαι ήδη εξοικειωμένος με αυτό το βήμα δημιουργίας ενός εικονικού περιβάλλοντος Το περιβάλλον και τα πακέτα Optuna έχουν εγκατασταθεί, ωστόσο, η Jupyter εξακολουθεί να αναφέρει ότι δεν υπάρχει βιβλιοθήκη Optuna όταν την εγκατέστησα σύμφωνα με αυτό το σεμινάριο.nb_condaΤο πρόβλημα θα λυθεί αργότερα.
————————————————————————————————————————————
Στη συνέχεια, εισαγάγετε τη γνωστή διαδικασία σύνταξης κώδικα Πρώτα, εισαγάγετε τις απαιτούμενες βιβλιοθήκες Python και εγκαταστήστε ό,τι λείπει. Τόσο η εγκατάσταση pip όσο και η εγκατάσταση conda είναι αποδεκτές από την Anaconda.
Εάν αναφέρει ένα φανταστικό σφάλμα: TqdmΠροειδοποίηση: Το IProgress δεν βρέθηκε. Ενημερώστε τα jupyter και ipywidgets. Δείτε https://ipywidgets.read
zhebu
Μην φοβάστε, απλά πρέπει να αναβαθμίσετε το Jupyter.
Αφού ολοκλήρωσα τα τρία πρώτα βήματα, ανανέωσα και έτρεξα αυτό το βήμα του προγράμματος και όλα ήταν μια χαρά.
————————————————————————————————
Σύνδεσμος λήψης συνόλου δεδομένων: https://www.kaggle.com/competitions/titanic/data?select=train.csv
πύλη
total_df['Embarked_is_nan']=(total_df['Embarked']!=total_df['Embarked'])
Αυτή η γραμμή κώδικα δημιουργεί μια νέα στήλη 'Embarked_is_nan', η οποία χρησιμοποιείται για την επισήμανση μηδενικών τιμών (NaN) στη στήλη 'Embarked'. Εάν το στοιχείο στη στήλη 'Ενίσχυση' δεν είναι το ίδιο (δηλαδή το στοιχείο είναι NaN), η αντίστοιχη θέση στη νέα στήλη θα οριστεί σε True.
Είναι η πρώτη φορά που βλέπω αυτού του είδους τη γραφή.
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()
Αυτό το κομμάτι κώδικα είναι λίγο περίπλοκο. Αρχικά φιλτράρει τέσσερα σημαντικά χαρακτηριστικά ['Pclass', 'Sex', 'SibSp', 'Parch'] και τα αποθηκεύει στη λίστα κλειδιών την κατάσταση επιβίωσης των επιβατών.
Στη συνέχεια, επαναλάβετε τη λίστα ένα προς ένα για να δείτε πόσες μοναδικές τιμές έχει κάθε χαρακτηριστικό στο σετ εκπαίδευσης.
Εάν ο αριθμός των μοναδικών τιμών len (τιμές) μιας στήλης κλειδιού είναι μικρότερος από 10, ο κωδικός θα αναλύσει περαιτέρω τη σχέση μεταξύ αυτής της στήλης και της κατάστασης επιβίωσης.
(Είμαι λίγο μπερδεμένος σχετικά με το γιατί κλειδί!= Το "Survived" τονίζεται. Δεν υπάρχει η τιμή του "Survived" σε αυτήν τη λίστα κλειδιών;;)
Εκτυπώστε το και βρείτε ότι και τα τέσσερα χαρακτηριστικά πληρούν τις προϋποθέσεις:
key_target=train_df['Survived'].groupby([train_df[key]]).mean()
Σε αυτό το βήμα, στο σετ εκπαίδευσης train_df, ο κώδικας υπολογίζει το μέσο ποσοστό επιβίωσης της στήλης «Επιβίωσε» που αντιστοιχεί σε κάθε μοναδική τιμή στη λίστα κλειδιών.
Όπως φαίνεται από το σχήμα, η τιμή του πλαισίου δεδομένων key_target αλλάζει ανάλογα με την τιμή του χαρακτηριστικού κλειδιού σε κάθε κύκλο. Η τιμή είναι το αντίστοιχο μέσο ποσοστό επιβίωσης επεξεργασία Όταν κλειδί = φύλο, τα κλειδιά του key_target είναι «Γυναίκα» και «Άνδρας», και οι τιμές είναι επίσης τα αντίστοιχα μέσα ποσοστά επιβίωσης.
Τα επόμενα βήματα είναι λίγο περίπλοκα Σχεδιάστε έναν πίνακα λέξεων για να τον καταλάβετε.
Υπάρχουν συνολικά τέσσερα χαρακτηριστικά σε κλειδιά. Ένα από αυτά θα χρησιμοποιηθεί για κάθε περίπτωση. Τέλος, τα δεδομένα των τεσσάρων χαρακτηριστικών θα αποθηκευτούν στο total_df.
Αυτή είναι η περίπτωση του PClass έχει τρεις τιμές: 1/2/3 Το μέσο ποσοστό επιβίωσης υπολογίζεται για κάθε τιμή και αποθηκεύεται στο key_target.
Στη συνέχεια, το κλειδί του key_target αφαιρείται και αποθηκεύεται στη λίστα κλειδιών (ναι, αυτή η λίστα ονομάζεται επίσης κλειδιά..., αλλά αυτή τη στιγμή οι τιμές σε αυτήν θα πρέπει να είναι οι τρεις τιμές1/ 2/3 του PClass), και η τιμή αποθηκεύεται στη λίστα προορισμού (δηλαδή, οι τρεις αριθμοί 0,629630, 0,472826, 0,242363), και στη συνέχεια ονομάστε τεχνητά τις δύο στήλες κλειδιού και τιμής , και η στήλη τιμής είναι πιο εξατομικευμένη και θα πρέπει να ονομάζεται "PClass_target".
Κατ' αναλογία, ο βασικός_στόχος των επόμενων τριών χαρακτηριστικών είναι όλα σε αυτήν τη ρουτίνα, αλλά ο πίνακας total_df επεκτείνεται συνεχώς.
(το αρσενικό εδώ είναι λέξη εκτός ορίων, η εικόνα κόπηκε και ένα ξεχωριστό κομμάτι προστέθηκε αργότερα)
Μέχρι που τελικά το total_df γίνει ένας μεγάλος πίνακας:
Για να είμαι ειλικρινής, για μια υπόθεση Optuna της οποίας ο κύριος σκοπός είναι να διδάξει στους ανθρώπους πώς να χρησιμοποιούν το εργαλείο προσαρμογής παραμέτρων, η λογική που γράφτηκε από τον αρχικό συγγραφέα σε αυτό το βήμα αύξησε πραγματικά το βάρος της κατανόησης για μένα...
Ζήτησα από την Kimi να ξαναγράψει αυτόν τον κώδικα σε μια πιο ξεκάθαρη και απλή έκδοση, ώστε να μην είναι εύκολο να μπερδέψουμε τόσα πολλά κλειδιά και στόχους που γεμίζουν την οθόνη:
Αυτό το μέρος δεν είναι το επίκεντρο του βήματος προσαρμογής παραμέτρων Εάν πραγματικά δεν το καταλαβαίνετε, μπορείτε να το παραλείψετε. ——————————————————————————————————————————
Χρησιμοποιήστε τον μέσο όρο για να συμπληρώσετε τις τιμές που λείπουν. Σημειώστε τα κοινά βήματα στην επεξεργασία δεδομένων που μάθατε.
Συμπλήρωμα: Όταν παρακολούθησα το μάθημα ανάλυσης δεδομένων και οπτικοποίησης πίνακα πριν, ο δάσκαλος μοιράστηκε μια ανάρτηση που παρουσίαζε συγκεκριμένα πολλούς τύπους δεδομένων που λείπουν και μεθόδους επεξεργασίας: https://towardsdatascience.com/all-about-missing-data-handling- b94b8b5d2184
Προσθήκη περιγραφής συνδέσμου
Η ανάρτηση είναι στα αγγλικά και πρέπει να εγγραφείτε και να συνδεθείτε για να τη δείτε.
————————————————————————————————————————————
Αφού έχουμε το σύνολο δεδομένων total_df με όλο και πιο ολοκληρωμένα χαρακτηριστικά, χωρίζεται ξανά στο σετ εκπαίδευσης και στο σύνολο δοκιμής σύμφωνα με το προηγούμενο μήκος.
————————————————————————————————————————————
Εδώ αναφέρεται ότι η αναλογία σετ προπόνησης και σετ δοκιμών είναι 8:2, δηλαδή 4:1, που είναι πολύ συνηθισμένη αναλογία διαίρεσης.
Ο αρχικός συγγραφέας πιθανώς θεώρησε το τεστ και το έγκυρο ως το ίδιο πράγμα, επομένως δεν υπήρχε ιδιαίτερη διάκριση στην ονομασία.
Αλλά στην πραγματικότητα, αυτές οι δύο έννοιες δεν είναι ακριβώς οι ίδιες (αλλά βλέπω ότι μερικές φορές η διάκριση δεν είναι αυστηρή Εδώ χρησιμοποιώ μια ενοποιημένη μέθοδο γραφής test_X και test_y).
————————————————————————————————————————————
εισαγωγήLGBM regressor , αν και το σύνολο δεδομένων του Τιτανικού χρησιμοποιείται κυρίως για προβλήματα ταξινόμησης (πρόβλεψη εάν ένας επιβάτης θα επιβιώσει), ο αρχικός συγγραφέας το αντιμετωπίζει εδώ ως πρόβλημα παλινδρόμησης. Θεώρησα ότι για αρχάριους, θα ήταν ευκολότερο να ξεκινήσουν επιλέγοντας ένα σεμινάριο με ένα απλό και οικείο σύνολο δεδομένων και μια επεξήγηση βίντεο, επομένως δεν ανησυχούσα για τις λεπτομέρειες των προβλημάτων παλινδρόμησης ή ταξινόμησης. Μόλις γίνετε ικανοί στη διαδικασία, μπορείτε να βρείτε πιο πολύπλοκα και τυποποιημένα δεδομένα στο διαδίκτυο για εξάσκηση.
Συμπληρωματικός σύνδεσμος εκμάθησης: "LGBMRegressor setting parameter parameter lgbmclassifier parameter"
https://blog.51cto.com/u_12219/10333606
Προσθήκη περιγραφής συνδέσμου
(Παρεμπιπτόντως, δεν υπάρχει ταξινομητής LGBM σε αυτήν την ανάρτηση; Γιατί ο συγγραφέας ανέφερε συγκεκριμένα την αντιμετώπιση προβλημάτων παλινδρόμησης στο βίντεο;)
————————————————————————————————————————————
Το RMSE ως συνάρτηση απώλειας, δηλαδή δείκτης αξιολόγησης, είναι μια συνάρτηση Python που υπολογίζει το ριζικό μέσο τετραγωνικό σφάλμα (Root Mean Square Error).Όσο μικρότερο τόσο το καλύτερο。
————————————————————————————————————————————
Ορίστε τις παραμέτρους του στόχου εργασίας σύμφωνα με την εξήγηση βίντεο του αρχικού συγγραφέα:
Για συγκεκριμένα ονόματα παραμέτρων, σημασίες και προτεινόμενες τιμές, ανατρέξτε στη συμπληρωματική δημοσίευση εκμάθησης "Ρύθμιση παραμέτρων LGBMRegressor Παράμετρος lgbmclassifier" παραπάνω.
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
————————————————————————————————————————————
Κωδικός κλειδιού: Καλέστε το Optuna, δημιουργήστε μια εργασία εκμάθησης, καθορίστε την ελάχιστη απώλεια και ορίστε το όνομα της εργασίας:
#创建的研究命名,找最小值
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模型或其他需要这些超参数的模型。
————————————————————————————————————————————
Η ιδέα είναι καλή, αλλά αντιμετωπίσαμε ένα περίεργο σφάλμα: η fit() έλαβε ένα απροσδόκητο όρισμα λέξης-κλειδιού 'early_stopping_rounds':
Η μέθοδος του Kimi ανέφερε ακόμη ένα σφάλμα αφού το δοκίμασε, επομένως μάλλον δεν είμαστε εμείς που θα πρέπει να αναλάβουμε την ευθύνη.
Οι κύριοι του StackFlow παρέχουν δύο λύσεις:
https://stackoverflow.com/questions/76895269/lgbmclassifier-fit-got-an-unexpected-keyword-argument-early-stopping-rounds
πύλη
Σημειώστε ότι είναι καλύτερο να χρησιμοποιήσετε το pip install, το conda install φαίνεται να μην μπορεί να εγκατασταθεί.
Αλλά διαπίστωσα ότι δεν ωφελούσε... Παρόλα αυτά έλαβα το ίδιο σφάλμα, δεν αναγνώρισα το early_stopping_rounds, και ακόμη και μετά τη διαγραφή του, δεν αναγνώρισα την παρακάτω παράμετρο αναλυτική...
Δεν είναι δυνατή η αλλαγή των παραμέτρων σύμφωνα με την προηγούμενη συμπληρωματική ανάρτηση Φαίνεται ότι η ενημέρωση πληροφοριών υστερεί...
————————————————————————————————————————————
Κατά τη διαδικασία αναζήτησης, βρήκα επίσης ένα σημείο επιρρεπές σε σφάλματα: οι early_stopping_rounds φαίνεται να έχουν μόνο ένα μέγιστο όριο 100.
https://blog.csdn.net/YangTinTin/article/details/120708391
πύλη
————————————————————————————————————————————
Έψαξα χειροκίνητα στο Διαδίκτυο και ρώτησα την Kimi, αλλά δεν έχω βρει ακόμα μια πολύ αποτελεσματική εναλλακτική. Δεδομένου ότι θέλουμε κυρίως να δοκιμάσουμε τη χρήση του Optuna, πρώτα διαγράφουμε αυτές τις δύο ενοχλητικές παραμέτρους.
model.fit(train_X, train_y, eval_set=[(test_X, test_y)]) #拟合
Πλήρης αντικειμενικός κωδικός:
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
Τότε μπορείςGetBest_TrialΠήρα:
————————————————————————————————————————————
Ομοίως, το αρχικό UP χρησιμοποιήθηκε επίσηςxgboost και catboostΠαρόμοιες μέθοδοι χρησιμοποιούνται για την εύρεση των βέλτιστων παραμέτρων.
Δεν είναι δύσκολο να δει κανείς ότι η κύρια διαφορά μεταξύ των τριών διαφορετικών μεθόδων είναι η παράμετρος που έχει επιλεγεί και η μέθοδος λειτουργίας που καθορίζεται από το μοντέλο.
XGBoost:
Αποτελέσματα XGBoost:
————————————————————————————————————————————
CatBoost:
Αποτελέσματα CatBoost:
————————————————————————————————————————————
τελευταία χρήσηΔιασταυρούμενη επικύρωση K-foldΑποκτήστε τα καλύτερα αποτελέσματα:
Η διασταυρούμενη επικύρωση είναι επίσης ένας ευρέως χρησιμοποιούμενος όρος στη μηχανική εκμάθηση.
def accuracy(y_true, y_pred):
return np.sum(y_true == y_pred)/len(y_true)
Το kf είναι ένα αντικείμενο KFold, το οποίο είναι ένα εργαλείο στη βιβλιοθήκη scikit-learn για την υλοποίηση διασταυρούμενης επικύρωσης K-fold. Το KFold διαιρεί το σύνολο δεδομένων σεn_splits υποσύνολα, κάθε υποσύνολοΕναλλάξτε ως σύνολο επικύρωσης, και τα υπόλοιπα χρησιμεύουν ως το σετ εκπαίδευσης.
για train_index, valid_index στο kf.split(x): Αυτή η γραμμή κώδικα θα επαναληφθεί πάνω από το αντικείμενο KFold, επιστρέφοντας δύο πίνακες για κάθε επανάληψη: train_index και valid_index.Το train_index περιέχει το ευρετήριο του σημείου δεδομένων που χρησιμοποιείται για την εκπαίδευση, ενώ το valid_index περιέχει το ευρετήριο του σημείου δεδομένων που χρησιμοποιείται για την επικύρωση . Σύμφωνα με το ευρετήριο του πλήρους συνόλου X, y, μπορείτε να λάβετε το σετ εκπαίδευσης και τα δεδομένα του συνόλου επαλήθευσης για κάθε φορά. Αυτή η διαδικασία είναι σαν να διακόπτετε ολόκληρη την τάξη, να επιλέγετε τυχαία μερικούς μαθητές κάθε φορά και να καλείτε μια ομάδα μαθητών.
————————————————————————————————————————————
Τώρα αντιμετώπισα ένα άλλο κοινό σφάλμα, αν και δεν ξέρω πώς συνέβη, δεν ξέρω αν η Python πρέπει να αναλάβει ξανά την ευθύνη. (Επειδή τα σχήματα των συνόλων δεδομένων X και Y ήταν ακριβώς τα ίδια με αυτά του συγγραφέα πριν, λογικά δεν θα υπάρξουν άλλες λειτουργίες σε αυτά αργότερα...)
Μην φοβάστε αν αντιμετωπίσετε προβλήματα, διορθώστε τα! Πρέπει να εμπιστευτείς την Kimi σε αυτό! (Παρεμπιπτόντως, οι υπάλληλοι της εταιρείας τεχνητής νοημοσύνης όπου ασκούμαι χρησιμοποιούν επίσης το Kimi, οπότε το Kimi είναι σχετικά αξιόπιστο και είναι δωρεάν!!)
Μην ξεχάσετε να απενεργοποιήσετε τις παραμέτρους early_stopping_rounds και verbose ταυτόχρονα για να αποφύγετε την πρόκληση άλλου σφάλματος.
Αυτό το κομμάτι κώδικα είναι σχετικά μεγάλο και υπάρχουν πολλές επαναλήψεις. Προσέξτε να μην κάνετε λάθη.
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)}")
Η ενδιάμεση απόδοση μεταξύ εμένα και του αρχικού συγγραφέα είναι κάπως διαφορετική. Δεν ξέρω τι προκαλεί το χάσμα.
Αλλά ευτυχώς, φαίνεται ότι τα αποτελέσματα δεν είναι πολύ άσχημα μέχρι στιγμής:
————————————————————————————————————————————
Ελέγξτε την απόδοση κάθε μοντέλου στο δοκιμαστικό σετ:
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)
#将预测结果转换为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
Κοιτάξτε το output test_pred.shape Μην κοιτάτε το σχήμα του πίνακα ως μονοδιάστατο πίνακα.
Στην Python, το σχήμα ενός μονοδιάστατου πίνακα αναπαρίσταται συνήθως ως (N,), όπου N είναι ο συνολικός αριθμός των στοιχείων του πίνακα.
————————————————————————————————————————————
Όπως χρησιμοποιείται στην πρόταση test_pred=(test_pred >= 0.5).atype(np.int64), υπάρχουν πολλά παραδείγματα δημιουργίας μιας νέας στήλης και σύγκρισης του μεγέθους για την εκχώρηση μιας τιμής Bool με True ή False Υπάρχουν πολλά παραδείγματα σε αυτό έργο:
————————————————————————————————————————————
Τέλος αποθηκεύστε και γράψτε στο αρχείο 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()
————————————————————————————————————————————
Θα στείλω το πακέτο κωδικών μου στην αρχική σελίδα του CSDN Οι φίλοι που έχουν ανάγκη είναι ευπρόσδεκτοι να το κατεβάσουν μόνοι τους.
————————————————————————————————————————————
Άλλο σχετικό μαθησιακό περιεχόμενο:
(1) **9.1 Προσαρμογή παραμέτρων μοντέλου [Stanford 21 Fall: Practical Machine Learning Chinese Edition]: **Το βίντεο του δασκάλου Li Mu εισάγει ορισμένες θεωρίες σχετικά με την προσαρμογή παραμέτρων, μπορείτε να το παρακολουθήσετε για να το μάθετε ΒΑΣΙΚΕΣ ΓΝΩΣΕΙΣ. .
https://www.bilibili.com/video/BV1vQ4y1e7LF/?spm_id_from=333.788.recommend_more_video.1&vd_source=cdfd0a0810bcc0bcdbcf373dafdf6a82
πύλη
(δύο) Αυτό το εργαλείο αυτόματης ρύθμισης ginseng είναι απλά πολύ ισχυρό! Μπορεί να καλύψει πλήρως την καθημερινή χρήση της μηχανικής μάθησης και την προσαρμογή παραμέτρων βαθιάς μάθησης! Ένα απαραίτητο εργαλείο για αρχάριους!: Το περιεχόμενο του βίντεο δεν είναι τόσο καλό όσο το βίντεο επίδειξης που ακολούθησα, κυρίως μιλάει για το Optuna εν συντομία χωρίς πρακτικές περιπτώσεις.
https://www.bilibili.com/video/BV1Zs421K7Qj/?spm_id_from=333.788.recommend_more_video.6&vd_source=cdfd0a0810bcc0bcdbcf373dafdf6a82
πύλη
Ωστόσο, με ενδιαφέρει πολύ το βιβλίο που παρουσιάζει αυτό το UP, γιατί για έναν αρχάριο σαν εμένα που δεν έχει εμπειρία και του αρέσει να βρίσκει κανόνες, ελπίζω πραγματικά να έχω έναν οδηγό που θα μπορεί να με εισάγει σε ορισμένες καθολικές φόρμουλες και κατευθύνσεις.