Différence entre la sélection d'entités basée sur la «régression F» et basée sur les valeurs ?

15

La comparaison d'entités utilise-t-elle F-regressionla même chose que la corrélation individuelle d'entités avec l'étiquette et l'observation de la valeur ?R2

J'ai souvent vu mes collègues utiliser une F regressionsélection de fonctionnalités dans leur pipeline d'apprentissage automatique à partir de sklearn:

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

Certains me disent s'il vous plaît - pourquoi cela donne-t-il les mêmes résultats que simplement le corrélant avec l'étiquette / la variable dépendante?

Il n'est pas clair pour moi l'avantage d'utiliser F_regressiondans la sélection des fonctionnalités.

Voici mon code: j'utilise l' mtcarsensemble de données 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'])

Comme suspect, le classement des fonctionnalités est exactement le même:

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

Comme vous pouvez le voir, la deuxième fonctionnalité est classée la plus élevée, la première fonctionnalité est deuxième, la quatrième fonctionnalité est troisième et la troisième fonctionnalité est la dernière, dans les deux cas.

Y a-t-il jamais un cas où le F_regressiondonnerait des résultats différents ou classerait les caractéristiques différemment d'une manière ou d'une autre?

EDIT: Pour résumer, j'aimerais savoir si ces deux classements de fonctionnalités donnent jamais des résultats différents:

1) classer les caractéristiques selon leur statistique F lors de leur régression avec le résultat individuellement (c'est ce que fait sklearn) ET,

2) classer les entités par leur valeur R au carré lors de leur régression avec le résultat, encore une fois individuellement.

Hunle
la source
SO a baissé immédiatement après que j'ai posté cela, ce qui, je suis sûr, a nui aux chances qu'il attire l'attention.
Hunle
1
Votre question contient le terme "régression F". Qu'est-ce que c'est et en quoi est-ce différent de la régression? ... (Edit :) Quelque chose me vient à l'esprit en ce moment: faites-vous référence à un test F (ou peut-être juste une statistique F) pour la régression globale contre un zéro nul (c'est-à-dire une interception uniquement)?
Glen_b -Reinstate Monica
Je fais référence au test F. En régression, le test F et donc la statistique F sont utilisés pour tester l'hypothèse nulle selon laquelle il n'y a pas de relation entre le régresseur et le résultat / label. sklearnl'appelle la régression F, ce qui est peut-être un peu trompeur car il s'agit en fait d'un test. scikit-learn.org/stable/modules/generated/…
Hunle
Votre commentaire suggère que vous n'avez qu'une seule variable de régression (dans ce cas, pourquoi parlez-vous de la sélection des fonctionnalités?)
Glen_b -Reinstate Monica
2
Pourriez-vous modifier cette explication dans votre question?
Glen_b -Reinstate Monica

Réponses:

15

TL: DR

Il n'y aura pas de différence si vous F-regressioncalculez simplement la statistique F et choisissez les meilleures fonctionnalités. Il pourrait y avoir une différence dans le classement, en supposant ce F-regressionqui suit:

  • Commencez avec un modèle constant,M0
  • Essayez tous les modèles composés d'une seule fonctionnalité et choisissez le meilleur en fonction de la statistique FM1
  • Essayez tous les modèles comprenant plus une autre fonctionnalité et choisissez le meilleur ...M 1M2M1

Comme la corrélation ne sera pas la même à chaque itération. Mais vous pouvez toujours obtenir ce classement en calculant simplement la corrélation à chaque étape, alors pourquoi F-regressionprend une étape supplémentaire? Cela fait deux choses:

  • Sélection des fonctionnalités: si vous souhaitez sélectionner les meilleures fonctionnalités dans un pipeline d'apprentissage automatique, où vous ne vous souciez que de la précision et avez des mesures pour ajuster le sous / sur-ajustement, vous ne pouvez vous soucier que du classement et le calcul supplémentaire n'est pas utile.k
  • Test de signification: si vous essayez de comprendre l'effet de certaines variables sur un résultat dans une étude, vous souhaiterez peut-être créer un modèle linéaire et n'inclure que les variables qui améliorent considérablement votre modèle, par rapport à certaines valeurs de . Ici, c'est pratique.pF-regression

Qu'est-ce qu'un test F

M0M1M0M1M0p

Pour ce faire, il utilise la somme résiduelle des carrés comme mesure d'erreur et compare la réduction d'erreur avec le nombre de variables ajoutées et le nombre d'observations (plus de détails sur Wikipédia ). L'ajout de variables, même si elles sont complètement aléatoires, devrait toujours aider le modèle à réduire l'erreur en ajoutant une autre dimension. Le but est de déterminer si les nouvelles fonctionnalités sont vraiment utiles ou si elles sont des nombres aléatoires mais aident toujours le modèle car elles ajoutent une dimension.


Qu'est - ce que f_regressionfaire

Notez que je ne suis pas familier avec l'implémentation Scikit learn, mais essayons de comprendre ce qui f_regressionse passe. La documentation indique que la procédure est séquentielle. Si le mot séquentiel signifie la même chose que dans d'autres progiciels statistiques, comme Matlab Sequential Feature Selection , voici comment je m'attendrais à ce qu'il procède:

  • M0
  • M1
  • M2M1

Pour l'instant, je pense que c'est une approximation assez proche pour répondre à votre question; existe-t-il une différence entre le classement f_regressionet le classement par corrélation.

M0M1f_regressionM0M1M2

x1,x2,x3x1x2yx3yx1x2x1M1x2x3M2x2x3yx1x2

M0f_regression


pk


Matériel supplémentaire: Voici une introduction au test F qui pourrait vous être utile

Clins d'oeil
la source
OK, maintenant je vois comment cette méthode de sélection des fonctionnalités peut se prémunir contre la multicolinéarité. Je suppose que si j'exécute quelque chose comme une forêt aléatoire, qui n'est pas aussi sensible à la multicolinéarité, cette méthode de sélection des fonctionnalités pourrait ne pas être aussi applicable. merci @Winks
Hunle
Méfiez-vous de l'utilisation de la corrélation uniquement comme mesure de l'importance des caractéristiques. Il mesure la dépendance linéaire entre les variables et vous indique qu'une fonction (peut être) est bonne pour un modèle linéaire . Ce n'est pas une hypothèse que vous pouvez faire pour une forêt aléatoire, car les arbres peuvent en apprendre beaucoup plus que les relations linéaires. La corrélation n'est pas tout ce qu'il y a (voir Anscombe Dataset (Wikipedia) .
Clins d'œil le
Quel est le " léger problème avec les valeurs de p " auquel vous faites référence? Et, y a-t-il un problème de comparaisons multiples puisque nous testons à chaque fois les mêmes données?
Hunle
M2R2
1
p
16

J'ai passé un peu de temps à parcourir le code source de Scikit afin de comprendre ce qui se f_regressionpasse, et je voudrais poster mes observations ici.

La question initiale était:

Q : Produit-il SelectKBest(f_regression, k = 4)le même résultat que l'utilisation LinearRegression(fit_intercept=True)et le choix des 4 premières fonctionnalités avec les scores les plus élevés?

La réponse est oui . De plus, l'ordre relatif donné par les scores est le même.

f_regressionXyX[:,i]y

ρi=(X[:,i]mean(X[:,i]))(ymean(y))std(X[:,i])std(y).
Fi=ρi21ρi2(n2),
n=len(y)centerFalsen1SelectKBestkXavec les scores les plus élevés. Il n'y a pas d'application séquentielle ou quoi que ce soit, et les valeurs de p ne sont pas utilisées non plus.

Ri2LinearRegressionX[:,i]yRi2=ρi2

Ri2<Rj2ρi21ρi2<ρj21ρj2Fi<Fj.
f_regressionLinearRegressionSelectKBest
user43451
la source
2
Wow, donc `SelectKBest` ne construit pas un modèle séquentiellement.
Hunle
Pour ce que ça vaut, je suis d'accord avec l'interprétation de user43451. Et, je souhaite que sklearn l'appelle simplement un classement de corrélation de fonctionnalités uniques. Le test F, pour moi, introduit la notion de modèles séquentiels comme Winks l'a mentionné dans sa réponse acceptée.
MrDrFenner