Mat*_*rna 10 python pandas scikit-learn
鉴于 one-hot编码和虚拟编码之间的区别,pandas.get_dummies使用默认参数(即drop_first=False)时,方法是单热编码?
如果是这样,我从逻辑回归模型中删除截距是否有意义?这是一个例子:
# 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)
Run Code Online (Sandbox Code Playgroud)
piR*_*red 21
虚拟变量是每个观察值为1或0的任何变量. pd.get_dummies当应用于每个观察一个类别的类别列时,将为每个唯一的分类值生成一个新列(变量).它将在列中放置一个对应于该观察的分类值.这相当于一个热编码.
单热编码的特征在于每次观察每组分类值仅有一个.
考虑这个系列 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
Run Code Online (Sandbox Code Playgroud)
pd.get_dummies将产生一个热门编码.是的!不适合拦截是绝对合适的.
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
Run Code Online (Sandbox Code Playgroud)
但是,如果您s包含了不同的数据并使用过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
Run Code Online (Sandbox Code Playgroud)
然后get_dummies生成不是单热编码的虚拟变量,理论上你可以离开截距.
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
Run Code Online (Sandbox Code Playgroud)
第一个问题:是的,pd.get_dummies()默认状态下是one-hot编码;请参阅下面的示例,来自pd.get_dummies 文档:
s = pd.Series(list('abca'))
pd.get_dummies(s, drop_first=False)
Run Code Online (Sandbox Code Playgroud)
第二个问题:[编辑现在 OP 包含代码示例] 是的,如果您对逻辑回归模型的输入进行单热编码,则跳过拦截是合适的。
| 归档时间: |
|
| 查看次数: |
7153 次 |
| 最近记录: |