Está comparando recursos usando F-regression
o mesmo que correlacionando recursos com o rótulo individualmente e observando o 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_regression
na seleção de recursos.
Aqui está o meu código: estou usando o mtcars
conjunto 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_regression
isso 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.
sklearn
refere-se a regressão F, o que talvez seja um pouco enganador, pois na verdade é um teste. scikit-learn.org/stable/modules/generated/…Respostas:
TL: DR
Não haverá diferença se
F-regression
apenas computar a estatística F e escolher os melhores recursos. Pode haver uma diferença na classificação, assumindoF-regression
o seguinte: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-regression
dá um passo adicional? Faz duas coisas: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 umM0 M1 M0 M1 M0 valor- 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_regression
fazObserve que eu não estou familiarizado com a implementação do Scikit learn, mas vamos tentar descobrir o que
f_regression
está 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:Por enquanto, acho que é uma aproximação suficientemente próxima para responder sua pergunta; existe uma diferença entre a classificação de
f_regression
e 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.M0 M1 M0 M1 M2
f_regression
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,x3 x1 x2 y x3 y x1 x2 x1 M1 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 2x3 M2 x2 x3 y x1 x2
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.M0
f_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.p k
Material adicional: Aqui está uma introdução ao teste F que você pode achar útil
fonte
Passei algum tempo pesquisando o código-fonte do Scikit para entender o que
f_regression
faz e gostaria de postar minhas observações aqui.A pergunta original era:
P :
SelectKBest(f_regression, k = 4)
Produz o mesmo resultado que o usoLinearRegression(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 queX e matriz y . Para cada recursoX[ : , i ] calcula a correlação com y :
f_regression
faz, na matriz de entradacenter
isFalse
; then it multiplies withSelectKBest
takes the first component of this tuple (these will be the scores), sorts it, and picks the firstNow letR2i be the score computed by X[:,i] and y . This is a regression on a single variable, so R2i=ρ2i . Then
LinearRegression
forf_regression
andLinearRegression
. Although one could construct a model sequentially, this is not whatSelectKBest
does.fonte