La comparaison d'entités utilise-t-elle F-regression
la même chose que la corrélation individuelle d'entités avec l'étiquette et l'observation de la valeur ?
J'ai souvent vu mes collègues utiliser une F regression
sé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_regression
dans la sélection des fonctionnalités.
Voici mon code: j'utilise l' mtcars
ensemble 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_regression
donnerait 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.
sklearn
l'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/…Réponses:
TL: DR
Il n'y aura pas de différence si vous
F-regression
calculez simplement la statistique F et choisissez les meilleures fonctionnalités. Il pourrait y avoir une différence dans le classement, en supposant ceF-regression
qui suit: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-regression
prend une étape supplémentaire? Cela fait deux choses:F-regression
Qu'est-ce qu'un test F
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_regression
faireNotez que je ne suis pas familier avec l'implémentation Scikit learn, mais essayons de comprendre ce qui
f_regression
se 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: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_regression
et le classement par corrélation.f_regression
f_regression
Matériel supplémentaire: Voici une introduction au test F qui pourrait vous être utile
la source
J'ai passé un peu de temps à parcourir le code source de Scikit afin de comprendre ce qui se
f_regression
passe, 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'utilisationLinearRegression(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_regression
center
False
SelectKBest
LinearRegression
f_regression
LinearRegression
SelectKBest
la source