A Arte de Encontrar as Melhores Características para Aprendizagem de Máquina

Selecção de Características

Em muitas situações utilizando todas as características disponíveis num conjunto de dados não resultará no modelo mais preditivo. Dependendo do tipo de modelo utilizado, o tamanho do conjunto de dados e vários outros fatores, incluindo o excesso de recursos, podem reduzir o desempenho do modelo.

Existem três objetivos principais para a seleção de recursos.

  • Melhorar a precisão com que o modelo é capaz de prever novos dados.
  • Reduzir o custo computacional.
  • Produzir um modelo mais interpretável.

Existem várias razões pelas quais você pode remover certos recursos em relação a outros. Isto inclui as relações que existem entre os recursos, quer uma relação estatística com a variável alvo exista ou seja significativa o suficiente, ou o valor das informações contidas em um recurso.

A seleção de recursos pode ser feita manualmente através da análise do conjunto de dados pré e pós-treinamento, ou através de métodos estatísticos automatizados.

Seleção manual de recursos

Existem várias razões pelas quais você pode querer remover um recurso da fase de treinamento. Estas incluem:

  • Uma funcionalidade que está altamente correlacionada com outra funcionalidade no conjunto de dados. Se este for o caso, então ambos os recursos estão, em essência, fornecendo as mesmas informações. Alguns algoritmos são sensíveis a funcionalidades correlacionadas.
  • Faatures que fornecem pouca ou nenhuma informação. Um exemplo seria uma característica onde a maioria dos exemplos tem o mesmo valor.
  • Características que têm pouca ou nenhuma relação estatística com a variável alvo.

Características podem ser selecionadas através de análise de dados realizada antes ou depois do treinamento de um modelo. Aqui estão algumas técnicas comuns para realizar a seleção manual de características.

Plotagem de correlação

Uma técnica manual para realizar a seleção de características é criar uma visualização que plote a medida de correlação para cada característica no conjunto de dados. Seaborn é uma boa biblioteca de pitões a ser usada para isso. O código abaixo produz um gráfico de correlação para as características do conjunto de dados do câncer de mama disponível no scikit-learn API.

# library imports
import pandas as pd
from sklearn.datasets import load_breast_cancer
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
import numpy as np# load the breast_cancer data set from the scikit-learn api
breast_cancer = load_breast_cancer()
data = pd.DataFrame(data=breast_cancer, columns = breast_cancer)
data = breast_cancer
data.head()# use the pands .corr() function to compute pairwise correlations for the dataframe
corr = data.corr()
# visualise the data with seaborn
mask = np.triu(np.ones_like(corr, dtype=np.bool))
sns.set_style(style = 'white')
f, ax = plt.subplots(figsize=(11, 9))
cmap = sns.diverging_palette(10, 250, as_cmap=True)
sns.heatmap(corr, mask=mask, cmap=cmap,
square=True,
linewidths=.5, cbar_kws={"shrink": .5}, ax=ax)

Na visualização resultante, podemos identificar algumas características que estão estreitamente correlacionadas e podemos, portanto, querer remover algumas delas, e algumas características que têm correlação muito baixa com a variável alvo que também podemos querer remover.

Importância de características

Após termos treinado um modelo é possível aplicar uma análise estatística mais aprofundada para compreender os efeitos que as características têm sobre a saída do modelo e determinar a partir dela quais características são mais úteis.

Existem várias ferramentas e técnicas disponíveis para determinar a importância das características. Algumas técnicas são exclusivas de um algoritmo específico, enquanto outras podem ser aplicadas a uma grande variedade de modelos e são conhecidas como agnóstico de modelos.

Para ilustrar a importância dos recursos, usarei o método de importação de recursos embutido para um classificador florestal aleatório no scikit-learn. O código abaixo se encaixa no classificador e cria um gráfico exibindo as importâncias de características.

from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split# Spliiting data into test and train sets
X_train, X_test, y_train, y_test = train_test_split(data.drop('target', axis=1), data, test_size=0.20, random_state=0)# fitting the model
model = RandomForestClassifier(n_estimators=500, n_jobs=-1, random_state=42)
model.fit(X_train, y_train)# plotting feature importances
features = data.drop('target', axis=1).columns
importances = model.feature_importances_
indices = np.argsort(importances)plt.figure(figsize=(10,15))
plt.title('Feature Importances')
plt.barh(range(len(indices)), importances, color='b', align='center')
plt.yticks(range(len(indices)), for i in indices])
plt.xlabel('Relative Importance')
plt.show()

Isso dá um bom indicador das características que estão tendo um impacto sobre o modelo e as que não estão. Podemos escolher remover algumas das características menos importantes depois de analisar este gráfico.

Selecção automática de características

Existem vários mecanismos que utilizam métodos estatísticos para encontrar automaticamente o conjunto óptimo de características a utilizar num modelo. A biblioteca scikit-learn contém uma série de métodos que fornecem uma implementação muito simples para muitas destas técnicas.

Variância limiar

Na estatística, variância é o desvio ao quadrado de uma variável da sua média, em outras palavras, até que ponto os pontos de dados estão espalhados para uma determinada variável?

Suponha que estávamos construindo um modelo de aprendizagem de máquina para detectar câncer de mama e o conjunto de dados tinha uma variável booleana para o gênero. Este conjunto de dados provavelmente consistiria quase inteiramente de um gênero e, portanto, quase todos os pontos de dados seriam 1. Esta variável teria uma variação extremamente baixa e não seria nada útil para prever a variável alvo.

Esta é uma das abordagens mais simples para a seleção de características. A biblioteca scikit-learn tem um método chamado VarianceThreshold . Este método toma um valor limite e quando ajustado a um conjunto de características removerá quaisquer características abaixo deste limite. O valor padrão para o limite é 0 e isto removerá quaisquer características com variação zero, ou em outras palavras, onde todos os valores são os mesmos.

Vamos aplicar esta configuração padrão ao conjunto de dados de câncer de mama que usamos anteriormente para descobrir se alguma característica é eliminada.

from sklearn.feature_selection import VarianceThresholdX = data.drop('target', axis=1)
selector = VarianceThreshold()
print("Original feature shape:", X.shape)new_X = selector.fit_transform(X)
print("Transformed feature shape:", new_X.shape)

O output mostra que as características transformadas têm a mesma forma, portanto todas as características têm pelo menos alguma variância.

Selecção de características univariadas

Selecção de características univariadas aplica testes estatísticos univariados às características e selecciona as que melhor se realizam nestes testes. Os testes univariados são testes que envolvem apenas uma variável dependente. Isto inclui análise de variância (ANOVA), regressões lineares e testes t de médias.

Again scikit-learn fornece uma série de métodos de selecção de características que aplicam uma variedade de diferentes testes univariados para encontrar as melhores características para a aprendizagem da máquina.

Aplicaremos um destes, conhecido como SelectKBest ao conjunto de dados do cancro da mama. Esta função selecciona as k melhores características com base num teste estatístico univariado. O valor padrão de k é 10, portanto 10 características serão mantidas, e o teste padrão é f_classif.

O teste f_classif é usado para alvos categóricos como é o caso do conjunto de dados do câncer de mama. Se o alvo for uma variável contínua f_regressão deve ser usada. O teste f_classif é baseado no teste estatístico Análise de Variância (ANOVA) que compara as médias de vários grupos, ou no nosso caso características, e determina se algum desses meios é estatisticamente significativo um do outro.

O código abaixo aplica esta função usando os parâmetros padrão ao conjunto de dados do câncer de mama.

from sklearn.feature_selection import SelectKBestX = data.drop('target', axis=1)
y = data
selector = SelectKBest()
print("Original feature shape:", X.shape)new_X = selector.fit_transform(X, y)
print("Transformed feature shape:", new_X.shape)

O resultado mostra que a função reduziu as características para 10. Poderíamos experimentar diferentes valores de k, treinando múltiplos modelos, até encontrarmos o número ótimo de características.

>

>

>

>

Eliminação de características recursivas

Este método realiza o treinamento do modelo em um conjunto de características cada vez menor. Cada vez que as importâncias ou coeficientes das características são calculados e as características com as notas mais baixas são removidas. No final deste processo, o conjunto ótimo de características é conhecido.

Como este método envolve o treinamento repetitivo de um modelo, precisamos instanciar um estimador primeiro. Este método também funciona melhor se os dados forem escalados pela primeira vez, então eu adicionei uma etapa de pré-processamento que normaliza as características.

from sklearn.feature_selection import RFECV
from sklearn.svm import SVR
from sklearn import preprocessingX_normalized = preprocessing.normalize(X, norm='l2')
y = yestimator = SVR(kernel="linear")
selector = RFECV(estimator, step=1, cv=2)
selector = selector.fit(X, y)
print("Features selected", selector.support_)
print("Feature ranking", selector.ranking_)

A saída abaixo mostra as características que foram selecionadas e sua classificação.

>

Estratégia de características

Quando o objetivo da seleção de características é reduzir a dimensionalidade de um conjunto de dados através da remoção de características desnecessárias, a engenharia de características é transformar as características existentes e construir novas características para melhorar o desempenho de um modelo.

Existem três razões principais pelas quais podemos precisar executar a engenharia de recursos para desenvolver um modelo ideal.

  1. Os recursos não podem ser utilizados na sua forma bruta. Isto inclui recursos como datas e horas, onde um modelo de aprendizagem da máquina só pode fazer uso das informações contidas neles se elas forem transformadas em uma representação numérica, por exemplo, representação inteira do dia da semana.
  2. Os recursos podem ser usados em sua forma bruta, mas as informações contidas no recurso são mais fortes se os dados forem agregados ou representados de uma forma diferente. Um exemplo aqui pode ser uma característica contendo a idade de uma pessoa, agregando as idades em baldes ou caixas pode representar melhor a relação com o alvo.
  3. Uma característica por si só não tem uma relação estatística suficientemente forte com o alvo, mas quando combinada com outra característica tem uma relação significativa. Digamos que temos um conjunto de dados que tem uma série de características baseadas no histórico de crédito de um grupo de clientes e um alvo que denota se eles têm inadimplência em relação a um empréstimo. Suponha que tenhamos um valor de empréstimo e um valor de salário. Se os combinarmos numa nova funcionalidade chamada “loan to salary ratio” isto pode dar mais ou melhor informação do que essas funcionalidades sozinhas.

Angenharia de funcionalidades manuais

Angenharia de funcionalidades pode ser realizada através de análise de dados, intuição e conhecimento de domínio. Muitas vezes são executadas técnicas similares às usadas para a seleção manual de recursos.

Por exemplo, observar como os recursos se correlacionam com o alvo e como eles se comportam em termos de importância do recurso indica quais recursos devem ser mais explorados em termos de análise.

Se voltarmos ao exemplo do conjunto de dados do empréstimo, imaginemos que temos uma variável de idade que a partir de um gráfico de correlação parece ter alguma relação com a variável alvo. Podemos descobrir, quando analisarmos mais a fundo esta relação, que aqueles que estão por defeito estão enviesados para um determinado grupo etário. Neste caso, podemos engendrar uma característica que escolhe este grupo etário e isto pode fornecer melhores informações ao modelo.

Automated feature engineering

A engenharia manual de características pode ser um processo extremamente demorado e requer uma grande quantidade de intuição humana e conhecimento de domínio para se acertar. Há ferramentas disponíveis que têm a capacidade de sintetizar automaticamente um grande número de novos recursos.

A biblioteca de pitões de ferramentas de recursos é um exemplo de ferramenta que pode realizar engenharia automatizada de recursos em um conjunto de dados. Vamos instalar esta biblioteca e dar um exemplo de engenharia automatizada de recursos no conjunto de dados do câncer de mama.

As ferramentas de recursos podem ser instaladas via pip.

pip install featuretools

As ferramentas de recursos são projetadas para trabalhar com conjuntos de dados relacionais (tabelas ou quadros de dados que podem ser unidos com um identificador único). A biblioteca de ferramentas de características refere-se a cada tabela como uma entidade.

O conjunto de dados do câncer de mama consiste em apenas uma entidade, mas ainda podemos usar as ferramentas de características para gerar as características. No entanto, precisamos primeiro criar uma nova coluna contendo um identificador único. O código abaixo usa o índice do quadro de dados para criar uma nova coluna de id.

data = data.index + 1

Próximo, importamos as ferramentas de recursos e criamos o conjunto de entidades.

import featuretools as ftes = ft.EntitySet(id = 'data')
es.entity_from_dataframe(entity_id = 'data', dataframe = data, index = 'id')

Esta dá a seguinte saída.

Agora podemos usar a biblioteca para realizar a síntese de recursos.

>

feature_matrix, feature_names = ft.dfs(entityset=es, 
target_entity = 'data',
max_depth = 2,
verbose = 1,
n_jobs = 3)

Ferramentas de características criou 31 novas características.

>

>

>

>

>

>

Podemos ver todas as novas características executando o seguinte.

feature_matrix.columns

Deixe uma resposta

O seu endereço de email não será publicado.