Aprendizado de máquina e redes neurais - página 74

 

13.1 As Diferentes Categorias de Seleção de Recursos (L13: Seleção de Recursos)


13.1 As Diferentes Categorias de Seleção de Recursos (L13: Seleção de Recursos)

No vídeo anterior, exploramos o conceito de seleção de recursos como uma subcategoria de redução de dimensionalidade. A seleção de recursos envolve a seleção de subconjuntos de recursos de um conjunto de dados para melhorar o desempenho dos modelos de aprendizado de máquina. Discutimos várias motivações para a seleção de recursos, como melhorar o desempenho preditivo e a eficiência computacional, otimizar o espaço de armazenamento e obter informações sobre os dados.

Agora, vamos nos aprofundar nas diferentes categorias de algoritmos de seleção de recursos: métodos de filtro, métodos incorporados e métodos wrapper. Os métodos de filtro concentram-se nas propriedades intrínsecas dos próprios recursos e não envolvem um modelo ou classificador. Eles analisam recursos com base em suas características individuais, como variância ou correlações pareadas. Por exemplo, calcular a variância de um recurso ajuda a determinar sua utilidade para distinguir entre diferentes exemplos de treinamento. Se os valores do recurso estiverem espalhados pelo eixo, isso indica sua importância. Por outro lado, características altamente correlacionadas sugerem redundância, e uma delas pode ser eliminada sem perda de muita informação. Os métodos de filtro geralmente são chamados de estatísticas univariadas ou bivariadas, pois analisam variáveis simples ou pares.

Os métodos embutidos, como o nome indica, incorporam a seleção de recursos dentro do algoritmo de aprendizado. Esses métodos estão inseridos no processo de otimização do modelo e visam otimizar a função objetivo. Um exemplo são as árvores de decisão, nas quais os recursos são selecionados internamente durante o crescimento da árvore. A árvore de decisão escolhe a característica que maximiza o ganho de informação em cada divisão, resultando na seleção de características importantes. Recursos não utilizados na árvore de decisão final podem ser considerados menos importantes.

Os métodos wrapper estão estreitamente alinhados com o objetivo de otimizar o desempenho preditivo. Esses métodos envolvem ajustar um modelo a diferentes subconjuntos de recursos e selecionar ou eliminar recursos com base no desempenho do modelo. Ao comparar o desempenho de modelos treinados em diferentes subconjuntos de recursos, podemos determinar a importância de cada recurso. Por exemplo, se a remoção de um recurso levar a uma queda significativa na precisão, isso sugere que o recurso é importante para o desempenho do modelo. Os métodos wrapper fornecem informações valiosas sobre a importância do recurso usando diretamente a precisão do modelo.

Embora os métodos wrapper ofereçam uma seleção precisa de recursos, eles podem ser computacionalmente caros, especialmente ao lidar com grandes conjuntos de recursos. O processo de ajustar modelos a diferentes subconjuntos e avaliar seu desempenho pode ser demorado. Por outro lado, os métodos de filtro são computacionalmente mais eficientes, mas podem não fornecer resultados tão precisos quanto os métodos wrapper. O compromisso entre precisão e eficiência computacional é uma consideração crucial na seleção de recursos.

Nos próximos vídeos, vamos nos aprofundar em cada categoria de algoritmos de seleção de recursos. Exploraremos os métodos de filtro com mais detalhes, seguidos pelos métodos incorporados e pelos métodos wrapper. Ao entender essas técnicas, podemos obter uma compreensão abrangente da seleção de recursos e como ela pode ser aplicada para melhorar os modelos de aprendizado de máquina.

Fique ligado no próximo vídeo, onde discutiremos os métodos de filtro em profundidade.

13.1 The Different Categories of Feature Selection (L13: Feature Selection)
13.1 The Different Categories of Feature Selection (L13: Feature Selection)
  • 2021.12.09
  • www.youtube.com
In this video, I am introducing the three main categories of feature selection: filter methods, embedded methods, and wrapper methods.Slides: https://sebasti...
 

13.2 Métodos de filtro para seleção de recursos -- Limite de variação (L13: Seleção de recursos)


13.2 Métodos de filtro para seleção de recursos -- Limite de variação (L13: Seleção de recursos)

Sim, no vídeo anterior, discutimos as três categorias diferentes de seleção de recursos: métodos de filtro, métodos incorporados e métodos wrapper. Agora, vamos nos aprofundar em uma das categorias, os métodos de filtro. Nos próximos vídeos, também exploraremos os métodos incorporados e os métodos wrapper. No entanto, por enquanto, vamos nos concentrar nos métodos de filtro como o tópico principal.

Os métodos de filtro são técnicas de seleção de recursos que consideram principalmente as propriedades intrínsecas dos próprios recursos. Eles não dependem de um modelo específico para seleção de recursos. Um exemplo de um método de filtro é o limite de variação. Vamos dar uma olhada mais de perto em como o limite de variação funciona.

Ao usar um limite de variação para seleção de recursos, calculamos a variação de cada recurso. A suposição é que os recursos com variações mais altas podem conter informações mais úteis para treinar um classificador ou modelo de regressão. Mas por que isso é verdade? Para entender isso, vamos considerar um recurso chamado X1. Do lado esquerdo, temos uma feição com alta variância, e os valores das feições estão bem espalhados. No lado direito, temos uma feição com baixa variância, e os valores da feição são menos dispersos. Uma variância maior nos permite reconstruir os limites de decisão com base nesse recurso. Isso é crucial para fazer previsões precisas. Mesmo no pior cenário em que as classes se sobrepõem, recursos bem distribuídos ainda podem ajudar a construir limites de decisão.

Para ilustrar melhor esse conceito, vamos considerar um caso de classificação binária. Suponha que temos duas classes, classe quadrado e classe estrela. Na melhor das hipóteses, todos os pontos de dados de uma classe estão de um lado e todos os pontos de dados da outra classe estão do outro lado. Isso facilita a construção de um limite de decisão que separa perfeitamente as classes. No entanto, em cenários do mundo real, a separação perfeita nem sempre é alcançável. Mesmo quando as classes se sobrepõem, um recurso com alta variância ainda pode ajudar na construção de limites de decisão. Por exemplo, uma árvore de decisão pode classificar pontos de dados com precisão com base em recursos bem distribuídos, conforme demonstrado no exemplo de codificação.

Agora que entendemos a importância da variância, vamos discutir como podemos usá-la como uma medida para a seleção de recursos. A variância de uma variável aleatória discreta pode ser calculada usando uma fórmula específica, mas, na prática, geralmente trabalhamos com conjuntos de dados nos quais não conhecemos a distribuição de probabilidade. Portanto, assumimos pesos uniformes e calculamos a variância com base nos pontos de dados observados. Por exemplo, ao lidar com recursos categóricos, executamos codificação one-hot para criar variáveis binárias. Nesse caso, a variância de uma variável de Bernoulli pode ser calculada como p * (1 - p), onde p é a probabilidade de observar um valor de 1. Esse cálculo de variância é particularmente útil para seleção de recursos em cenários de recursos categóricos.

Para implementar a seleção de recursos baseada em variação, o Scikit-learn fornece a classe VarianceThreshold. Essa classe nos permite remover recursos com variações baixas. Ao especificar um limite de variação, podemos eliminar as colunas de recursos em que uma determinada porcentagem dos rótulos é a mesma. Por exemplo, se quisermos remover recursos em que mais de 80% dos rótulos são semelhantes, podemos definir o limite de variação para 0,16 (calculado como 0,8 * (1 - 0,8)). Esse limite garante que recursos com pouco poder discriminatório sejam descartados.

Em resumo, os métodos de filtro, como o limite de variação, são valiosos para a seleção de recursos porque consideram as propriedades intrínsecas dos recursos. Ao analisar a variância dos recursos, podemos identificar e remover aqueles que fornecem informações limitadas para tarefas de classificação ou regressão.

13.2 Filter Methods for Feature Selection -- Variance Threshold (L13: Feature Selection)
13.2 Filter Methods for Feature Selection -- Variance Threshold (L13: Feature Selection)
  • 2021.12.10
  • www.youtube.com
Sorry, I had some issues with the microphone (a too aggressive filter to remove background noise). Should be better in the next vids!Description: This video ...
 

13.3.1 Regressão Logística Regularizada L1 como Seleção de Recursos Incorporados (L13: Seleção de Recursos)


13.3.1 Regressão Logística Regularizada L1 como Seleção de Recursos Incorporados (L13: Seleção de Recursos)

No vídeo anterior, discutimos diferentes métodos para seleção de recursos, focando especificamente em métodos de filtro baseados nas propriedades dos recursos. Agora, vamos nos aprofundar em duas categorias diferentes de seleção de recursos: métodos incorporados e métodos wrapper. Ambas as categorias envolvem o uso de um modelo, como um classificador, para seleção de recursos. Neste vídeo, vamos nos concentrar em métodos incorporados, em que a seleção de recursos ocorre implicitamente como parte do treinamento do modelo ou do processo de otimização.

Os métodos incorporados integram a seleção de recursos no processo de treinamento do modelo. Exploraremos esse conceito no contexto da regressão logística L1 regularizada, também conhecida como regressão Lasso. Antes de prosseguirmos, é importante observar que este vídeo pressupõe familiaridade básica com a regressão logística. No entanto, abordaremos apenas os conceitos essenciais para evitar que nos desviemos demais.

Vamos começar considerando um modelo de regressão logística binária com duas classes, usando o conjunto de dados Iris com duas características: comprimento da pétala e largura da pétala. A regressão logística produz um limite de decisão linear para separar as duas classes. O limite de decisão é determinado pela aplicação de um limite à soma ponderada das entradas, que passam por uma transformação não linear.

Para entender melhor a regressão logística, vamos examinar uma representação gráfica do modelo. Neste diagrama, temos os pesos (w) no lado esquerdo, com w1 e w2 representando os pesos para os dois recursos. Além disso, temos a unidade de viés (B) atuando como um termo de interceptação. A soma ponderada é calculada como a soma do produto de cada peso e sua característica correspondente, mais o termo de viés. Essa soma ponderada é então passada por uma função sigmoidal, também conhecida como sigmóide logístico, que gera um valor entre 0 e 1. Esse valor representa a probabilidade de associação à classe, indicando a probabilidade de um ponto de dados pertencer à classe 1, dadas as características observadas . Ao aplicar um limite (normalmente 0,5), podemos fazer previsões binárias, classificando o ponto de dados como classe 0 ou classe 1.

Agora que temos uma compreensão básica da regressão logística, vamos nos concentrar na regressão logística L1 regularizada. O aspecto chave da regularização L1 é a inclusão de um termo norma L1, que mede a magnitude dos pesos. Este termo é adicionado à função de perda, penalizando efetivamente modelos complexos com grandes pesos. Na regressão logística, pretendemos minimizar a função de perda e, ao mesmo tempo, minimizar os pesos.

Para visualizar isso, imagine linhas de contorno representando a função de perda. Os contornos externos correspondem a grandes valores de perdas, enquanto os contornos mais próximos do centro representam valores de perdas menores. O mínimo global da função perda sem regularização ocorre no centro, indicando os pesos ótimos para minimizar a perda. No entanto, o termo de penalidade L1 prefere pesos menores e incentiva a simplicidade. Ao introduzir esse termo de penalidade, buscamos um equilíbrio entre minimizar a perda e minimizar a penalidade. Notavelmente, a regressão logística L1 regularizada tende a produzir pesos esparsos, com alguns pesos sendo exatamente zero. Esse aspecto de seleção de recurso é o que torna a regularização de L1 atraente.

Para demonstrar a regressão logística L1 regularizada na prática, usaremos o conjunto de dados wine. Este conjunto de dados contém 13 características diferentes relacionadas a várias características do vinho, e a tarefa é classificar os vinhos em diferentes tipos. Começamos dividindo os dados em conjuntos de treinamento e teste, uma prática comum em aprendizado de máquina.

Observe que os exemplos de código detalhados e mais explicações podem ser encontrados no notebook que acompanha este vídeo, que será fornecido abaixo.

Agora vamos passar para a parte de seleção de recursos usando a abordagem de regularização L1, também conhecida como Lasso. Usaremos o modelo Logistic Regression do scikit-learn, que nos permite aplicar a penalidade de regularização L1.

 from sklearn.linear_model import LogisticRegression

# Create a Logistic Regression model with L1 regularization
model = LogisticRegression(penalty= 'l1' , solver= 'liblinear' )

# Fit the model on the training data
model.fit(X_train, y_train)

Ao definir o parâmetro de penalidade como 'l1', especificamos que queremos usar a regularização L1. O parâmetro do solucionador é definido como 'liblinear', o que é adequado para pequenos conjuntos de dados como aquele com o qual estamos trabalhando.

Após ajustar o modelo aos dados de treinamento, podemos acessar os coeficientes aprendidos, que representam os pesos atribuídos a cada característica. Vamos imprimir os coeficientes:

# Get the learned coefficients
coefficients = model.coef_

# Print the coefficients
for i, coef in enumerate(coefficients[ 0 ]):
    print(f 'Feature {i+1}: {coef:.4f}' )
O atributo coef_ do modelo contém os coeficientes. Nós iteramos sobre os coeficientes e os imprimimos, associando cada coeficiente com seu recurso correspondente.

Em seguida, podemos identificar os recursos que possuem coeficientes diferentes de zero, pois esses são os recursos selecionados. Vamos encontrar os recursos selecionados e imprimi-los:

# Find the indices of non-zero coefficients
selected_features = [i for i, coef in enumerate(coefficients[ 0 ]) if coef != 0 ]

# Print the selected features
print( 'Selected features:' )
for feature in selected_features:
    print(f 'Feature {feature+1}' )
Nós iteramos sobre os coeficientes novamente, desta vez armazenando os índices dos coeficientes diferentes de zero na lista selected_features. Por fim, imprimimos as características selecionadas.

Aplicando a regularização L1, o modelo de Regressão Logística executa implicitamente a seleção de recursos levando alguns coeficientes a zero. As feições com coeficientes diferentes de zero são consideradas importantes para as previsões do modelo.

É importante observar que a escolha do parâmetro de regularização C influencia no grau de regularização aplicado. Um valor C menor resulta em uma regularização mais forte, levando potencialmente a mais recursos com coeficientes zero.

Agora você tem uma compreensão do método de seleção de recursos incorporados usando a regularização L1 na regressão logística. No próximo vídeo, exploraremos a seleção de recursos com árvores de decisão e florestas aleatórias.

No próximo vídeo, exploraremos a seleção de recursos usando árvores de decisão e florestas aleatórias. Esses métodos são conhecidos como métodos de ensemble e podem ser usados para problemas de classificação e regressão.

As árvores de decisão são modelos simples, mas poderosos, que fazem previsões particionando o espaço de recursos em regiões e atribuindo um rótulo a cada região. As florestas aleatórias, por outro lado, são um conjunto de árvores de decisão em que cada árvore é treinada em um subconjunto aleatório de dados e recursos.

Vamos começar usando o Random Forest Classifier do scikit-learn para seleção de recursos:

 from sklearn.ensemble import RandomForestClassifier

# Create a Random Forest Classifier
model = RandomForestClassifier()

# Fit the model on the training data
model.fit(X_train, y_train)

Depois de ajustar o modelo aos dados de treinamento, podemos acessar as importâncias dos recursos, que representam a importância relativa de cada recurso nas previsões do modelo. Vamos imprimir as importâncias dos recursos:

# Get the feature importances
importances = model.feature_importances_

# Print the feature importances
for i, importance in enumerate(importances):
    print(f 'Feature {i+1}: {importance:.4f}' )
O atributo feature_importances_ do modelo contém as importâncias do recurso. Nós iteramos sobre as importâncias e as imprimimos, associando cada importância com sua característica correspondente.

Em seguida, podemos classificar os recursos com base em suas importâncias e selecionar os k principais recursos. Vamos encontrar os k principais recursos e imprimi-los:

# Rank the features based on importances
feature_ranks = sorted(range(len(importances)), key=lambda i: importances[i], reverse=True)

# Select the top k features
k = 5   # Number of top features to select
top_features = feature_ranks[:k]

# Print the top features
print(f 'Top {k} features:' )
for feature in top_features:
    print(f 'Feature {feature+1}' )

Classificamos os índices dos recursos com base em suas importâncias, em ordem decrescente. Em seguida, selecionamos os k principais recursos dividindo a lista feature_ranks. Por fim, imprimimos os principais recursos.

As florestas aleatórias consideram a contribuição média de cada recurso em todas as árvores de decisão do conjunto. Quanto maior a importância, mais influente é o recurso em fazer previsões.

Dessa forma, as florestas aleatórias fornecem uma maneira direta de executar a seleção de recursos com base nas pontuações de importância.

Agora você tem uma compreensão da seleção de recursos usando árvores de decisão e florestas aleatórias. No próximo vídeo, abordaremos o método de eliminação de recursos recursivos.

13.3.1 L1-regularized Logistic Regression as Embedded Feature Selection (L13: Feature Selection)
13.3.1 L1-regularized Logistic Regression as Embedded Feature Selection (L13: Feature Selection)
  • 2021.12.13
  • www.youtube.com
Without going into the nitty-gritty details behind logistic regression, this lecture explains how/why we can consider an L1 penalty --- a modification of the...
 

13.3.2 Árvores de Decisão e Importância de Recursos de Floresta Aleatória (L13: Seleção de Recursos)


13.3.2 Árvores de Decisão e Importância de Recursos de Floresta Aleatória (L13: Seleção de Recursos)

Saudações, telespectadores! Em nosso vídeo anterior, começamos nossa discussão sobre métodos embutidos para seleção de recursos, focando em um exemplo de regressão logística regularizada. Hoje, vamos nos aprofundar em outro exemplo de métodos embutidos, ou seja, árvores de decisão, e examinar como eles selecionam recursos em cada nó. Também exploraremos sua relação com a importância do recurso de floresta aleatória, um conceito com o qual você já deve estar familiarizado. Então, vamos direto ao assunto!

Mas antes de prosseguirmos, tenho um pequeno anúncio a fazer. Infelizmente, meu lápis ou caneta do iPad não funciona mais, então mudei para um tablet com caneta. No entanto, devo admitir que foi um pouco mais difícil de se acostumar do que eu esperava. Pode levar mais alguns vídeos para me tornar realmente confortável e proficiente com ele. Além disso, estou experimentando um novo software de anotação de tela, portanto, tenha paciência se houver algum problema. Espero que o processo de anotação se torne mais suave nos próximos vídeos. Agora, vamos nos concentrar novamente em nosso tópico.

Para recapitular, a seleção de recursos pode ser amplamente categorizada em três métodos principais: métodos de filtro, métodos de wrapper e métodos incorporados. Em nosso vídeo anterior, exploramos a regressão logística Lasso ou L1 regularizada como um exemplo de métodos incorporados. Hoje, voltamos nossa atenção para árvores de decisão e florestas aleatórias.

Primeiro, vamos discutir as árvores de decisão e como elas executam a seleção de recursos. Para ilustrar isso, vamos considerar um conjunto de dados que examinamos anteriormente. Consiste em dois recursos, x1 e x2, e duas classes: quadrados (classe 0) e triângulos (classe 1). Nosso objetivo é classificar os pontos de dados e podemos visualizar o limite de decisão como uma linha divisória que separa as duas classes. Múltiplos limites de decisão podem alcançar isso, como demonstrarei em breve.

Agora, vamos dar uma olhada em como uma árvore de decisão divide o conjunto de dados. Eu treinei uma árvore de decisão usando o scikit-learn e a tracei para você. Esta árvore apresenta duas divisões. A primeira divisão ocorre no recurso x1 em um valor de corte de 5,5, dividindo os dados em dois grupos. A segunda divisão ocorre no recurso x2 em um valor de corte de 10,5, particionando ainda mais os dados. Ao fazer essas divisões, a árvore de decisão classifica o conjunto de dados com sucesso. Podemos avaliar a eficácia dessas divisões examinando a entropia, que indica o nível de mistura ou desordem nas classes. Nosso objetivo é reduzir a entropia o máximo possível, atingindo idealmente um valor de zero, o que significa classificação perfeita. Em nosso exemplo, observamos que a entropia diminui a cada divisão, eventualmente chegando a zero.

O que é intrigante observar é que as árvores de decisão executam inerentemente a seleção de recursos. Em cada nó, a árvore decide qual recurso usar para a divisão. Essa decisão é baseada na característica que maximiza a diminuição da entropia ou maximiza o ganho de informação. Consequentemente, a árvore de decisão seleciona automaticamente as características mais informativas para construir o modelo de classificação.

Agora, vamos mudar nosso foco para florestas aleatórias, que são conjuntos de árvores de decisão. Florestas aleatórias fornecem um meio para estimar a importância do recurso. Para demonstrar isso, vamos ao conjunto de dados do vinho, que compreende 13 características diferentes relacionadas a várias características do vinho, como teor alcoólico, ácido málico, cinzas e muito mais. No lado direito, você pode ver um gráfico de importância de recurso gerado pela floresta aleatória. As importâncias dos recursos variam de 0 a 1 e somam até 1, representando a importância relativa de cada recurso. O gráfico é classificado em ordem decrescente, com o recurso mais importante à esquerda.

Para gerar esse gráfico, utilizei o atributo feature_importances_ do scikit-learn, que calcula as importâncias dos recursos com base no modelo de floresta aleatória. Como você pode observar, a característica mais importante neste conjunto de dados é a prolina, seguida pelos flavonoides e pela intensidade da cor.

Os valores de importância do recurso são determinados medindo a redução total na impureza (geralmente medida pela impureza ou entropia de Gini) alcançada por divisões em cada recurso em todas as árvores de decisão na floresta aleatória. As características que consistentemente levam a uma maior redução na impureza são consideradas mais importantes.

É importante observar que a importância do recurso é uma medida relativa dentro do contexto do modelo de floresta aleatória. Os valores são específicos da floresta aleatória que você treinou e não podem ser generalizados para outros modelos ou conjuntos de dados. No entanto, ainda pode fornecer informações valiosas sobre quais recursos são mais influentes nas previsões.

Agora que abordamos árvores de decisão e florestas aleatórias, vamos resumir o que aprendemos até agora. As árvores de decisão realizam a seleção de recursos implicitamente, selecionando o recurso mais informativo em cada divisão, com o objetivo de diminuir a entropia e melhorar a classificação. Por outro lado, as florestas aleatórias, como um conjunto de árvores de decisão, fornecem uma medida da importância do recurso avaliando a redução total de impurezas alcançada por cada recurso em todas as árvores.

Compreender a importância do recurso pode ser benéfico de várias maneiras. Ele ajuda a identificar os recursos mais relevantes para prever a variável de destino, permite a redução de dimensionalidade, concentrando-se nos recursos mais informativos e fornece insights sobre as relações subjacentes entre os recursos e a variável de destino.

Agora, vamos nos aprofundar no processo de avaliação da importância de recursos em florestas aleatórias. Exploraremos um método chamado importância da permutação. Mas antes de fazermos isso, vamos revisitar brevemente a amostragem bootstrap e o conceito de amostras out-of-bag.

A amostragem de bootstrap envolve amostragem aleatória do conjunto de dados original com substituição, resultando em pontos de dados duplicados. Como resultado, alguns exemplos não são incluídos na amostra bootstrap, criando o que chamamos de amostras out-of-bag. Essas amostras servem como conjuntos de validação ou avaliação, pois as árvores não as veem durante o treinamento.

Agora, vamos nos concentrar no método B, que é a importância da permutação. Ele utiliza as amostras prontas para uso que discutimos anteriormente. Em primeiro lugar, podemos avaliar o desempenho preditivo das árvores de decisão na floresta aleatória durante o treinamento. Para cada árvore, as previsões podem ser feitas para as amostras fora do saco, que atuam como validação ou pontos de dados de teste exclusivos para essa árvore.

Para calcular a importância da permutação, começamos com uma matriz de recursos contendo os valores de recursos originais para os exemplos prontos. Para cada árvore de decisão na floresta aleatória, permutamos os valores do recurso J nos exemplos fora do saco. Isso significa que embaralhamos aleatoriamente os valores dos recursos, mantendo os rótulos das classes inalterados.

Em seguida, usamos a matriz de recursos permutados para fazer previsões sobre os exemplos fora do saco usando a árvore de decisão atual. Lembre-se, essas previsões são baseadas nos valores de recursos permutados, portanto, eles representam o desempenho do modelo quando o recurso J é aleatório.

Comparamos as previsões permutadas com as previsões originais para cada exemplo pronto para uso e contamos quantas vezes a previsão de classe correta muda devido à permutação do recurso J. Essa contagem reflete o impacto do recurso J na precisão do modelo. Se o recurso J for importante, a permuta de seus valores deve levar a uma diminuição significativa na precisão da previsão.

Repetimos esse processo para cada recurso no conjunto de dados, calculando o impacto de cada recurso na precisão do modelo. Quanto mais a permutação de um recurso afeta as previsões, mais importante ela é considerada.

Para quantificar a importância do recurso, calculamos a diminuição na precisão causada pela permuta de cada recurso. Isso é feito subtraindo a precisão permutada da precisão original e calculando a média dessa diferença sobre todas as árvores de decisão na floresta aleatória.

Por fim, normalizamos os valores de importância dos recursos para que eles somem um, fornecendo uma medida relativa de importância entre os recursos. Essa normalização garante que os valores de importância sejam comparáveis e interpretáveis.

No entanto, é essencial estar ciente de que o método de importância de permutação tem algumas limitações e considerações.

Em primeiro lugar, a importância da permutação pode subestimar a importância dos recursos correlacionados. Ao permutar um recurso, pode levar a alterações nas previsões de outros recursos correlacionados. Como resultado, a importância desses recursos correlacionados pode não ser refletida com precisão no gráfico de importância do recurso. É importante considerar a correlação entre os recursos ao interpretar sua importância.

Em segundo lugar, a importância da permutação assume que a importância do recurso é baseada exclusivamente na precisão preditiva do modelo. Embora a precisão preditiva seja um fator crucial, ela pode não capturar todos os aspectos da importância do recurso. Pode haver outras dimensões de importância, como a interpretabilidade ou a relevância do conhecimento de domínio de um recurso.

Apesar dessas limitações, a importância da permutação fornece uma medida quantitativa valiosa da importância do recurso. Ele permite que pesquisadores e profissionais entendam quais recursos têm mais influência nas previsões do modelo e podem orientar decisões relacionadas à seleção de recursos, interpretação do modelo e redução de dimensionalidade.

No próximo vídeo, exploraremos outra categoria de métodos de seleção de recursos chamados métodos wrapper. Os métodos wrapper envolvem a avaliação de diferentes subconjuntos de recursos usando um modelo de aprendizado de máquina específico. Vamos nos aprofundar na eliminação recursiva de recursos e na seleção de recursos para frente/para trás. Esses métodos podem ser particularmente úteis quando o número de recursos é grande e selecionar o subconjunto mais relevante torna-se crucial para o desempenho do modelo.

Para recapitular, abordamos métodos incorporados, especificamente árvores de decisão e florestas aleatórias, como técnicas para seleção de recursos. As árvores de decisão realizam a seleção de recursos implicitamente, selecionando o recurso mais informativo em cada divisão, com o objetivo de diminuir a entropia e melhorar a classificação. Florestas aleatórias, como um conjunto de árvores de decisão, fornecem uma medida da importância do recurso avaliando a redução total de impureza alcançada por cada recurso em todas as árvores. Também discutimos o método de importância de permutação, que quantifica a importância de recursos permutando valores de recursos e medindo seu impacto na precisão do modelo.

Compreender a importância do recurso capacita cientistas de dados e profissionais a tomar decisões informadas sobre a seleção de recursos, interpretar modelos e obter insights sobre as relações subjacentes entre os recursos e a variável de destino. É uma ferramenta valiosa no kit de ferramentas de aprendizado de máquina que pode contribuir para um melhor desempenho e compreensão do modelo.

Em nossos vídeos anteriores, cobrimos diferentes métodos para seleção de recursos, incluindo métodos de filtro, métodos wrapper e métodos incorporados. Neste vídeo, vamos nos concentrar nos métodos wrapper, especificamente na eliminação de recursos recursivos (RFE) e na seleção de recursos para frente/para trás.

Os métodos wrapper são técnicas de seleção de recursos que envolvem a avaliação de diferentes subconjuntos de recursos usando um modelo de aprendizado de máquina específico. Ao contrário dos métodos de filtro, que dependem de medidas estatísticas, e dos métodos incorporados, que integram a seleção de recursos no processo de treinamento do modelo, os métodos wrapper usam o desempenho de um modelo como critério para selecionar os recursos.

Vamos começar discutindo a eliminação de recursos recursivos (RFE). O RFE é uma abordagem iterativa de seleção de recursos que funciona eliminando recursivamente os recursos e construindo modelos nos recursos restantes. Ele começa treinando um modelo no conjunto completo de recursos e classifica os recursos com base em sua importância. Em seguida, elimina o(s) recurso(s) menos importante(s) e repete o processo com os recursos restantes. Esse processo iterativo continua até que um número especificado de recursos seja alcançado ou um limite de desempenho predefinido seja alcançado.

A ideia por trás do RFE é que, ao remover recursivamente os recursos menos importantes, ele se concentra nos recursos mais informativos que mais contribuem para o desempenho do modelo. O RFE pode ser usado com qualquer modelo de aprendizado de máquina que forneça uma medida de importância ou pesos de recursos. Modelos populares usados com RFE incluem regressão logística, máquinas de vetores de suporte e florestas aleatórias.

Agora, vamos passar para a seleção de recursos para frente/para trás. Esses são dois métodos de wrapper relacionados que procuram um subconjunto ideal de recursos adicionando ou removendo iterativamente recursos com base em sua contribuição para o desempenho do modelo.

A seleção de recursos avançados começa com um conjunto de recursos vazio e adiciona iterativamente um recurso por vez. A cada iteração, ele avalia o desempenho do modelo usando validação cruzada ou outra métrica de avaliação e seleciona o recurso que mais melhora o desempenho. O processo continua até que um critério de parada predefinido seja atendido, como atingir um número desejado de recursos ou um platô na melhoria de desempenho.

A seleção de recursos retrógrados, por outro lado, começa com o conjunto completo de recursos e remove iterativamente um recurso por vez. A cada iteração, ele avalia o desempenho do modelo e remove o recurso que tem o menor impacto no desempenho. O processo continua até que um critério de parada seja atingido.

A seleção de recursos para frente e para trás pode ser computacionalmente cara, especialmente ao lidar com um grande número de recursos. Para mitigar isso, várias estratégias podem ser empregadas, como o uso de heurísticas ou aproximações para acelerar o processo de busca.

Vale a pena observar que os métodos wrapper, incluindo RFE, seleção direta e seleção reversa, podem ser sensíveis à escolha da métrica de avaliação e do modelo de aprendizado de máquina usado. Diferentes métricas de avaliação podem levar a diferentes subconjuntos de recursos selecionados, e o desempenho dos recursos selecionados pode variar em diferentes modelos.

Na prática, é recomendável realizar validação cruzada ou usar um conjunto de validação externa para obter uma estimativa robusta do desempenho do modelo com diferentes subconjuntos de recursos. Isso ajuda a evitar o overfitting e selecionar os recursos que generalizam bem para dados não vistos.

Para resumir, os métodos wrapper, como eliminação recursiva de recursos (RFE), seleção de recursos avançados e seleção de recursos regressivos, são técnicas iterativas para seleção de recursos que avaliam diferentes subconjuntos de recursos com base no desempenho de um modelo. Esses métodos podem ajudar a identificar os recursos mais relevantes para uma tarefa específica de aprendizado de máquina, melhorar a interpretabilidade do modelo e reduzir a dimensionalidade do espaço de recursos.

No próximo vídeo, exploraremos outras técnicas avançadas de seleção de recursos, incluindo algoritmos genéticos e análise de componentes principais (PCA). Esses métodos oferecem opções adicionais para selecionar recursos com base em diferentes princípios de otimização e técnicas estatísticas. Fique atento a isso!

A seleção de recursos é uma etapa crítica no pipeline de aprendizado de máquina, e a escolha do método correto de seleção de recursos depende do conjunto de dados específico, da tarefa de aprendizado de máquina e das compensações desejadas entre desempenho do modelo, interpretabilidade e eficiência computacional.

13.3.2 Decision Trees & Random Forest Feature Importance (L13: Feature Selection)
13.3.2 Decision Trees & Random Forest Feature Importance (L13: Feature Selection)
  • 2021.12.22
  • www.youtube.com
This video explains how decision trees training can be regarded as an embedded method for feature selection. Then, we will also look at random forest feature...
 

13.4.1 Eliminação Recursiva de Recursos (L13: Seleção de Recursos)


13.4.1 Eliminação Recursiva de Recursos (L13: Seleção de Recursos)

Nesta seção, exploraremos o tópico de métodos Wrapper para seleção de recursos, com base em nossas discussões anteriores sobre métodos de filtro e métodos incorporados. Os métodos wrapper empregam modelos explicitamente para selecionar recursos. Um exemplo popular de um método wrapper é a eliminação recursiva de recursos (RFE), que abordaremos neste vídeo. Além disso, também nos aprofundaremos em outros métodos de seleção de recursos usando técnicas de wrapper nos próximos vídeos.

Para fornecer uma visão geral, existem três métodos principais para seleção de recursos: métodos de filtro, métodos incorporados e métodos de wrapper. Hoje, nosso foco está nos métodos wrapper. A ideia central por trás do RFE pode ser resumida em três etapas.

Primeiro, ajustamos um modelo ao conjunto de dados, geralmente usando modelos lineares, como regressão linear ou regressão logística. Esta etapa não é nada fora do comum.

Em seguida, examinamos o modelo e examinamos especificamente os coeficientes do modelo, que discutiremos com mais detalhes em breve. Com base nas magnitudes desses coeficientes, eliminamos o recurso com o menor coeficiente. Ao considerar o recurso com o menor coeficiente como o menos importante, podemos removê-lo de considerações posteriores. Vale ressaltar que a normalização ou padronização dos recursos é importante para esse processo, garantindo que estejam em escala comparável. Veremos exemplos concretos disso mais adiante.

A etapa final é repetir as etapas um e dois até atingirmos o número desejado de recursos. Em essência, ajustamos continuamente o modelo e eliminamos o recurso menos importante até que tenhamos o conjunto de recursos desejado. Este método simples, mas eficaz, fornece uma abordagem direta para a seleção de recursos.

Um aspecto crítico da eliminação de recursos recursivos está na eliminação dos coeficientes ou pesos do modelo. Para ilustrar isso, vamos considerar modelos de regressão linear e regressão logística. A regressão linear é usada para modelar alvos contínuos, enquanto a regressão logística é um classificador para rótulos discretos ou categóricos. Não vamos nos aprofundar nos detalhes desses modelos aqui, pois já foram abordados em aulas anteriores.

Tanto na regressão linear quanto na logística, os modelos possuem coeficientes ou pesos. Na regressão linear, esses pesos representam as inclinações, enquanto na regressão logística estão associados à influência de cada feição no resultado da classificação. Ao examinar as magnitudes desses pesos, podemos determinar a importância de cada recurso. Eliminar o recurso com o menor peso ou coeficiente efetivamente o remove de consideração. Como alternativa, definir o peso como zero atinge o mesmo resultado, pois o cálculo da soma ponderada exclui a contribuição do recurso.

Para entender melhor como funciona a eliminação de recursos, vamos ver um exemplo usando regressão logística. Temos um problema de classificação binária com dois recursos, x1 e x2, e queremos determinar a probabilidade de pertença à classe. Calculando uma soma ponderada usando os valores dos recursos e os pesos do modelo, obtemos a entrada líquida. Aplicando uma função sigmoide logística à entrada líquida, derivamos a probabilidade de pertença à classe. A comparação dessa probabilidade com um limite, normalmente 0,5, nos permite atribuir rótulos de classe.

A principal conclusão é que os pesos nesses modelos refletem a importância de cada recurso. Pesos maiores indicam maior importância, pois contribuem de forma mais significativa para a entrada líquida e, posteriormente, afetam o resultado da classificação. Padronizar ou normalizar os pesos garante que eles estejam na mesma balança, facilitando uma melhor interpretação de sua importância.

Continuando, vamos explorar um exemplo de uso da eliminação recursiva de recursos no scikit-learn com o conjunto de dados wine. O código apresentado aqui demonstra o processo. Primeiro preparamos o conjunto de dados dividindo-o em conjuntos de treinamento e teste, seguidos pela padronização dos recursos. Em seguida, instanciamos um objeto RFE da classe RFE no scikit-learn. Passamos um estimador de regressão logística para o objeto RFE e especificamos o número desejado de características a serem selecionadas (por exemplo, 5 neste caso).

Depois de instanciar o objeto RFE, podemos ajustá-lo aos nossos dados de treinamento usando o método fit. Isso iniciará o processo de eliminação de recursos recursivos. O objeto RFE treinará o modelo de regressão logística nos dados de treinamento e, em seguida, eliminará o recurso com o menor coeficiente. Ele repetirá esse processo iterativamente até que o número desejado de recursos seja alcançado.

Depois de ajustar o objeto RFE, podemos acessar os recursos selecionados usando o atributo support_. Este atributo retorna uma máscara booleana indicando quais feições foram selecionadas. Também podemos obter a classificação dos recursos com base em sua importância usando o atributo ranking_. Quanto menor a classificação, mais importante é o recurso.

Na próxima etapa, podemos transformar nossos dados de treinamento originais e dados de teste para incluir apenas os recursos selecionados usando o método de transformação do objeto RFE. Isso criará novos conjuntos de recursos apenas com os recursos selecionados.

Por fim, podemos treinar um modelo de regressão logística nos dados de treinamento transformados e avaliar seu desempenho nos dados de teste transformados. Isso nos permitirá avaliar a eficácia do processo de seleção de recursos e determinar se ele melhorou a precisão preditiva do modelo.

Vale a pena observar que o número de recursos a serem selecionados e o tamanho do passo são hiperparâmetros que podem ser ajustados para encontrar a configuração ideal para um conjunto de dados e modelo específicos. A pesquisa em grade ou outras técnicas de otimização de hiperparâmetros podem ser empregadas para encontrar a melhor combinação desses parâmetros.

No geral, a eliminação recursiva de recursos é um método wrapper para seleção de recursos que depende do treinamento de um modelo e da eliminação iterativa dos recursos menos importantes. Pode ser aplicado a problemas de regressão e classificação e pode ser usado com diferentes tipos de modelos. A seleção de recursos é baseada nos coeficientes ou pesos atribuídos aos recursos pelo modelo. Ao remover iterativamente os recursos menos importantes, o RFE visa melhorar o desempenho do modelo, concentrando-se nos recursos mais informativos.

13.4.1 Recursive Feature Elimination (L13: Feature Selection)
13.4.1 Recursive Feature Elimination (L13: Feature Selection)
  • 2021.12.27
  • www.youtube.com
In this video, we start our discussion of wrapper methods for feature selection. In particular, we cover Recursive Feature Elimination (RFE) and see how we c...
 

13.4.2 Importância da Permutação de Recursos (L13: Seleção de Recursos)


13.4.2 Importância da Permutação de Recursos (L13: Seleção de Recursos)

Bem-vindo a este vídeo onde vamos nos aprofundar no tópico da importância da permutação. A importância da permutação faz parte dos métodos wrapper para seleção de recursos, que discutimos brevemente no vídeo anterior. Os métodos wrapper envolvem o uso de um modelo para realizar a seleção de recursos ou estimar a importância do recurso. Em uma aula anterior, exploramos a eliminação de recursos recursivos como um exemplo de método wrapper. Agora, vamos mudar nosso foco para a importância da permutação. Nos próximos vídeos, também exploraremos outro método chamado seleção sequencial de recursos.

Antes de mergulhar nos detalhes essenciais de como a importância da permutação funciona, deixe-me fornecer uma visão geral concisa do método. Em essência, a importância da permutação envolve embaralhar cada coluna de recurso em um conjunto de dados. Em seguida, usando um modelo já treinado, avaliamos o desempenho do modelo no conjunto de dados embaralhado e o comparamos com o desempenho original. Normalmente, observamos uma queda no desempenho quando uma coluna de recursos é embaralhada. Essa queda no desempenho serve como um indicador da importância do recurso. É claro que resumir o método em apenas duas etapas pode parecer um pouco complicado, por isso, nos próximos slides, vou acompanhá-lo pelo processo de maneira mais detalhada e lenta.

Aplicando a importância da permutação a cada coluna no conjunto de dados, podemos gerar um gráfico de barras ilustrando a importância de cada recurso. Além disso, podemos opcionalmente incluir o desvio padrão dos valores de importância no gráfico. No próximo vídeo, fornecerei um exemplo de código sobre como criar esse gráfico.

Agora, antes de nos aprofundarmos na explicação detalhada da importância da permutação e do algoritmo por trás dela, vamos examinar alguns fatos notáveis. A importância da permutação geralmente produz resultados semelhantes à importância da característica da floresta aleatória com base na impureza. No entanto, a vantagem da importância da permutação é que ela é independente de modelo, o que significa que pode ser usada com qualquer tipo de algoritmo ou modelo de aprendizado de máquina. É importante observar que, embora a importância da permutação não seja estritamente um método de seleção de recursos, ela fornece informações sobre os recursos dos quais um modelo mais depende. Consequentemente, podemos usar medidas de importância de recursos como base para selecionar recursos.

Se você se lembra de nossa discussão anterior sobre a importância do recurso de floresta aleatória, pode pensar na importância da permutação como uma generalização de um dos métodos, especificamente o Método B, naquele vídeo. No entanto, em vez de usar amostras fora do saco, a importância da permutação emprega o conjunto de validação. Se você precisar de uma atualização sobre exemplos prontos, sinta-se à vontade para revisitar o vídeo anterior.

Agora, vamos mergulhar no algoritmo passo a passo da importância da permutação. Primeiro, começamos com um modelo que foi ajustado ao conjunto de treinamento. Esse modelo pode ser qualquer modelo ou algoritmo de aprendizado de máquina. Como exemplo, vamos considerar um classificador de floresta aleatório. Treinamos a floresta aleatória no conjunto de treinamento, que é uma etapa padrão.

Em seguida, estimamos o desempenho preditivo do modelo em um conjunto de dados independente, como o conjunto de validação ou o conjunto de teste. Registramos esse desempenho como o desempenho da linha de base. Por exemplo, digamos que alcançamos 99% de precisão no conjunto de validação usando nosso modelo de floresta aleatória ajustada. Consideramos isso como o desempenho da linha de base.

Para cada coluna de recurso no conjunto de dados, embaralhamos aleatoriamente essa coluna específica, mantendo as outras colunas e rótulos de classe inalterados. Esse processo de embaralhamento é ilustrado com um conjunto de dados de exemplo. Suponha que tenhamos um conjunto de dados com três colunas de recursos e quatro exemplos de treinamento. Nós nos concentramos em embaralhar a coluna um, representada por uma cor diferente no exemplo. Após o embaralhamento, a ordem dos valores nessa coluna muda. Permutamos aleatoriamente os valores enquanto mantemos os valores originais nas colunas dois e três.

Outra vantagem da importância da permutação é que ela pode lidar bem com recursos correlacionados. Uma vez que avalia a importância de cada recurso individualmente, embaralhando seus valores, ele captura a contribuição exclusiva de cada recurso para o desempenho do modelo, independentemente das correlações com outros recursos. Isso é particularmente útil em cenários em que existem conjuntos de dados de alta dimensão com recursos inter-relacionados.

A importância de permutação também fornece uma medida de importância de recurso que é mais confiável do que a importância de recurso inerente fornecida por alguns modelos. Por exemplo, em árvores de decisão ou florestas aleatórias, a importância de um recurso é baseada na redução de impurezas alcançada ao dividir os dados. No entanto, essa medida pode ser tendenciosa para recursos com muitas divisões possíveis ou aqueles que aparecem mais alto na estrutura da árvore. A importância da permutação fornece uma estimativa mais direta e imparcial da importância do recurso, avaliando diretamente o impacto do embaralhamento de cada recurso.

Por outro lado, a importância da permutação pode ser computacionalmente cara, especialmente se o processo de treinamento do modelo for demorado ou se houver um grande número de recursos. Como o processo de permutação requer a reavaliação do desempenho do modelo várias vezes, ele pode adicionar uma sobrecarga significativa. No entanto, existem técnicas de otimização e estratégias de paralelização que podem ajudar a mitigar esse problema, como o uso de computação paralela ou a redução do número de permutações.

Vale a pena notar que a importância da permutação não é uma bala de prata para a seleção de recursos ou interpretação do modelo. Embora forneça informações valiosas sobre a importância de recursos individuais, deve ser usado em conjunto com outras técnicas e conhecimento de domínio. A importância do recurso por si só não garante o poder preditivo ou a relevância de um recurso. É essencial considerar o contexto, o problema específico e as limitações do modelo.

Em resumo, a importância da permutação é um método poderoso e independente de modelo para avaliar a importância dos recursos em um modelo de aprendizado de máquina. Ao embaralhar os valores dos recursos e comparar o desempenho do modelo antes e depois do embaralhamento, ele fornece uma medida confiável da importância do recurso. É fácil de entender, lida bem com recursos correlacionados e não é suscetível a overfitting. No entanto, pode ser computacionalmente caro e deve ser usado junto com outras técnicas para seleção abrangente de recursos e interpretação do modelo.

13.4.2 Feature Permutation Importance (L13: Feature Selection)
13.4.2 Feature Permutation Importance (L13: Feature Selection)
  • 2021.12.29
  • www.youtube.com
This video introduces permutation importance, which is a model-agnostic, versatile way for computing the importance of features based on a machine learning c...
 

13.4.3 Exemplos de Código de Importância de Permutação de Recurso (L13: Seleção de Recurso)


13.4.3 Exemplos de Código de Importância de Permutação de Recurso (L13: Seleção de Recurso)

Tudo bem, agora que abordamos a introdução básica à importância da permutação, vamos dar uma olhada em alguns exemplos de código para ver como podemos usar a importância da permutação na prática. Sim, e como sempre, também tenho os exemplos de código nos notebooks Jupyter vinculados abaixo do vídeo. E também, ao contrário de sempre, estaremos trabalhando com um conjunto de dados de vento novamente, apenas para manter as coisas simples.

Portanto, o conjunto de dados do vento, novamente, é um conjunto de dados que consiste em 13 colunas. E aqui está uma visão geral de como as primeiras cinco linhas se parecem. Portanto, há três classes, Classe Um, dois e três. E há 13 colunas, mas nem todas as colunas são mostradas aqui devido a restrições de espaço. Mas sim, não vamos discutir este conjunto de dados de vento com muitos detalhes porque já vimos isso muitas vezes antes.

Sim, e também, como sempre, dividiremos o conjunto de dados em um conjunto de treinamento e um conjunto de teste. Aqui, o que estamos fazendo é pegar o conjunto de dados, exceto a primeira coluna, que é a coluna do rótulo. Portanto, dividiremos o conjunto de dados em um conjunto de treinamento e um conjunto de teste, onde 30% dos dados são usados para teste e 70% serão usados para treinamento correspondentemente. Observe aqui que não estamos criando nenhum conjunto de validação. Portanto, é apenas minha opinião pessoal. Mas não acho que precisamos necessariamente de um conjunto de validação se calcularmos o desempenho da permutação porque sim, geralmente devemos manter nosso conjunto de teste independente. Mas se você pensar em como o desempenho de permutação funciona, com base no vídeo anterior, estamos aqui apenas observando a queda de desempenho quando permutamos uma coluna de recurso. Portanto, não estamos realmente recalculando a precisão do teste, estamos apenas usando o conjunto de teste para ver quanto o desempenho cairá se embaralharmos uma coluna.

Sim, ainda estamos na fase de configuração aqui. Então, aqui neste slide, estamos preparando nosso modelo. E, de fato, aqui está um classificador de floresta aleatório. Portanto, no vídeo anterior, aprendemos que a importância da permutação é um método independente de modelo. Isso significa que podemos calcular isso para qualquer tipo de modelo. No entanto, estamos usando aqui uma floresta aleatória para que possamos comparar a importância da permutação com o desempenho baseado em impurezas da floresta aleatória, o que pode ser uma comparação interessante. Aqui, estamos configurando um classificador de floresta aleatório com 100 árvores. E estamos ajustando-o ao conjunto de treinamento. E aqui está apenas o cálculo da precisão. E podemos ver que a precisão do treinamento é de 100% e a precisão do teste também é de 100%, o que indica que este é realmente um modelo muito bom, ou também pode apenas indicar que o conjunto de dados é muito fácil de classificar.

Uma coisa que eu queria observar aqui também é que, quando calculamos a importância da permutação, é importante ter um modelo de bom desempenho se quisermos interpretar a importância do recurso como uma importância geral do recurso. Porque se não tivermos um modelo com bom desempenho, podemos descobrir quais recursos o modelo mais depende, mas isso não nos diz realmente, digamos, o quão importante é o recurso no contexto da variável de destino se o modelo não for muito preciso. Então, antes de olharmos para a importância da permutação, apenas para referência, novamente aqui está a importância baseada na impureza. Portanto, essa é a importância baseada em impurezas da floresta aleatória que já discutimos em um vídeo anterior. Novamente, isso é apenas para referência, onde acessamos esse atributo de importância do recurso após ajustar o modelo.

Em seguida, estamos aplicando arg_sort, para obtermos a ordem de classificação dos valores de importância do maior para o menor. Então, do maior para o menor. E então o que estamos fazendo é criar um gráfico de barras para visualizar a importância baseada na impureza. O gráfico de barras mostrará os nomes dos recursos no eixo x e os valores de importância correspondentes no eixo y. Ao classificar os valores de importância em ordem decrescente, os recursos mais importantes serão plotados primeiro.

Em seguida, o código segue para calcular a importância da permutação. A importância da permutação é calculada embaralhando aleatoriamente os valores de cada recurso no conjunto de teste e medindo a queda no desempenho do modelo. Quanto maior a queda no desempenho, mais importante o recurso é considerado. O código usa um loop for para iterar sobre cada recurso no conjunto de dados.

Dentro do loop, os valores dos recursos no conjunto de teste são embaralhados usando np.random.permutation(). Em seguida, o conjunto de teste embaralhado é passado pelo classificador de floresta aleatória treinado para obter os rótulos previstos. A precisão do modelo no conjunto de teste embaralhado é calculada usando a função Accuracy_score(). A diferença entre a precisão do teste original e a precisão do teste embaralhado representa a queda no desempenho causada pela permuta do recurso.

A queda no desempenho de cada recurso é armazenada em uma lista chamada important_vals. Depois de iterar sobre todos os recursos, a lista important_vals contém a queda nos valores de desempenho de cada recurso.

Finalmente, um gráfico de barras é criado para visualizar a importância da permutação. Os nomes dos recursos são plotados no eixo x e a queda correspondente nos valores de desempenho são plotados no eixo y. Novamente, os valores de importância são classificados em ordem decrescente para destacar os recursos mais importantes.

Este código fornece uma comparação entre a importância baseada na impureza e a importância da permutação. Ao comparar os dois gráficos, você pode observar se há alguma diferença na classificação da importância do recurso entre os dois métodos.

import matplotlib.pyplot as plt
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score

# Load the Iris dataset
iris = load_iris()
X = iris.data
y = iris.target

# Create a random forest classifier
clf = RandomForestClassifier(n_estimators= 100 , random_state= 42 )
clf.fit(X, y)

# Compute impurity-based feature importances
importances = clf.feature_importances_

# Plot impurity-based feature importances
plt.figure(figsize=( 8 , 6 ))
plt.bar(range(X.shape[ 1 ]), importances, align= 'center' )
plt.xticks(range(X.shape[ 1 ]), iris.feature_names, rotation= 90 )
plt.xlabel( 'Features' )
plt.ylabel( 'Importance' )
plt.title( 'Impurity-based Feature Importances' )
plt.show()

# Compute permutation importances
importance_vals = []
for feature in range(X.shape[ 1 ]):
    X_permuted = X.copy()
    np.random.shuffle(X_permuted[:, feature])
    y_pred = clf.predict(X_permuted)
    accuracy = accuracy_score(y, y_pred)
    drop_in_performance = accuracy_score(y, y_pred) - accuracy
    importance_vals.append(drop_in_performance)

# Plot permutation importances
plt.figure(figsize=( 8 , 6 ))
plt.bar(range(X.shape[ 1 ]), importance_vals, align= 'center' )
plt.xticks(range(X.shape[ 1 ]), iris.feature_names, rotation= 90 )
plt.xlabel( 'Features' )
plt.ylabel( 'Drop in Performance' )
plt.title( 'Permutation Importances' )
plt.show()
Este código criará dois gráficos de barras lado a lado. O primeiro gráfico mostrará as importâncias dos recursos baseados em impurezas e o segundo gráfico mostrará as importâncias da permutação. Ao examinar esses gráficos, você pode obter informações sobre a importância relativa de diferentes recursos no conjunto de dados Iris de acordo com esses dois métodos.

Certifique-se de ter as bibliotecas necessárias importadas, como matplotlib, numpy, sklearn.ensemble.RandomForestClassifier, sklearn.datasets.load_iris e sklearn.metrics.accuracy_score.

import matplotlib.pyplot as plt
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.inspection import permutation_importance
from sklearn.model_selection import train_test_split

# Load the Iris dataset
iris = load_iris()
X = iris.data
y = iris.target

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size= 0.2 , random_state= 42 )

# Create a random forest classifier
clf = RandomForestClassifier(n_estimators= 100 , random_state= 42 )
clf.fit(X_train, y_train)

# Perform permutation importances
result = permutation_importance(clf, X_test, y_test, n_repeats= 10 , random_state= 42 , n_jobs=- 1 )

# Get the feature importances and their indices
importances = result.importances_mean
indices = np.argsort(importances)

# Plot permutation importances
plt.figure(figsize=( 8 , 6 ))
plt.barh(range(X.shape[ 1 ]), importances[indices], align= 'center' )
plt.yticks(range(X.shape[ 1 ]), iris.feature_names[indices])
plt.xlabel( 'Importance' )
plt.ylabel( 'Features' )
plt.title( 'Permutation Importances' )
plt.show()
Neste código, usamos a função permutation_importance do módulo sklearn.inspection para calcular as importâncias de permutação. O conjunto de dados é dividido em conjuntos de treinamento e teste usando train_test_split. Em seguida, ajustamos um classificador de floresta aleatório nos dados de treinamento e calculamos as importâncias de permutação usando os dados de teste.

As importâncias de permutação resultantes são armazenadas na variável de importâncias. Usamos np.argsort para obter os índices que classificariam as importâncias em ordem crescente. Isso ajuda a plotar as importâncias na ordem correta.

Por fim, criamos um gráfico de barra horizontal usando plt.barh para exibir as importâncias da permutação. O eixo y representa os recursos, enquanto o eixo x representa os valores de importância. As funções plt.xlabel, plt.ylabel e plt.title são usadas para adicionar rótulos e um título ao gráfico.

Certifique-se de ter as bibliotecas necessárias importadas, como matplotlib, numpy, sklearn.ensemble.RandomForestClassifier, sklearn.datasets.load_iris, sklearn.inspection.permutation_importance e sklearn.model_selection.train_test_split.

import matplotlib.pyplot as plt
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.inspection import permutation_importance
from sklearn.model_selection import train_test_split

# Load the Iris dataset
iris = load_iris()
X = iris.data
y = iris.target

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size= 0.2 , random_state= 42 )

# Create a random forest classifier
clf = RandomForestClassifier(n_estimators= 100 , random_state= 42 )
clf.fit(X_train, y_train)

# Perform permutation importances
result = permutation_importance(clf, X_test, y_test, n_repeats= 10 , random_state= 42 , n_jobs=- 1 )

# Get the feature importances and their indices
importances = result.importances_mean
indices = np.argsort(importances)

# Plot permutation importances
plt.figure(figsize=( 8 , 6 ))
plt.barh(range(X.shape[ 1 ]), importances[indices], align= 'center' )
plt.yticks(range(X.shape[ 1 ]), iris.feature_names[indices])
plt.xlabel( 'Importance' )
plt.ylabel( 'Features' )
plt.title( 'Permutation Importances' )
plt.show()
Neste código, usamos a função permutation_importance do módulo sklearn.inspection para calcular as importâncias de permutação. O conjunto de dados é dividido em conjuntos de treinamento e teste usando train_test_split. Em seguida, ajustamos um classificador de floresta aleatório nos dados de treinamento e calculamos as importâncias de permutação usando os dados de teste.

As importâncias de permutação resultantes são armazenadas na variável de importâncias. Usamos np.argsort para obter os índices que classificariam as importâncias em ordem crescente. Isso ajuda a plotar as importâncias na ordem correta.

Por fim, criamos um gráfico de barra horizontal usando plt.barh para exibir as importâncias da permutação. O eixo y representa os recursos, enquanto o eixo x representa os valores de importância. As funções plt.xlabel, plt.ylabel e plt.title são usadas para adicionar rótulos e um título ao gráfico.

Certifique-se de ter as bibliotecas necessárias importadas, como matplotlib, numpy, sklearn.ensemble.RandomForestClassifier, sklearn.datasets.load_iris, sklearn.inspection.permutation_importance e sklearn.model_selection.train_test_split.

13.4.3 Feature Permutation Importance Code Examples (L13: Feature Selection)
13.4.3 Feature Permutation Importance Code Examples (L13: Feature Selection)
  • 2021.12.30
  • www.youtube.com
This video shows code examples for computing permutation importance in mlxtend and scikit-learn. Permutation importance is a model-agnostic, versatile way fo...
 

13.4.4 Seleção Sequencial de Recursos (L13: Seleção de Recursos)


13.4.4 Seleção Sequencial de Recursos (L13: Seleção de Recursos)

Nos vídeos anteriores, apresentei o conceito de importância de recurso usando a importância de permutação como minha técnica favorita. Neste vídeo, quero discutir outra técnica importante chamada seleção sequencial de recursos, que também faz parte dos métodos wrapper sobre os quais falamos anteriormente.

Antes de mergulhar na seleção sequencial de recursos, vamos recapitular brevemente os diferentes tipos de métodos de seleção de recursos que discutimos até agora. Começamos com métodos de filtro, depois passamos para métodos incorporados, como eliminação recursiva de recursos, e agora estamos nos concentrando em métodos wrapper.

Os métodos wrapper visam encontrar um subconjunto de recursos ideal, experimentando todas as combinações de recursos possíveis. Essa abordagem é conhecida como seleção exaustiva de recursos. Para entender como funciona, vamos considerar o exemplo do conjunto de dados Iris, que possui quatro recursos: comprimento da sépala, largura da sépala, comprimento da pétala e largura da pétala. Para encontrar a melhor combinação de recursos para o nosso modelo, precisaríamos experimentar todos os subconjuntos possíveis, desde recursos individuais até o conjunto completo de recursos.

Para o conjunto de dados Iris, isso resultaria em 15 combinações possíveis, incluindo subconjuntos de um, dois, três e quatro recursos. No entanto, a seleção exaustiva de recursos pode ser computacionalmente cara e propensa a overfitting. Para mitigar esses problemas, podemos usar um conjunto de validação ou validação cruzada K-fold para avaliar o desempenho de diferentes subconjuntos de recursos.

Apesar de sua simplicidade, a seleção exaustiva de recursos tem uma limitação quando aplicada a conjuntos de dados com um grande número de recursos. O número de possíveis subconjuntos de recursos cresce exponencialmente com o número de recursos, tornando-o impraticável para grandes conjuntos de dados. Essa limitação motiva o uso da seleção sequencial de recursos, que é uma técnica de aproximação que explora um subconjunto de combinações de recursos em vez de avaliar todas as combinações possíveis.

A seleção sequencial de recursos é um processo iterativo que começa com o conjunto de recursos original e gradualmente seleciona ou remove recursos com base em seu desempenho. Uma abordagem popular é a seleção retroativa sequencial, onde começamos com o conjunto completo de recursos e removemos iterativamente um recurso por vez. Em cada iteração, avaliamos o desempenho dos recursos restantes e selecionamos o subconjunto com o maior desempenho. Esse processo continua até que tenhamos um subconjunto com um único recurso restante.

O algoritmo de seleção regressiva sequencial pode ser resumido da seguinte forma:

  1. Comece com o conjunto de recursos original.
  2. Gere todos os subconjuntos de recursos possíveis de tamanho n-1 removendo um recurso por vez.
  3. Avalie o desempenho de cada subconjunto candidato.
  4. Selecione o subconjunto com o desempenho mais alto e remova permanentemente o recurso ausente desse subconjunto.
  5. Repita as etapas 2 a 4 até que o tamanho do recurso desejado seja alcançado (por exemplo, apenas um recurso permanece).

Repetindo as etapas 2 a 4, reduzimos gradualmente o conjunto de recursos até atingirmos o subconjunto ideal. O subconjunto final é selecionado com base na pontuação de avaliação mais alta e, em caso de empate, o subconjunto menor é o preferido para eficiência computacional. O número de iterações na seleção regressiva sequencial é igual ao número de recursos menos um.

A seleção de encaminhamento sequencial é outra variação da seleção de recurso sequencial. Em vez de remover recursos, a seleção de avanço sequencial começa com um conjunto de recursos vazio e adiciona gradualmente um recurso por vez. O processo envolve treinar um classificador em cada recurso individual e avaliar seu desempenho. O recurso com o maior desempenho é selecionado e adicionado ao subconjunto. Esse processo continua até que o número máximo de recursos seja atingido.

Em resumo, a seleção sequencial de recursos é uma técnica útil para encontrar um subconjunto ideal de recursos. Ele oferece um compromisso entre eficiência computacional e encontrar uma boa combinação de recursos. Seleção retroativa sequencial e seleção progressiva sequencial são duas variações comuns de seleção sequencial de recursos, cada uma com suas próprias vantagens e casos de uso. No próximo vídeo, exploraremos como implementar a seleção sequencial de recursos de forma programática e abordaremos as limitações da seleção exaustiva de recursos.

13.4.4 Sequential Feature Selection (L13: Feature Selection)
13.4.4 Sequential Feature Selection (L13: Feature Selection)
  • 2022.01.05
  • www.youtube.com
This video explains how sequential feature selection works. Sequential feature selection is a wrapper method for feature selection that uses the performance ...
 

13.4.5 Seleção Sequencial de Recursos -- Exemplos de Código (L13: Seleção de Recursos)


13.4.5 Seleção Sequencial de Recursos -- Exemplos de Código (L13: Seleção de Recursos)

Ok, é hora de concluir nossa discussão sobre a seleção de recursos. Neste vídeo, demonstrarei como usar a seleção sequencial de recursos em Python. Começarei mostrando um exemplo usando a biblioteca MLxtend, que é a implementação original que desenvolvi há vários anos. Posteriormente, também demonstrarei como obter os mesmos resultados usando o scikit-learn, que oferece uma implementação mais simplificada.

Antes de nos aprofundarmos no código, recomendo que você verifique a documentação, que contém exemplos adicionais que não abordarei neste vídeo para evitar torná-lo muito longo e opressor. É sempre útil consultar a documentação para obter informações mais detalhadas.

Primeiro, vamos começar carregando o plug-in "marca d'água" que desenvolvi para rastrear as versões de meus notebooks e bibliotecas de software ao longo dos anos. É uma boa prática garantir que os números de versão correspondam às nossas expectativas, especialmente se algumas opções não funcionarem mais devido a discrepâncias de versão. Também usaremos a biblioteca matplotlib mais tarde, então vamos importá-la para garantir que os gráficos sejam exibidos corretamente no notebook.

Agora, vamos preparar o conjunto de dados para seleção de recursos. Como nos vídeos anteriores, usaremos o conjunto de dados wine. Carregamos o conjunto de dados do repositório de conjunto de dados de aprendizado de máquina UCI usando Pandas. Depois de carregar o conjunto de dados, imprimimos algumas informações básicas para garantir que tudo foi carregado corretamente. Também é importante verificar se os rótulos de classe são representados como números inteiros.

Em seguida, dividimos o conjunto de dados em conjuntos de treinamento e teste, como fizemos nos vídeos anteriores. Além disso, padronizamos o conjunto de dados porque usaremos um classificador K-vizinho mais próximo, que é sensível ao dimensionamento de recursos. Dividimos o conjunto de dados em 80% do conjunto de treinamento e 20% do conjunto de teste e padronizamos os dois conjuntos.

Para estabelecer uma linha de base antes da seleção de recursos, ajustamos um classificador K-vizinho mais próximo no conjunto de dados padronizado e calculamos as precisões de treinamento e teste. Neste exemplo, escolhemos arbitrariamente cinco vizinhos para o classificador, mas esse parâmetro pode estar sujeito à pesquisa de grade para desempenho ideal. Embora não realizemos a pesquisa em grade aqui para manter o código e o vídeo mais simples, combinar a pesquisa em grade com a seleção sequencial de recursos é uma abordagem comum. Você pode encontrar exemplos disso na documentação.

Os resultados da linha de base mostram que alcançamos 98,6% de precisão no conjunto de treinamento e 94% de precisão no conjunto de teste. O desempenho é muito bom usando todos os 13 recursos do conjunto de dados do vinho. No entanto, pode haver algum overfitting devido à maldição da dimensionalidade associada aos classificadores K-vizinhos mais próximos. Para atenuar isso, podemos selecionar um subconjunto menor de recursos para melhorar potencialmente o desempenho.

Agora, vamos demonstrar como usar a seleção sequencial de recursos para selecionar um subconjunto de cinco recursos. Importamos a classe SequentialFeatureSelector da biblioteca MLxtend e encurtamos o nome da importação para sfs por conveniência. Essa classe usa o modelo, o tamanho do subconjunto de recursos desejado e a direção de seleção (para frente, para trás, flutuante) como entrada. Definimos a direção para avançar para seleção de avanço sequencial. O parâmetro detalhado nos permite controlar a quantidade de saída exibida durante o treinamento, o que pode ser útil para monitorar o progresso. Especificamos a métrica de pontuação como precisão e usamos validação cruzada de 5 vezes para avaliar os subconjuntos de recursos. O processamento paralelo pode ser ativado definindo o parâmetro n_jobs como um número inteiro positivo ou -1 para utilizar todos os núcleos de CPU disponíveis. Nesse caso, definimos como 8 para uma execução mais rápida.

A saída mostra o progresso do processo de seleção de recursos, começando com um recurso e aumentando gradualmente o número de recursos até atingir o tamanho de subconjunto desejado de cinco. O desempenho de cada subconjunto de recursos também é exibido, indicando melhorias à medida que mais recursos são adicionados.

Após a conclusão, podemos acessar os índices de recursos selecionados e os nomes de recursos correspondentes usando os atributos k_feature_idx_ e k_feature_names_, respectivamente, do objeto sfs. Além disso, podemos acessar o histórico de desempenho dos subconjuntos de recursos usando o atributo k_score_. Vamos imprimir os índices de recursos selecionados, nomes e suas pontuações correspondentes:

print( 'Selected feature indices:' , sfs.k_feature_idx_)
print( 'Selected feature names:' , sfs.k_feature_names_)
print( 'Selected feature scores:' , sfs.k_score_)

A saída mostrará os índices, nomes e pontuações dos cinco recursos selecionados.

Em seguida, podemos treinar novamente o classificador K-vizinho mais próximo no subconjunto de recursos selecionado. Para fazer isso, precisamos criar um novo conjunto de treinamento e teste que contenha apenas os recursos selecionados. Podemos usar o método transform do objeto sfs para transformar os conjuntos de dados originais no novo espaço de recursos:

X_train_selected = sfs.transform(X_train)
X_test_selected = sfs.transform(X_test)
Depois de transformar os conjuntos de dados, podemos ajustar um novo classificador K-vizinho mais próximo no subconjunto de recursos selecionado e calcular as precisões de treinamento e teste. Vamos imprimir os resultados:

knn_selected = KNeighborsClassifier(n_neighbors= 5 )
knn_selected.fit(X_train_selected, y_train)

train_acc_selected = knn_selected.score(X_train_selected, y_train)
test_acc_selected = knn_selected.score(X_test_selected, y_test)

print( 'Training accuracy on selected features:' , train_acc_selected)
print( 'Test accuracy on selected features:' , test_acc_selected)
A saída mostrará as precisões de treinamento e teste alcançadas usando apenas os cinco recursos selecionados.

Ao comparar os resultados com as precisões da linha de base, podemos avaliar o impacto da seleção de recursos no desempenho do classificador. Em alguns casos, a seleção de recursos pode levar a uma melhor generalização e desempenho aprimorado do modelo, reduzindo o overfitting e removendo recursos irrelevantes ou redundantes.

Isso é tudo para a demonstração usando a biblioteca MLxtend. Agora, vamos usar o scikit-learn para seleção sequencial de recursos.

No scikit-learn, a classe SequentialFeatureSelector está disponível no módulo feature_selection. Importamos da seguinte forma:

from sklearn.feature_selection import SequentialFeatureSelector
O uso da versão scikit-learn é semelhante à versão MLxtend, mas com algumas pequenas diferenças nos nomes dos parâmetros e no acesso aos atributos. A versão scikit-learn também oferece mais flexibilidade em termos de uso de diferentes algoritmos de seleção de recursos e métricas de pontuação.

Espero que esta demonstração ajude você a entender como usar a seleção sequencial de recursos em Python. Lembre-se de consultar a documentação para obter exemplos e informações adicionais.

13.4.5 Sequential Feature Selection -- Code Examples (L13: Feature Selection)
13.4.5 Sequential Feature Selection -- Code Examples (L13: Feature Selection)
  • 2022.01.06
  • www.youtube.com
This final video in the "Feature Selection" series shows you how to use Sequential Feature Selection in Python using both mlxtend and scikit-learn.Jupyter no...
Razão: