2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Hintergrundverwackelung:(Lesen Sie es nicht, wenn Sie Geld sparen möchten)
Ich habe kürzlich ein Praktikum als KI-Annotator gefunden, habe aber während des gesamten Prozesses textbezogene Arbeiten durchgeführt. Im Wesentlichen wollte ich nur einige Fähigkeiten in der Parameteranpassung und -bereitstellung erlernen, um meine Wettbewerbsfähigkeit zu verbessern Der Lebenslauf wäre in Zukunft einfacher zu verpacken.
Die erste Wahl für Tutorials ist natürlich die Bilibili University. Wie erwartet habe ich ein kostenloses Parameteranpassungstool gefunden, das viele positive Bewertungen erhalten hat.Optuna。
Das Praktikum, das ich gemacht habe, war übrigensTextanmerkung zur Inhaltssicherheitsrichtung(Menschliches Sprichwort: Stellen Sie sicher, dass der Inhalt des Trainingssatzes stimmtpolitische Korrektheit), aber als ich mir andere Videos ansah, um zu lernen, wie man Yolo5 für die Masken- und Gesichtserkennung verwendet, erfuhr ich, dass es ein kostenloses gibtBildanmerkungDas Tool ist sehr einfach zu bedienen. Es ist sehr einfach zu installieren und zu verwenden. Der Schwerpunkt liegt auf Einfachheit und Effizienz.
Werkzeugname:BeschriftungImg
Ein öffentlicher Artikel, den der Dozent zuvor geteilt hatte, gab eine sehr umfassende Einführung:
https://mp.weixin.qq.com/s/AE_rJwd9cKQkUGFGD6EfAg
Öffentliches Kontoportal
————————————————————————————————————————————
Text: Über Optuna und den Lernprozess
**Link zum Video-Tutorial: **https://www.bilibili.com/list/watchlater?oid=832000670&bvid=BV1c34y1G7E8&spm_id_from=333.1007.top_right_bar_window_view_later.content.click
Videos von Station-B-Meistern
Installationsmethode:
Anaconda sollte auch über Conda installiert werden, wie im Video gezeigt, um Ärger zu vermeiden.
————————————————————————————————————————————
Kaggle-Fall-Link, der von Meistern verwendet wird:
https://www.kaggle.com/code/yunsuxiaozi/learn-to-use-the-optuna/notebook
Portal
Obwohl das Kopieren und Einfügen Spaß macht, wird empfohlen, es langsam von Hand zu schreiben, um das Gefühl und die Details zu bewahren. Auch wenn Sie es entsprechend eingeben, ist es besser als das Kopieren und Einfügen direkt einfügen. Wenn Sie eine Fertigkeit zum ersten Mal erlernen, gilt: Langsam ist schnell.
Wenn Sie Anaconda auf Ihrem Computer haben, wird ebenfalls empfohlen, eine spezielle virtuelle Umgebung zum Testen von Optuna zu erstellen, um Konflikte zu vermeiden.
————————————————————————————————————————————
Tutorials zum Aufbau einer virtuellen Conda-Umgebung des CSDN-Masters und zur Konfiguration einer virtuellen Jupyter-Umgebung:
https://blog.csdn.net/fanstering/article/details/123459665
Sie können diesen Schritt überspringen, wenn Sie Anaconda nicht haben
Ich bin mit diesem Schritt zum Einrichten einer virtuellen Umgebung bereits vertraut. Jupyter meldet jedoch immer noch, dass es keine Optuna-Bibliothek gibt, wenn ich sie gemäß dem Tutorial dieses Experten ausführe.nb_condaDas Problem wird später gelöst.
————————————————————————————————————————————
Beginnen Sie dann mit dem bekannten Prozess des Codeschreibens. Importieren Sie zunächst die erforderlichen Python-Bibliotheken und installieren Sie alles, was fehlt. Sowohl die Pip-Installation als auch die Conda-Installation sind akzeptabel.
Wenn er einen geisterhaften Fehler meldet: TqdmWarning: IProgress nicht gefunden. Bitte aktualisieren Sie Jupyter und ipywidgets. Siehe https://ipywidgets.read
zhebu
Haben Sie keine Angst, Sie müssen nur Jupyter aktualisieren.
Nachdem ich die ersten drei Schritte abgeschlossen hatte, habe ich diesen Schritt des Programms aktualisiert und ausgeführt, und alles war in Ordnung.
————————————————————————————————
Link zum Herunterladen des Datensatzes: https://www.kaggle.com/competitions/titanic/data?select=train.csv
Portal
total_df['Embarked_is_nan']=(total_df['Embarked']!=total_df['Embarked'])
Diese Codezeile erstellt eine neue Spalte „Embarked_is_nan“, die zum Markieren von Nullwerten (NaN) in der Spalte „Embarked“ verwendet wird. Wenn das Element in der Spalte „Embarked“ nicht es selbst ist (d. h. das Element ein NaN ist), wird die entsprechende Position in der neuen Spalte auf „True“ gesetzt.
Dies ist das erste Mal, dass ich diese Art von Schreiben sehe.
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()
Dieser Code ist etwas kompliziert. Er filtert zunächst vier wichtige Merkmale heraus ['Pclass', 'Sex', 'SibSp', 'Parch'] und speichert sie in der Schlüsselliste die Überlebenssituation der Passagiere.
Durchlaufen Sie dann die Liste nacheinander, um zu sehen, wie viele eindeutige Werte jedes Feature im Trainingssatz hat.
Wenn die Anzahl der eindeutigen Werte (Werte) einer Schlüsselspalte weniger als 10 beträgt, analysiert der Code die Beziehung zwischen dieser Spalte und der Überlebenssituation weiter.
(Ich bin ein wenig verwirrt darüber, warum key!= „Survived“ hervorgehoben wird. In dieser Schlüsselliste gibt es keinen Wert für „Survived“??)
Drucken Sie es aus und stellen Sie fest, dass alle vier Attribute die Bedingungen erfüllen:
key_target=train_df['Survived'].groupby([train_df[key]]).mean()
In diesem Schritt berechnet der Code im Trainingssatz train_df die durchschnittliche Überlebensrate der Spalte „Überlebt“, die jedem eindeutigen Wert in der Schlüsselliste entspricht.
Wie aus der Abbildung ersichtlich ist, ändert sich der Wert des Datenrahmens key_target mit dem Wert des Schlüsselattributs in jedem Zyklus. Wenn beispielsweise key = Pclass verarbeitet wird, sind die Schlüssel von key_target 1, 2 und 3 value ist die entsprechende durchschnittliche Überlebensrate; Verarbeitung Wenn key = sex, sind die Schlüssel von key_target „Female“ und „Male“, und die Werte sind auch die entsprechenden durchschnittlichen Überlebensraten.
Die folgenden Schritte sind etwas kompliziert. Zeichnen Sie eine Worttabelle, um es zu verstehen:
Es gibt insgesamt vier Attribute in Schlüsseln. Eines davon wird für jeden Fall verwendet. Schließlich werden die Daten der vier Attribute in total_df gespeichert, zusammengefasst und zurückgegeben.
Dies ist der Fall bei PClass. PClass hat drei Werte: 1/2/3. Die durchschnittliche Überlebensrate wird für jeden Wert berechnet und in key_target gespeichert.
Dann wird der Schlüssel von key_target herausgenommen und in der Schlüsselliste gespeichert (ja, diese Liste wird auch Schlüssel genannt ..., aber zu diesem Zeitpunkt sollten die darin enthaltenen Werte die drei Werte 1/ sein) 2/3 von PClass) und der Wert wird in der Zielliste gespeichert (das heißt, die drei Zahlen 0,629630, 0,472826, 0,242363), und dann werden die beiden Spalten Schlüssel und Wert künstlich benannt , und die Wertespalte ist personalisierter und sollte „PClass_target“ heißen.
Analog dazu befinden sich die key_target der nächsten drei Attribute alle in dieser Routine, aber die Tabelle total_df wird ständig erweitert.
(Das Wort „männlich“ ist hier außerhalb des zulässigen Bereichs, das Bild wurde abgeschnitten und später wurde ein separates Stück hinzugefügt.)
Bis total_df schließlich eine große Tabelle wird:
Um ehrlich zu sein, für einen Optuna-Fall, dessen Hauptzweck darin besteht, den Leuten den Umgang mit dem Parameteranpassungstool beizubringen, hat die vom ursprünglichen Autor in diesem Schritt geschriebene Logik die Verständnislast für mich wirklich erhöht ...
Ich habe Kimi gebeten, diesen Code in eine klarere und einfachere Version umzuschreiben, damit es nicht leicht ist, so viele Schlüssel und Ziele zu verwechseln, die den Bildschirm füllen:
Dieser Teil steht nicht im Mittelpunkt des Parameteranpassungsschritts. Wenn Sie ihn wirklich nicht verstehen, können Sie ihn überspringen. —————————————————————————————————————————
Verwenden Sie den Durchschnitt, um fehlende Werte zu ergänzen. Markieren Sie die üblichen Schritte in der Datenverarbeitung, die Sie gelernt haben.
Ergänzung: Als ich zuvor den Kurs „Datenanalyse und Tableau-Visualisierung“ belegt habe, hat der Lehrer einen Beitrag geteilt, in dem speziell viele Arten fehlender Daten und Verarbeitungsmethoden vorgestellt wurden: https://towardsdatascience.com/all-about-missing-data-handling-b94b8b5d2184
Linkbeschreibung hinzufügen
Der Beitrag ist auf Englisch und Sie müssen sich registrieren und anmelden, um ihn anzuzeigen.
————————————————————————————————————————————
Nachdem der Datensatz total_df mit immer umfassenderen Attributen versehen wurde, wird er entsprechend der vorherigen Länge wieder in den Trainingssatz und den Testsatz unterteilt.
————————————————————————————————————————————
Hier wird erwähnt, dass das Verhältnis zwischen Trainingssatz und Testsatz 8:2 beträgt, also 4:1, was ein sehr häufiges Teilungsverhältnis ist.
Der ursprüngliche Autor betrachtete Test und Valid wahrscheinlich als dasselbe, sodass es bei der Benennung keine besondere Unterscheidung gab.
Tatsächlich sind diese beiden Konzepte jedoch nicht genau gleich (aber ich sehe, dass die Unterscheidung manchmal nicht streng ist). Hier verwende ich eine einheitliche Schreibmethode von test_X und test_y.
————————————————————————————————————————————
importierenLGBTM-Regressor Obwohl der Titanic-Datensatz hauptsächlich für Klassifizierungsprobleme verwendet wird (Vorhersage, ob ein Passagier überleben wird), behandelt der ursprüngliche Autor ihn hier als Regressionsproblem. Ich war der Meinung, dass es für Anfänger einfacher wäre, ein Tutorial mit einem einfachen und vertrauten Datensatz und einer Videoerklärung zu wählen, sodass ich mir keine Gedanken über die Details von Regressions- oder Klassifizierungsproblemen machte. Sobald Sie mit dem Prozess vertraut sind, können Sie online komplexere und standardisierte Daten zum Üben finden.
Ergänzender Lernlink: „LGBMRegressor-Parametereinstellung des lgbmclassifier-Parameters“
https://blog.51cto.com/u_12219/10333606
Linkbeschreibung hinzufügen
(Übrigens, gibt es in diesem Beitrag keinen LGBT-Klassifikator? Warum hat der Autor im Video ausdrücklich den Umgang mit Regressionsproblemen erwähnt?)
————————————————————————————————————————————
RMSE als Verlustfunktion, also als Bewertungsindex, ist eine Python-Funktion, die den quadratischen Mittelwertfehler (Root Mean Square Error) berechnet.Je kleiner desto besser。
————————————————————————————————————————————
Legen Sie die Parameter des Aufgabenziels gemäß der Videoerklärung des Originalautors fest:
Spezifische Parameternamen, Bedeutungen und empfohlene Werte finden Sie oben im ergänzenden Lernbeitrag „LGBMRegressor-Parametereinstellung des lgbmclassifier-Parameters“.
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
————————————————————————————————————————————
Schlüsselcode: Rufen Sie Optuna auf, erstellen Sie eine Lernaufgabe, geben Sie den Mindestverlust an und legen Sie den Aufgabennamen fest:
#创建的研究命名,找最小值
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模型或其他需要这些超参数的模型。
————————————————————————————————————————————
Die Idee ist in Ordnung, aber wir sind auf einen seltsamen Fehler gestoßen: fit() hat ein unerwartetes Schlüsselwortargument „early_stopping_rounds“ erhalten:
Kimis Methode meldete nach dem Ausprobieren immer noch einen Fehler, daher sollten wir wahrscheinlich nicht die Schuld tragen.
Die Meister von StackFlow bieten zwei Lösungen:
https://stackoverflow.com/questions/76895269/lgbmclassifier-fit-got-an-unexpected-keyword-argument-early-stopping-rounds
Portal
Beachten Sie, dass es am besten ist, pip install zu verwenden. Conda Install scheint nicht installiert werden zu können.
Aber ich habe festgestellt, dass es keinen Nutzen hat ... Ich habe immer noch den gleichen Fehler erhalten, ich habe „early_stopping_rounds“ nicht erkannt, und selbst nachdem ich es gelöscht habe, habe ich den folgenden Parameter „verbose“ nicht erkannt ...
Es ist nicht möglich, die Parameter gemäß dem vorherigen Zusatzbeitrag zu ändern. Es scheint, dass die Informationsaktualisierung hinterherhinkt ...
————————————————————————————————————————————
Beim Suchvorgang habe ich auch einen fehleranfälligen Punkt gefunden: Die Early_stopping_rounds scheinen nur eine maximale Grenze von 100 zu haben.
https://blog.csdn.net/YangTinTin/article/details/120708391
Portal
————————————————————————————————————————————
Ich habe manuell im Internet gesucht und Kimi gefragt, aber noch keine sehr effektive Alternative gefunden. Da wir hauptsächlich den Einsatz von Optuna ausprobieren wollen, löschen wir zunächst diese beiden störenden Parameter.
model.fit(train_X, train_y, eval_set=[(test_X, test_y)]) #拟合
Vollständiger Zielcode:
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
Dann kannst duGetBest_TrialBekommen:
————————————————————————————————————————————
In ähnlicher Weise wird auch das ursprüngliche UP verwendetxgboost und catboostÄhnliche Methoden werden verwendet, um die optimalen Parameter zu finden.
Es ist nicht schwer zu erkennen, dass der Hauptunterschied zwischen den drei verschiedenen Methoden im ausgewählten Parameter param und der vom Modell angegebenen Funktionsmethode liegt.
XGBoost:
XGBoost-Ergebnisse:
————————————————————————————————————————————
CatBoost:
CatBoost-Ergebnisse:
————————————————————————————————————————————
zuletzt verwendetenK-fache KreuzvalidierungErzielen Sie die besten Ergebnisse:
Kreuzvalidierung ist auch ein häufig verwendeter Begriff beim maschinellen Lernen.
def accuracy(y_true, y_pred):
return np.sum(y_true == y_pred)/len(y_true)
kf ist ein KFold-Objekt, ein Tool in der Scikit-Learn-Bibliothek zur Implementierung der K-Fold-Kreuzvalidierung. KFold unterteilt den Datensatz inn_splits Teilmengen, jede TeilmengeAbwechselnd als Validierungssatz, und der Rest dient als Trainingssatz.
für train_index, valid_index in kf.split(x): Diese Codezeile iteriert über das KFold-Objekt und gibt für jede Iteration zwei Arrays zurück: train_index und valid_index.train_index enthält den Index des Datenpunkts, der für das Training verwendet wird, während valid_index den Index des Datenpunkts enthält, der für die Validierung verwendet wird . Gemäß dem Index für den vollständigen Satz X, Y können Sie die Daten des Trainingssatzes und des Verifizierungssatzes für jedes Mal abrufen. Dieser Vorgang ist so, als würde man die ganze Klasse stören, jedes Mal nach dem Zufallsprinzip ein paar Schüler auswählen und eine Gruppe von Schülern anrufen.
————————————————————————————————————————————
Jetzt bin ich auf einen weiteren häufigen Fehler gestoßen. Obwohl ich nicht weiß, wie es passiert ist, weiß ich nicht, ob Python die Schuld erneut auf sich nehmen sollte. (Da die Formen der X- und Y-Datensätze exakt denen des Autors zuvor entsprachen, wird es logischerweise später keine weiteren Operationen an ihnen geben ...)
Haben Sie keine Angst, wenn Sie auf Probleme stoßen, beheben Sie sie! Da muss man Kimi vertrauen! (Übrigens verwenden auch die Mitarbeiter des Unternehmens für künstliche Intelligenz, bei dem ich ein Praktikum mache, Kimi, daher ist Kimi relativ vertrauenswürdig und kostenlos!!)
Vergessen Sie nicht, die Parameter „early_stopping_rounds“ und „verbose“ gleichzeitig zu deaktivieren, um die Entstehung eines weiteren Fehlers zu vermeiden.
Dieser Code ist relativ lang und es gibt viele Wiederholungen. Achten Sie darauf, keine Fehler zu machen.
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)}")
Die Zwischenausgabe zwischen mir und dem ursprünglichen Autor ist etwas anders. Ich weiß nicht, was die Lücke verursacht:
Aber zum Glück scheinen die Ergebnisse bisher nicht allzu schlecht zu sein:
————————————————————————————————————————————
Testen Sie die Leistung jedes Modells mit dem Testsatz:
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
Betrachten Sie die Ausgabe test_pred.shape. Betrachten Sie die Form nicht als eindimensionales Array mit 418 Elementen.
In Python wird die Form eines eindimensionalen Arrays normalerweise als (N,) dargestellt, wobei N die Gesamtzahl der Elemente im Array ist.
————————————————————————————————————————————
Wie im Satz test_pred=(test_pred >= 0.5).astype(np.int64) verwendet, gibt es viele Beispiele für das Erstellen einer neuen Spalte und den Vergleich der Größe, um einen Bool-Wert von True oder False zuzuweisen. Hier gibt es viele Beispiele Projekt:
————————————————————————————————————————————
Zum Schluss speichern und in die CSV-Datei schreiben:
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()
————————————————————————————————————————————
Ich werde mein Codepaket an die CSDN-Homepage senden. Freunde in Not können es gerne selbst herunterladen.
————————————————————————————————————————————
Weitere verwandte Lerninhalte:
(1) **9.1 Modellparameteranpassung [Stanford 21 Fall: Practical Machine Learning Chinese Edition]: **Das Video von Lehrer Li Mu stellt einige Theorien zur Parameteranpassung vor. Wenn Sie die Parameteranpassung nicht verstehen, können Sie es sich ansehen, um das zu lernen Grundwissen. .
https://www.bilibili.com/video/BV1vQ4y1e7LF/?spm_id_from=333.788.recommend_more_video.1&vd_source=cdfd0a0810bcc0bcdbcf373dafdf6a82
Portal
(zwei) Dieses automatische Ginseng-Anpassungstool ist einfach zu leistungsstark! Es kann den täglichen Einsatz von maschinellem Lernen und Deep-Learning-Parameteranpassungen vollständig erfüllen! Ein unverzichtbares Werkzeug für Anfänger!: Der Inhalt des Videos ist nicht so gut wie das Demonstrationsvideo, das ich verfolgt habe. Es geht hauptsächlich kurz um Optuna, ohne praktische Fälle.
https://www.bilibili.com/video/BV1Zs421K7Qj/?spm_id_from=333.788.recommend_more_video.6&vd_source=cdfd0a0810bcc0bcdbcf373dafdf6a82
Portal
Ich interessiere mich jedoch sehr für das von diesem UP vorgestellte Buch, denn für einen Anfänger wie mich, dem es an Erfahrung mangelt und der gerne nach Regeln sucht, hoffe ich wirklich, einen Leitfaden zu haben, der mich in einige universelle Formeln und Anweisungen einführen kann.