Compartilhamento de tecnologia

[Notas de estudo Python] Ferramenta de ajuste de parâmetros Optuna Titanic Case

2024-07-12

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

[Notas de estudo Python] Ferramenta de ajuste de parâmetros Optuna e Titanic Case

Tremor de fundo:(Não leia se quiser economizar dinheiro)
Recentemente encontrei um estágio como anotador de IA, mas estava fazendo trabalhos relacionados a texto ao longo do processo. Essencialmente, ainda estava apertando os parafusos. Só queria aprender algumas habilidades em ajuste de parâmetros e implantação para aumentar minha competitividade. currículo seria mais fácil de empacotar no futuro.
Claro, a primeira escolha para tutoriais é a Universidade Bilibili. Como esperado, encontrei uma ferramenta gratuita de ajuste de parâmetros que recebeu muitas críticas positivas.Optuna
Aliás, o estágio que fiz foiAnotação de texto para orientação de segurança de conteúdo(Dito humano: Certifique-se de que o conteúdo do conjunto de treinamento sejapoliticamente correto), mas quando assisti outros vídeos para aprender como usar o Yolo5 para máscara e reconhecimento facial, descobri que existe um aplicativo gratuitoAnotação de imagemA ferramenta é muito fácil de usar. Eu mesmo testei. É muito fácil de instalar e usar. Não contém anúncios ou encargos.
Nome da ferramenta:RótuloImg
Um artigo de relato público compartilhado anteriormente pelo instrutor forneceu uma introdução muito abrangente:
Português: https://mp.weixin.qq.com/s/AE_rJwd9cKQkUGFGD6EfAg
Portal de contas públicas
Insira a descrição da imagem aqui
————————————————————————————————————————————

Texto: Sobre Optuna e o processo de aprendizagem
**Link do tutorial em vídeo: **https://www.bilibili.com/list/watchlater?oid=832000670&bvid=BV1c34y1G7E8&spm_id_from=333.1007.top_right_bar_window_view_later.content.click
Vídeos dos mestres da Estação B
Insira a descrição da imagem aqui
Método de instalação:
Insira a descrição da imagem aqui
O Anaconda também deve ser instalado através do conda. Acabei de instalá-lo via pip conforme mostrado no vídeo para evitar problemas.
————————————————————————————————————————————

Link do caso Kaggle usado pelos mestres:
https://www.kaggle.com/code/yunsuxiaozi/learn-to-use-the-optuna/notebook
portal
Insira a descrição da imagem aqui
Embora copiar e colar seja divertido, para manter o toque + sentir os detalhes, é recomendável que, se tiver tempo, escreva lentamente à mão. Mesmo que você digite de acordo, é melhor do que copiar e. colando diretamente. Quando você aprende uma habilidade pela primeira vez, lento é rápido.
Da mesma forma, se você tiver o Anaconda em seu computador, é recomendável construir um ambiente virtual especial para testar o Optuna e evitar conflitos.
————————————————————————————————————————————

Tutoriais de construção de ambiente virtual conda do mestre CSDN e configuração de ambiente virtual jupyter:
https://blog.csdn.net/fanstering/article/details/123459665
Você pode pular esta etapa se não tiver o Anaconda

Já estou familiarizado com esta etapa de estabelecimento de um ambiente virtual. O ambiente e os pacotes Optuna foram instalados, porém, o Jupyter ainda relata que não há biblioteca Optuna quando eu a instalei de acordo com o tutorial deste especialista.nb_condaO problema será resolvido mais tarde.
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
————————————————————————————————————————————

Em seguida, entre no processo familiar de escrever código. Primeiro, importe as bibliotecas Python necessárias e instale o que estiver faltando. Tanto pip install quanto conda install são aceitáveis. O Anaconda recomenda o último.

Se ele relatar um erro fantasmagórico: TqdmWarning: IProgress não encontrado. Atualize jupyter e ipywidgets. Veja https://ipywidgets.read
ZhebuInsira a descrição da imagem aqui

Não tenha medo, você só precisa atualizar o Jupyter.
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
Depois de concluir as três primeiras etapas, atualizei e executei esta etapa do programa e tudo ficou bem.
Insira a descrição da imagem aqui
————————————————————————————————
Insira a descrição da imagem aqui
Link para download do conjunto de dados: https://www.kaggle.com/competitions/titanic/data?select=train.csv
portal
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui

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

Esta linha de código cria uma nova coluna ‘Embarked_is_nan’, que é usada para marcar valores nulos (NaN) na coluna ‘Embarked’. Se o elemento na coluna 'Embarked' não for ele mesmo (ou seja, o elemento for NaN), a posição correspondente na nova coluna será definida como True.
É a primeira vez que vejo esse tipo de escrita.

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

Este trecho de código é um pouco complicado. Ele primeiro filtra quatro recursos importantes ['Pclass', 'Sex', 'SibSp', 'Parch'] e os armazena na lista de chaves. Essas colunas são consideradas potencialmente relacionadas. a situação de sobrevivência dos passageiros.
Em seguida, percorra a lista um por um para ver quantos valores exclusivos cada recurso possui no conjunto de treinamento.
Se o número de valores únicos len (valores) de uma coluna-chave for inferior a 10, o código analisará ainda mais a relação entre esta coluna e a situação de sobrevivência.
(Estou um pouco confuso sobre por que key!= “Survived” é enfatizado. Não há valor de “Survived” nesta lista de chaves??)
Imprima-o e descubra se todos os quatro atributos atendem às condições:
Insira a descrição da imagem aqui

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

Nesta etapa, no conjunto de treinamento train_df, o código calcula a taxa média de sobrevivência da coluna 'Survived' correspondente a cada valor único na lista de chaves.
Insira a descrição da imagem aqui
Como pode ser visto na figura, o valor do dataframe key_target muda com o valor do atributo key em cada ciclo. Por exemplo, quando key = Pclass é processado, as chaves de key_target são 1, 2 e 3, e as chaves de key_target são 1, 2 e 3. valor é a taxa média de sobrevivência correspondente. Quando key = sex, as chaves de key_target são 'Female' e 'Male', e os valores também são as taxas médias de sobrevivência correspondentes.
As etapas subsequentes são um pouco complicadas.
Há um total de quatro atributos nas chaves. Um deles será utilizado para cada caso. Por fim, os dados dos quatro atributos serão armazenados em total_df, resumidos e retornados.
Este é o caso de PClass. PClass possui três valores: 1/2/3 A taxa média de sobrevivência é calculada para cada valor e armazenada em key_target.
Em seguida, a chave de key_target é retirada e armazenada na lista de chaves (sim, esta lista também é chamada de chaves..., mas neste momento os valores nela devem ser os três valores 1/ 2/3 de PClass), e o valor é armazenado na lista de destino (ou seja, os três números 0,629630, 0,472826, 0,242363) e, em seguida, nomeia artificialmente as duas colunas de chave e valor. , e a coluna de valor é mais personalizada e deve ser chamada de 'PClass_target'.
Insira a descrição da imagem aqui
Por analogia, os próximos três atributos key_target estão todos nesta rotina, mas a tabela total_df está em constante expansão.
Insira a descrição da imagem aqui
(masculino aqui a palavra está fora dos limites, a imagem foi cortada e uma peça separada foi adicionada posteriormente)
Até que finalmente total_df se torne uma tabela grande:
Insira a descrição da imagem aqui
Para ser sincero, para um caso Optuna cujo objetivo principal é ensinar as pessoas a usar a ferramenta de ajuste de parâmetros, a lógica escrita pelo autor original nesta etapa realmente aumentou a carga de compreensão para mim...
Pedi ao Kimi para reescrever este código em uma versão mais clara e simples, para que não seja fácil confundir tantas chaves e alvos que preenchem a tela:
Insira a descrição da imagem aqui
Esta parte não é o foco da etapa de ajuste de parâmetros. Se você realmente não entender, pode ignorá-la. ————————————————————————————————————————————————————————————
Use a média para preencher os valores ausentes. Marque as etapas comuns no processamento de dados que você aprendeu.
Insira a descrição da imagem aqui
Suplemento: quando fiz o curso de análise de dados e visualização do Tableau antes, o professor compartilhou uma postagem que introduzia especificamente muitos tipos de dados ausentes e métodos de processamento: https://towardsdatascience.com/all-about-missing-data-handling- b94b8b5d2184
Adicionar descrição do link
A postagem está em inglês e você precisa se cadastrar e fazer login para visualizá-la.
————————————————————————————————————————————
Depois de ter o conjunto de dados total_df com atributos cada vez mais abrangentes, ele é dividido novamente em conjunto de treinamento e conjunto de teste de acordo com o comprimento anterior.
Insira a descrição da imagem aqui
————————————————————————————————————————————
Insira a descrição da imagem aqui
É mencionado aqui que a proporção entre o conjunto de treinamento e o conjunto de teste é de 8:2, ou seja, 4:1, que é uma proporção de divisão muito comum.
O autor original provavelmente considerou teste e válido como a mesma coisa, portanto não houve distinção especial na nomenclatura.
Insira a descrição da imagem aqui
Mas, na verdade, esses dois conceitos não são exatamente iguais (mas vejo que às vezes a distinção não é estrita. Aqui eu uso um método de escrita unificado de test_X e test_y).
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
————————————————————————————————————————————
importarRegressor LGBT , embora o conjunto de dados do Titanic seja usado principalmente para problemas de classificação (prever se um passageiro sobreviverá), o autor original o trata aqui como um problema de regressão. Considerei que para iniciantes seria mais fácil começar escolhendo um tutorial com um conjunto de dados simples e familiar e uma explicação em vídeo, por isso não me preocupei com os detalhes dos problemas de regressão ou classificação. Depois de se tornar proficiente no processo, você poderá encontrar dados mais complexos e padronizados online para praticar.
Link de aprendizagem complementar: "Configuração do parâmetro LGBMRegressor parâmetro lgbmclassifier"
https://blog.51cto.com/u_12219/10333606
Adicionar descrição do link
(A propósito, não há um classificador LGBTM neste post? Por que o autor mencionou especificamente como lidar com problemas de regressão no vídeo?)
————————————————————————————————————————————
RMSE como função de perda, ou seja, um índice de avaliação, é uma função Python que calcula a raiz do erro quadrático médio (Root Mean Square Error).Quanto menor melhor
Insira a descrição da imagem aqui
————————————————————————————————————————————
Defina os parâmetros do objetivo da tarefa de acordo com a explicação do vídeo original do autor:
Para nomes de parâmetros específicos, significados e valores recomendados, consulte a postagem de aprendizagem complementar "LGBMRegressor Parameter Setting lgbmclassifier Parameter" acima.

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

————————————————————————————————————————————
Código chave: ligue para Optuna, crie uma tarefa de aprendizagem, especifique a perda mínima e defina o nome da tarefa:

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

Insira a descrição da imagem aqui
————————————————————————————————————————————
A ideia é boa, mas encontramos um erro estranho: fit() obteve um argumento de palavra-chave inesperado 'early_stopping_rounds':
Insira a descrição da imagem aqui
O método de Kimi ainda relatou um erro depois de tentar, então provavelmente não somos nós quem devemos assumir a culpa.Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
Os mestres do StackFlow fornecem duas soluções:
https://stackoverflow.com/questions/76895269/lgbmclassifier-fit-recebeu-um-argumento-de-palavra-chave-inesperado-parando-as-rodadas-precoces

portal
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
Observe que é melhor usar pip install, conda install parece não conseguir instalar.
Insira a descrição da imagem aqui
Mas descobri que não adiantava... Ainda recebi o mesmo erro, não reconheci early_stopping_rounds, e mesmo depois de excluí-lo, não reconheci o seguinte parâmetro detalhado...
Não é possível alterar os parâmetros conforme post complementar anterior Parece que a atualização das informações está atrasada...
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui

————————————————————————————————————————————
Durante o processo de pesquisa, também encontrei um ponto sujeito a erros: early_stopping_rounds parece ter apenas um limite máximo de 100.
https://blog.csdn.net/YangTinTin/article/details/120708391
portal
Insira a descrição da imagem aqui
————————————————————————————————————————————
Pesquisei manualmente na Internet e perguntei ao Kimi, mas ainda não encontrei uma alternativa muito eficaz. Como queremos principalmente experimentar o uso do Optuna, primeiro excluímos esses dois parâmetros problemáticos.

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

Código objetivo 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

Então você podeObterBest_TrialPegou:
Insira a descrição da imagem aqui
————————————————————————————————————————————
Da mesma forma, o UP original também usouxgboost e catboostMétodos semelhantes são usados ​​para encontrar os parâmetros ideais.
Não é difícil perceber que a principal diferença entre os três métodos diferentes é o parâmetro param selecionado e o método de função especificado pelo modelo.
XGBoost:
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
Resultados do XGBoost
Insira a descrição da imagem aqui
————————————————————————————————————————————
Aumento de gato:
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
Resultados do CatBoost:
Insira a descrição da imagem aqui
————————————————————————————————————————————
usado por últimoValidação cruzada K-foldObtenha os melhores resultados:
Validação cruzada também é um termo comumente usado em aprendizado de máquina.
Insira a descrição da imagem aqui

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

Insira a descrição da imagem aqui
Insira a descrição da imagem aquiInsira a descrição da imagem aqui

Insira a descrição da imagem aqui
kf é um objeto KFold, que é uma ferramenta da biblioteca scikit-learn para implementar a validação cruzada K-fold. O KFold divide o conjunto de dados emsubconjuntos n_splits, cada subconjuntoRevezem-se como um conjunto de validação, e o restante serve como conjunto de treinamento.
para train_index, valid_index em kf.split(x): Esta linha de código irá iterar sobre o objeto KFold, retornando dois arrays para cada iteração: train_index e valid_index.train_index contém o índice do ponto de dados usado para treinamento, enquanto valid_index contém o índice do ponto de dados usado para validação . De acordo com o índice do conjunto completo X, y, você pode obter os dados do conjunto de treinamento e do conjunto de verificação para cada vez. Esse processo é como interromper a turma inteira, selecionando aleatoriamente alguns alunos de cada vez e chamando um grupo de alunos.
————————————————————————————————————————————
Agora encontrei outro bug comum. Embora não saiba como isso aconteceu, não sei se Python deveria assumir a culpa novamente. (Como as formas dos conjuntos de dados X e Y eram exatamente as mesmas do autor antes, logicamente não haverá outras operações neles posteriormente...)
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
Não tenha medo se encontrar problemas, resolva-os! Você tem que confiar em Kimi nisso! (Aliás, os funcionários da empresa de inteligência artificial onde estou estagiando também usam Kimi, então Kimi é relativamente confiável e gratuito!!)
Insira a descrição da imagem aqui
Não se esqueça de desabilitar os parâmetros early_stopping_rounds e verbose ao mesmo tempo para evitar causar outro erro.
Insira a descrição da imagem aqui
Este trecho de código é relativamente longo e contém muitas repetições. Tenha cuidado para não cometer erros.

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

A saída intermediária entre mim e o autor original é um pouco diferente, não sei o que causa a lacuna:
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
Mas, felizmente, parece que os resultados não são tão ruins até agora:
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
————————————————————————————————————————————
Teste o desempenho de cada modelo no conjunto de testes:

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

Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
Observe a saída test_pred.shape. Não olhe para a forma quadrada do array.
Em Python, a forma de um array unidimensional é geralmente representada como (N,), onde N é o número total de elementos no array.
————————————————————————————————————————————
Conforme usado na frase test_pred=(test_pred &gt;= 0.5).astype(np.int64), há muitos exemplos de criação de uma nova coluna e comparação do tamanho para atribuir um valor Bool de True ou False. projeto:
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
————————————————————————————————————————————
Por fim, salve e grave no arquivo 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

Insira a descrição da imagem aqui
————————————————————————————————————————————
Enviarei meu pacote de código para a página inicial do CSDN. Amigos necessitados podem baixá-lo sozinhos.
Insira a descrição da imagem aqui
————————————————————————————————————————————
Outros conteúdos de aprendizagem relacionados:
(1) **9.1 Ajuste de parâmetros do modelo [Stanford 21 Fall: Practical Machine Learning Chinese Edition]: **O vídeo do professor Li Mu apresenta algumas teorias sobre ajuste de parâmetros. Se você não entende o ajuste de parâmetros, pode assisti-lo para aprender o. conhecimento básico. .
https://www.bilibili.com/video/BV1vQ4y1e7LF/?spm_id_from=333.788.recommend_more_video.1&vd_source=cdfd0a0810bcc0bcdbcf373dafdf6a82
portal
(dois) Esta ferramenta de ajuste automático de ginseng é simplesmente muito poderosa! Ele pode atender totalmente ao uso diário de aprendizado de máquina e ajuste de parâmetros de aprendizado profundo! Uma ferramenta indispensável para iniciantes!: O conteúdo do vídeo não é tão bom quanto o vídeo de demonstração que acompanhei. Ele fala principalmente sobre Optuna, sem nenhum caso prático.
https://www.bilibili.com/video/BV1Zs421K7Qj/?spm_id_from=333.788.recommend_more_video.6&vd_source=cdfd0a0810bcc0bcdbcf373dafdf6a82
portal
Porém, estou muito interessado no livro apresentado por este UP, pois para um novato como eu, que não tem experiência e gosta de encontrar regras, espero realmente ter um guia que possa me apresentar algumas fórmulas e orientações universais.