Como usar a saída do GridSearch?

23

Atualmente, estou trabalhando com o Python e o Scikit para fins de classificação e, lendo o GridSearch, achei que essa era uma ótima maneira de otimizar meus parâmetros do estimador para obter os melhores resultados.

Minha metodologia é esta:

  1. Dividir meus dados em treinamento / teste.
  2. Use o GridSearch com a validação 5Fold Cross para treinar e testar meus estimadores (floresta aleatória, aumento de gradiente, SVC entre outros) para obter os melhores estimadores com a combinação ideal de hiper parâmetros.
  3. Em seguida, calculo métricas em cada um dos meus estimadores, como Precisão, Rechamada, FMeasure e Coeficiente de Correlação de Matthews, usando meu conjunto de testes para prever as classificações e compará-las com os rótulos reais das classes.

É nesta fase que vejo comportamentos estranhos e não tenho certeza de como proceder. Pego o .best_estimator_ do GridSearch e o uso como o resultado 'ideal' da pesquisa na grade e realizo previsões usando esse estimador? Se fizer isso, acho que as métricas do estágio 3 são geralmente muito menores do que se eu simplesmente treinasse em todos os dados de treinamento e testasse no conjunto de testes. Ou simplesmente tomo o objeto GridSearchCV de saída como o novo estimador ? Se fizer isso, obtenho melhores pontuações nas métricas do estágio 3, mas parece estranho usar um objeto GridSearchCV em vez do classificador pretendido (por exemplo, uma floresta aleatória) ...

Edição: Então, minha pergunta é qual é a diferença entre o objeto GridSearchCV retornado e o atributo .best_estimator_? Qual delas devo usar para calcular outras métricas? Posso usar esta saída como um classificador comum (por exemplo, usando o Forecast) ou como devo usá-la?

Dan Carter
fonte

Respostas:

27

Decidi ir embora e encontrar as respostas que satisfizessem minha pergunta e escrevê-las aqui para qualquer um que se perguntar.

O atributo .best_estimator_ é uma instância do tipo de modelo especificado, que possui a 'melhor' combinação de parâmetros fornecidos no param_grid. A utilidade ou não dessa instância depende se o parâmetro refit está definido como True (por padrão). Por exemplo:

clf = GridSearchCV(estimator=RandomForestClassifier(), 
                    param_grid=parameter_candidates,
                    cv=5,
                    refit=True,
                    error_score=0,
                    n_jobs=-1)

clf.fit(training_set, training_classifications)
optimised_random_forest = clf.best_estimator_
return optimised_random_forest

Retornará um RandomForestClassifier. Tudo isso fica bem claro na documentação . O que não está claro na documentação é por que a maioria dos exemplos não usa especificamente o .best_estimator_ e, em vez disso, faz o seguinte:

clf = GridSearchCV(estimator=RandomForestClassifier(), 
                    param_grid=parameter_candidates,
                    cv=5,
                    refit=True,
                    error_score=0,
                    n_jobs=-1)

clf.fit(training_set, training_classifications)
return clf

Essa segunda abordagem retorna uma instância GridSearchCV, com todos os sinos e assobios do GridSearchCV, como .best_estimator_, .best_params, etc., que por si só podem ser usados ​​como um classificador treinado porque:

Optimised Random Forest Accuracy:  0.916970802919708
[[139  47]
 [ 44 866]]
GridSearchCV Accuracy:  0.916970802919708
[[139  47]
 [ 44 866]]

Ele apenas usa a mesma melhor instância de estimador ao fazer previsões. Portanto, na prática, não há diferença entre esses dois, a menos que você queira especificamente apenas a instância do estimador. Como observação lateral, minhas diferenças nas métricas não estavam relacionadas e se resumiam a uma função de ponderação de classe de buggy.

Dan Carter
fonte
Obrigado pelo seu post @Dan, é muito útil. Eu queria pedir um esclarecimento. Neste último caso, se eu tiver refit=False, clf.fitnão será feito com o melhor classificador?
Poete Maudit 28/09
@PoeteMaudit O parâmetro refit diz à função GridSearchCV para pegar os melhores parâmetros encontrados e treinar novamente o modelo usando esses parâmetros em todo o conjunto de dados. Se refit = False, o best_estimator não estará disponível, de acordo com a documentação: scikit-learn.org/stable/modules/generated/…
Dan Carter
0

O GridSearchCV permite combinar um estimador com um preâmbulo de pesquisa em grade para ajustar os hiper-parâmetros. O método seleciona o parâmetro ideal na pesquisa em grade e o utiliza com o estimador selecionado pelo usuário. O GridSearchCV herda os métodos do classificador; portanto, você pode usar os métodos .score, .predict, etc. diretamente através da interface GridSearchCV. Se você deseja extrair os melhores hiperparâmetros identificados pela pesquisa em grade, pode usar .best_params_ e isso retornará o melhor hiperparâmetro. Você pode passar esse hiperparâmetro para seu estimador separadamente.

Usar .predict diretamente produzirá os mesmos resultados que obter o melhor hiperparâmetro através de .best_param_ e depois usá-lo em seu modelo. Ao entender o funcionamento sublinhado da pesquisa em grade, podemos ver por que esse é o caso.


Pesquisa em grade

Essa técnica é usada para encontrar os parâmetros ideais para usar com um algoritmo. NÃO são os pesos ou o modelo, são aprendidos usando os dados. Isso é obviamente bastante confuso, então vou distinguir entre esses parâmetros, chamando um hiperparâmetros.

Hiper-parâmetros são como k em k-vizinhos mais próximos (k-NN). O k-NN exige que o usuário selecione qual vizinho considerar ao calcular a distância. O algoritmo então ajusta um parâmetro, um limite, para ver se um exemplo novo se enquadra na distribuição aprendida, isso é feito com os dados.

Como escolhemos k?

Algumas pessoas simplesmente seguem recomendações baseadas em estudos anteriores do tipo de dados. Outros usam a pesquisa em grade. Esse método poderá determinar melhor qual k é o ideal para usar nos seus dados.

Como funciona?

Primeiro você precisa construir uma grade. Esse é essencialmente um conjunto de valores possíveis que seu hiperparâmetro pode assumir. Para o nosso caso, podemos usar . Em seguida, você treinará seu modelo k-NN para cada valor na grade. Primeiro você faria 1-NN, depois 2-NN, e assim por diante. Para cada iteração, você obterá uma pontuação de desempenho que informará o desempenho do seu algoritmo usando esse valor para o hiperparâmetro. Depois de percorrer toda a grade, você selecionará o valor que deu o melhor desempenho.[1,2,3,...,10]

Isso vai contra os princípios de não usar dados de teste !!

Você estaria absolutamente certo. Essa é a razão pela qual a pesquisa na grade geralmente é misturada à validação cruzada. Assim, mantemos os dados do teste completamente separados até estarmos realmente satisfeitos com nossos resultados e prontos para o teste. validação cruzada vezes pega um conjunto de treinamento e o separa em partes. Em seguida, treina nas dobras e testa na dobra que foi deixada de fora. Para cada valor na grade, o algoritmo será treinado novamente vezes, deixando cada dobra de fora. Em seguida, é calculada a média do desempenho em cada dobra e esse é o desempenho alcançado para esse valor de hiperparâmetro.n n - 1 nnnn1n

O valor do hiperparâmetro selecionado é aquele que atinge o desempenho médio mais alto nas dobras em n. Quando estiver satisfeito com seu algoritmo, você poderá testá-lo no conjunto de testes. Se você for direto para o conjunto de testes, estará arriscando se adaptar demais.

JahKnows
fonte
Oi Jah, esta é uma boa resposta, mas ainda não sou o mais sábio quanto à resposta da minha pergunta. Atualizei o título da pergunta e a própria pergunta para tentar tornar as coisas mais claras.
Dan Carter
Escreva sua própria pesquisa na grade. É literalmente criar uma matriz e adicionar um loop for em torno do seu modelo. Em seguida, no final do seu loop for, grave o desempenho resultante em uma matriz. Depois de passar por todos os valores possíveis em sua grade, observe as matrizes de performances e escolha a melhor. Esse é o valor ideal para seu hiperparâmetro. Confiar nas funções internas para o básico não é altamente recomendado para a ciência de dados. Os dados variam muito e o melhor para você ter controle!
JahKnows
Seria uma boa sugestão se eu tivesse apenas um hiperparâmetro para otimizar, mas se eu tivesse 4? 5? Um loop aninhado 4/5 vezes é feio e não vejo necessidade de reinventar a roda aqui, isso seria uma perda de tempo, e é por isso que pacotes como esse existem.
Dan Carter
GridSearchCV permite combinar um estimador com a configuração GridSearchCV. Então, faz exatamente o que acabamos de discutir. Ele escolhe o parâmetro ideal e o usa com o estimador selecionado. O GridSearchCV herda os métodos do classificador; portanto, você pode usar os métodos .score, .predict, etc. diretamente através da interface GridSearchCV. Eu não recomendo fazer isso, no entanto, ferramentas mais fáceis significa menos controle. Para algo tão simples como uma pesquisa em grade, basta codificá-lo.
precisa saber é o seguinte
1
Esta resposta não aborda a questão, que é sobre o uso do GridSearchCV.
Hobbes