Blog
DATA SCIENCE
22
Abr
2019
SELEÇÃO DE VARIÁVEIS APLICADA A REGRESSÃO LOGÍSTICA EM MACHINE LEARNING

SELEÇÃO DE VARIÁVEIS APLICADA A REGRESSÃO LOGÍSTICA EM MACHINE LEARNING

Como Lean Sigma Master Black Belt a seleção de características relevantes de um processo é um passo crucial para entender e melhorar o mesmo o que vai de encontro com a definição da wikipedia quando falamos de seleção de características ou feature selection seleção de características é o processo de selecionar um conjunto de características relevantes para construir um modelo. Bom, em outras palavras poderíamos dizer que é a seleção das características mais importantes ou de maior interesse.

Em condições normais o conhecimento do processo desempenha um papel importantíssimo nessa atividade nos permitindo selecionar as características que acreditamos ser as mais importantes. Por exemplo, na predição de TMA  (Tempo Médio de Atendimento), o script de atendimento e a árvore de decisão são constantemente consideradas características importantes

Infelizmente, na competição Dont Overfit II, o uso do conhecimento do processo é impossível uma vez que temos uma saída binária e 300 variáveis contínuas de origem misteriosa nos forçando a tentar técnicas automáticas de seleção de características

A competição você pode encontrar aqui.

 

Seleção de Característica vs Redução de Dimensionalidade

Geralmente, seleção de característica e redução de dimensionalidade e trabalham juntas, da mesma forma que você verá neste artigo. Enquanto os dois servem para reduzir o número de características em um conjunto de dados, ainda sim existe uma diferença entre eles.

Seleção de características é simplesmente selecionar e excluir dadas características sem modificá-las

Redução de Dimensionalidade transforma características em uma dimensão menor.

Neste artigo vou explorar a seguintes técnicas de redução de dimensionalidade e seleção de características:

Seleção de Características

  • Remoção de Características com Valores Faltantes
  • Remoção de Características com Baixa Variância
  • Remoção de Característica com Alta Correlação
  • Seleção de Característica Univariada
  • Eliminação Recursiva de Característica
  • Seleção de Característica utilizando SelectFromModel

Redução de Dimensionalidade

  • PCA (Principal Components Analysis)

Modelo de Base

Vou utlizar a Regressão Logística como modelo de base. Vamos primeiramente separar dados para teste e treino e logo em seguida modificar a escala dos dados.

# preparando pada o modelo
X_train_df = train.drop(['id', 'target'], axis=1)
y_train = train['target']

# modificando a escala dos dados
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train_df)

lr = LogisticRegression(solver='liblinear')
lr_scores = cross_val_score(lr,
                            X_train,
                            y_train,
                            cv=5,
                            scoring='roc_auc')

print('LR Scores: ', lr_scores)

LR Scores:  [0.80729167 0.71875    0.734375   0.80034722 0.66319444]

Como podemos ver o modelo está com overfitting a partir da variação nos scores de validação cruzada. Então, podemos tentar melhorar estas pontuações por meio da seleção de características.


Remover Características com Valores Faltantes

Conferir valores faltantes é o primeiro bom passo em qualquer atividade de machine learning. Podemos então remover colunas que excedam uma quantidade máxima que definimos.

# checando valores faltantes
train.isnull().any().any()

False

Infelizmente para os nossos esforços de redução de dimensionalidade, este conjunto de dados possui zero números faltantes.

Remover Características com Pouca Variância

No modulo de seleção de característica do sklearn encontramos VarianceThreshold. Isso remove todas as características que não atendam um limite mínimo. Por padrão ele remove características que 0 de variância ou que tenham o mesmo valor para todas as linhas.

from sklearn import feature_selection

sel = feature_selection.VarianceThreshold()
train_variance = sel.fit_transform(train)
train_variance.shape

(250, 302)

A descrição da competição define que nossas características são todas contínuas bem como podemos ver por cima que não há características com o mesmo valor nas colunas, então não temos nenhuma para remover por esta técnica.

Podemos sempre visitar esta técnica e considerer remover características com baixa variância.

Remover Características Altamente Correlacionadas

Características que são altamente correlacionadas ou colineares podem causar também overfitting.

Quando um par de variáveis são altamente correlacionadas nós podemos remover uma para reduzir a dimensionalidade sem uma perda muito grande de informação. Mas qual delas manter? Aquela com a maior correlação com o alvo.

Vamos explorar as correlações entre as nossas características:

# encontrando correlação com o alvo
corr_matrix = train.corr().abs()

print(corr_matrix['target'].sort_values(ascending=False).head(10))

target    1.000000
33        0.373608
65        0.293846
217       0.207215
117       0.197496
91        0.192536
24        0.173096
295       0.170501
73        0.167557
183       0.164146

Aqui nós vemos as características com maior correlação em relação a variável alvo. A característica 33 é a com maior correlação, mas coo o seu valor de correlação é somente 0.37, isso significa que que possui uma correlação positiva fraca.

Também podemos conferir a correlação das características entre si. Abaixo podemos visualizar uma matriz de correlação que que nos parece que quase nenhuma das nossas características estão altamente correlacionadas entre si.m

 

primeira.png
Matriz de Corelação

Vamos retirar características com um valor de correlação maior que 0.5:

# Localizar e retirar colunas de características com alta correlação entre si
to_drop = [column for column in matrix.columns if any(matrix[column] > 0.50)]
print('Columns to drop: ' , (len(to_drop)))

Columns to drop: 0

Mais uma vez não temos nenhuma coluna a retirar utilizando o localizador de características altamente correlacionadas. Então, vamos continuar explorando outras estratégias.

Seleção Univariada de Característica

A Seleção Univariada de Características funciona selecionando as melhores características com base em testes estatísticos univariados.
Podemos usar o SelectKBest da sklearn para selecionar vários recursos a serem mantidos. Esse método usa testes estatísticos para selecionar recursos com a maior correlação em relação ao alvo. Aqui vamos manter os 100 principais recursos.

from sklearn.feature_selection import SelectKBest, f_classif

# feature extraction
k_best = SelectKBest(score_func=f_classif, k=100)

# fit on train set
fit = k_best.fit(X_train, y_train)

# transform train set
univariate_features = fit.transform(X_train)

Eliminação Recursiva de Característica

A seleção por Eliminação Recursiva de Característica eliminando as menos importantes. E continua recursvamente até que um número especificado de características é alcançado. A eliminação recursive pode ser utilizada com qualquer modelo que determina peso a características tanto pelo coef_ ou feature_importances_

Aqui vamos utilizar o Algoritmo Random Forest para selecionaras 100 melhores características:

 

from sklearn.feature_selection import RFE

# extração de característica
rfe = RFE(rfc, n_features_to_select=100)

# aplicação no conjunto treino
fit = rfe.fit(X_train, y_train)

# transformação do conjunto treino
recursive_features = fit.transform(X_train)

Seleção de Característica utilizando o SelectFromModel

Igualmente a seleção recursive de característica o SelectFromModel do sklearn utiliza um valor para atributo para estimar que possua um coef_ ou feature_importances_. Isso remove características com valores abaixo de um limite definido

from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestClassifier

# definição do modelo
rfc = RandomForestClassifier(n_estimators=100)

# extração de característica
select_model = feature_selection.SelectFromModel(rfc)

# aplicação no conjunto treino
fit = select_model.fit(X_train, y_train)

# transformando conjunto treino
model_features = fit.transform(X_train)

PCA

PCA (Análise dos Camponentes Principais) é uma técnica de redução de dimensionalidade que projeta os dados em um espaço dimensional menor.
Embora existam muitas técnicas eficazes de redução de dimensionalidade, o PCA é o único exemplo que exploraremos aqui.
A PCA pode ser útil em muitas situações, mas especialmente em casos com multicolinearidade excessiva ou que a explicação de preditores não é uma prioridade.
Aqui vamos aplicar o PCA e manter 90% da variação:

from sklearn.decomposition import PCA
# pca - manter 90% da variância
pca = PCA(0.90)

principal_components = pca.fit_transform(X_train)
principal_df = pd.DataFrame(data = principal_components)

print(principal_df.shape)

(250, 139)

Podemos ver que sobraram 139 características que explicamn 90% da variação nos nossos dados.

Conclusão

A seleção de características é uma parte importante de qualquer processo de machine learning. Aqui nós exploramos vários métodos para seleção e redução de dimensionalidade que podem ajudar a melhorar o desempenho do modelo.

 

 

Everton de Paula

Comente essa publicação