Diferença entre selecionar recursos com base em "regressão F" e com base em

14

Está comparando recursos usando F-regressiono mesmo que correlacionando recursos com o rótulo individualmente e observando o R2 valor?

Muitas vezes vi meus colegas usarem um F regression seleção de recursos em seu pipeline de aprendizado de máquina em sklearn:

sklearn.feature_selection.SelectKBest(score_func=sklearn.feature_selection.f_regression...)`  

Alguns me dizem - por que eles dão os mesmos resultados que apenas correlacioná-los com a variável label / depedendent?

Não está claro para mim a vantagem de usar F_regressionna seleção de recursos.

Aqui está o meu código: estou usando o mtcarsconjunto de dados de R:

import pandas as pd
import numpy as np
from sklearn import feature_selection
from sklearn.linear_model import LinearRegression

#....load mtcars dataset into a pandas dataframe called "df", not shown here for conciseness

# only using these numerical columns as features ['mpg', 'disp', 'drat', 'wt']
# using this column as the label:  ['qsec']

model = feature_selection.SelectKBest(score_func=feature_selection.f_regression,\
                                      k=4)

results = model.fit(df[columns], df['qsec'])

print results.scores_
print results.pvalues_

# Using just correlation coefficient:

columns = ['mpg', 'disp', 'drat', 'wt']
for col in columns:
    lm = LinearRegression(fit_intercept=True)
    lm.fit(df[[col]], df['qsec'])
    print lm.score(df[[col]], df['qsec'])

Como se suspeita, a classificação dos recursos é exatamente a mesma:

scores using f_regression:

[ 6.376702    6.95008354  0.25164249  0.94460378]


 scores using coefficient of determination:

0.175296320261  
0.18809385182
0.00831830818303
0.0305256382746

Como você pode ver, o segundo recurso é classificado como o mais alto, o primeiro é o segundo, o quarto é o terceiro e o terceiro é o último, nos dois casos.

Existe um caso em que F_regressionisso daria resultados diferentes ou classificasse os recursos de maneira diferente?

EDIT: Para resumir, eu gostaria de saber se essas duas classificações de recursos já deram resultados diferentes:

1) classificar os recursos pela estatística F ao regredi-los com o resultado individualmente (é isso que o sklearn faz) AND,

2) classificar as características pelo seu valor ao quadrado R ao regredi-las com o resultado, novamente individualmente.

Hunle
fonte
O SO caiu imediatamente depois que eu postei isso, o que certamente prejudicou as chances de conseguir alguma atenção.
Hunle
1
Sua pergunta contém o termo "regressão-F". O que é isso e como é diferente da regressão? ... (Editar :) Algo me ocorre agora: você está se referindo a um teste F (ou talvez apenas uma estatística F) para a regressão geral contra um nulo-nulo (isto é, somente interceptação)?
Glen_b -Reinstala Monica
Estou me referindo ao teste F. Na regressão, o teste F e, portanto, a estatística F, é usado para testar a hipótese nula de que não há relação entre o regressor e o resultado / rótulo. sklearnrefere-se a regressão F, o que talvez seja um pouco enganador, pois na verdade é um teste. scikit-learn.org/stable/modules/generated/…
Hunle
O seu comentário não sugere que você só tem uma variável regressor (caso em que por que você está falando sobre a seleção recurso?)
Glen_b -Reinstate Monica
2
Você poderia editar essa explicação em sua pergunta?
Glen_b -Reinstala Monica

Respostas:

12

TL: DR

Não haverá diferença se F-regressionapenas computar a estatística F e escolher os melhores recursos. Pode haver uma diferença na classificação, assumindo F-regressiono seguinte:

  • Comece com um modelo constante, M0 0
  • Experimente todos os modelos compostos por apenas um recurso e escolha o melhor de acordo com a estatística FM1
  • Experimente todos os modelos compostos por M 1 mais um outro recurso e escolha os melhores ...M2M1

Como a correlação não será a mesma em cada iteração. Mas você ainda pode obter esse ranking apenas calculando a correlação em cada etapa, então por que F-regressiondá um passo adicional? Faz duas coisas:

  • Seleção de recursos: se você deseja selecionar os melhores recursos em um pipeline de aprendizado de máquina, onde você se preocupa apenas com a precisão e possui medidas para ajustar o under / overfitting, você pode se preocupar apenas com a classificação e o cálculo adicional não é útil.k
  • Teste de significância: se você estiver tentando entender o efeito de algumas variáveis ​​em uma saída em um estudo, convém criar um modelo linear e incluir apenas as variáveis ​​que estão melhorando significativamente seu modelo, com relação a alguns p valor . Aqui, F-regressioné útil.

O que é um teste F

Um teste F (Wikipedia) é uma maneira de comparar a importância da melhoria de um modelo, com relação à adição de novas variáveis. Você pode usá-lo quando tiver um modelo básico e um modelo mais complicado M 1 , que contém todas as variáveis ​​de M 0 e um pouco mais. O teste F indica se M 1 é significativamente melhor que M 0 , em relação a umM0M1M0M1M0valor- p .p

Para fazer isso, ele usa a soma residual dos quadrados como uma medida de erro e compara a redução no erro com o número de variáveis ​​adicionadas e o número de observação (mais detalhes na Wikipedia ). A adição de variáveis, mesmo que sejam completamente aleatórias, deverá sempre ajudar o modelo a obter um erro menor ao adicionar outra dimensão. O objetivo é descobrir se os novos recursos são realmente úteis ou se são números aleatórios, mas ainda ajudam o modelo porque adicionam uma dimensão.


O que f_regressionfaz

Observe que eu não estou familiarizado com a implementação do Scikit learn, mas vamos tentar descobrir o que f_regressionestá fazendo. A documentação afirma que o procedimento é seqüencial. Se a palavra sequencial significa o mesmo que em outros pacotes estatísticos, como Matlab Sequential Feature Selection , eis como eu esperaria que ela prosseguisse:

  • Comece com um modelo constante, M0
  • Experimente todos os modelos M1 compostos por apenas um recurso e escolha o melhor de acordo com a estatística F
  • Experimente todos os modelos constituídos por M 1M2M1 mais um outro recurso e escolha os melhores ...

Por enquanto, acho que é uma aproximação suficientemente próxima para responder sua pergunta; existe uma diferença entre a classificação de f_regressione classificação por correlação.

Se você começar com o modelo constante e tentar encontrar o melhor modelo com apenas um recurso, M 1 , selecionará o mesmo recurso, seja usando sua abordagem baseada em correlação, pois ambos são uma medida de dependência linear. Mas se você fosse de M 0 para M 1 e depois para M 2 , haveria uma diferença na sua pontuação.M0M1f_regressionM0M1M2

Suponha que você tenha três recursos, , em que ambos x 1 e x 2 estão altamente correlacionados com a saída y , mas também altamente correlacionados um com o outro, enquanto x 3 é apenas intermediário com y . Seu método de pontuação atribuiria as melhores pontuações a x 1 e x 2 , mas o método seqüencial pode não. Na primeira rodada, ele escolheria o melhor recurso, digamos x 1 , para criar M 1 . Então, avaliaria tantox1,x2,x3x1x2yx3yx1x2x1M1 e. É assim que os dois procedimentos que você propõe são diferentes.x2 para M 2 . Como x 2 está altamente correlacionado com um recurso já selecionado, a maioria das informações que ele contém já está incorporada ao modelo e, portanto, o procedimento pode selecionar x 3 . Embora seja menos correlacionado com y , é mais correlacionado com osresíduos, a parte que x 1 ainda não explica, que x 2x3M2x2x3yx1x2

Você ainda pode emular o mesmo efeito com sua ideia, construindo seu modelo sequencialmente e medindo a diferença de ganho para cada recurso adicional, em vez de compará-los ao modelo constante como você está fazendo agora. O resultado não seria diferente dos resultados. A razão para esta função existir é fornecer essa seleção seqüencial de recursos e, adicionalmente, converte o resultado em uma medida F que você pode usar para avaliar a significância.M0f_regression


O objetivo do teste F é fornecer nível de significância. Se você deseja garantir que os recursos incluídos sejam significativos em relação ao seu valor- , use um teste-F. Se você quiser incluir apenas os k melhores recursos, poderá usar apenas a correlação.pk


Material adicional: Aqui está uma introdução ao teste F que você pode achar útil

Winks
fonte
OK, agora vejo como esse método de seleção de recursos pode proteger contra a multicolinearidade. Suponho que, se estou executando algo como uma Floresta Aleatória, que não é tão suscetível à multicolinearidade, esse método de seleção de recursos pode não ser o aplicável. obrigado @Winks
Hunle
Cuidado ao usar a correlação apenas como uma medida da importância do recurso. Ele mede a dependência linear entre variáveis ​​e informa que um recurso (pode ser) é bom para um modelo linear . Esta não é uma suposição que você pode fazer para uma floresta aleatória, pois as árvores podem aprender muito mais que relações lineares. Correlação não é tudo o que existe (consulte Anscombe Dataset (Wikipedia) .
Winks
Qual é o " pequeno problema com valores-p " a que você se refere? E existe um problema de múltiplas comparações, já que testamos os mesmos dados a cada vez?
Hunle
M2R2
1
@Hunle Adicionei o motivo para usar um teste F no final da minha resposta. Basicamente, é se você se importa com o significado. Em relação ao pequeno problema comp -Valores , eu acho que você está no ponto. Parece-me que estamos testando a mesma coisa várias vezes ( XKCD obrigatório ). No entanto, como o teste F é usado na prática, ele pode 1) não fazer o que eu acho que faz 2) não ser um problema, pois não estamos testando exatamente a mesma coisa em cada etapa.
Winks
16

Passei algum tempo pesquisando o código-fonte do Scikit para entender o que f_regressionfaz e gostaria de postar minhas observações aqui.

A pergunta original era:

P : SelectKBest(f_regression, k = 4)Produz o mesmo resultado que o uso LinearRegression(fit_intercept=True)e a escolha dos quatro primeiros recursos com as pontuações mais altas?

A resposta é sim . Além disso, a ordem relativa dada pelas pontuações é a mesma.

Aqui está o que f_regressionfaz, na matriz de entradaX e matriz y. Para cada recursoX[:,Eu] calcula a correlação com y:

ρi=(X[:,i]mean(X[:,i]))(ymean(y))std(X[:,i])std(y).
Then it computes the F-statistic
Fi=ρi21ρi2(n2),
where n=len(y), the number of samples (there is a slight difference if parameter center is False; then it multiplies with n1). These F-values are then returned, together with the associated p-values. So the result is a tuple (F-values, p-values). Then SelectKBest takes the first component of this tuple (these will be the scores), sorts it, and picks the first k features of X with the highest scores. There is no sequential application or anything, and the p-values are not used either.

Now let Ri2 be the score computed by LinearRegression for X[:,i] and y. This is a regression on a single variable, so Ri2=ρi2. Then

Ri2<Rj2ρi21ρi2<ρj21ρj2Fi<Fj.
Hence there is no difference between f_regression and LinearRegression. Although one could construct a model sequentially, this is not what SelectKBest does.
user43451
fonte
2
Wow, so` SelectKBest` does not construct a model sequentially.
Hunle
For what it's worth, I agree with user43451's interpretation. And, I wish sklearn would just call it a correlation ranking of single features. F-test, for me, bring in the notion of sequential models as Winks alluded to in his accepted answer.
MrDrFenner