Étant donné la différence entre le codage à chaud et le codage factice, est le pandas.get_dummies
méthode d'encodage à chaud lors de l'utilisation des paramètres par défaut (c'est-à-dire drop_first=False
)?
Dans l'affirmative, est-il logique que je supprime l'interception du modèle de régression logistique? Voici un exemple:
# I assume I have already my dataset in a DataFrame X and the true labels in y
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
X = pd.get_dummies(X)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = .80)
clf = LogisticRegression(fit_intercept=False)
clf.fit(X_train, y_train)
Les variables muettes sont toutes les variables qui sont soit une, soit zéro pour chaque observation. pd.get_dummies
lorsqu'il est appliqué à une colonne de catégories où nous avons ne catégorie par observation produira une nouvelle colonne (variable) pour chaque valeur catégorielle unique. Il en placera un dans la colonne correspondant à la valeur catégorielle présente pour cette observation. Cela équivaut à un encodage à chaud.
Le codage à chaud se caractérise par le fait qu'il n'y en a qu'une par ensemble de valeurs catégorielles par observation.
Considérez la série s
s = pd.Series(list('AABBCCABCDDEE'))
s
0 A
1 A
2 B
3 B
4 C
5 C
6 A
7 B
8 C
9 D
10 D
11 E
12 E
dtype: object
pd.get_dummies
produira un encodage à chaud. Et oui! il est absolument approprié de ne pas correspondre à l'interception.
pd.get_dummies(s)
A B C D E
0 1 0 0 0 0
1 1 0 0 0 0
2 0 1 0 0 0
3 0 1 0 0 0
4 0 0 1 0 0
5 0 0 1 0 0
6 1 0 0 0 0
7 0 1 0 0 0
8 0 0 1 0 0
9 0 0 0 1 0
10 0 0 0 1 0
11 0 0 0 0 1
12 0 0 0 0 1
Cependant, si vous aviez s
incluez des données différentes et utilisiez pd.Series.str.get_dummies
s = pd.Series('A|B,A,B,B,C|D,D|B,A,B,C,A|D'.split(','))
s
0 A|B
1 A
2 B
3 B
4 C|D
5 D|B
6 A
7 B
8 C
9 A|D
dtype: object
Alors get_dummies
produit des variables factices qui ne sont pas codées à chaud et vous pourriez théoriquement quitter l'interception.
s.str.get_dummies()
A B C D
0 1 1 0 0
1 1 0 0 0
2 0 1 0 0
3 0 1 0 0
4 0 0 1 1
5 0 1 0 1
6 1 0 0 0
7 0 1 0 0
8 0 0 1 0
9 1 0 0 1
Première question : oui, pd.get_dummies()
est un codage à chaud dans son état par défaut; voir l'exemple ci-dessous, de pd.get_dummies docs :
s = pd.Series(list('abca'))
pd.get_dummies(s, drop_first=False)
Deuxième question : [édité maintenant que OP inclut un exemple de code] oui, si vous codez à chaud les entrées d'un modèle de régression logistique, il convient pour sauter l'interception.