在sklean逻辑回归
用分类数据的功能我想了解如何使用分类数据作为sklearn.linear_model
的LogisticRegression
功能。在sklean逻辑回归
我明白了,我当然要对其进行编码。
我不明白的是如何编码的功能传递给Logistic回归,所以它作为一个明确的功能处理,而不是解释为标准量化的特征编码时,它得到了int值。
(不太重要)有人能解释一下使用
preprocessing.LabelEncoder()
,DictVectorizer.vocabulary
或只是一个简单的字典编码自己分类数据之间的差异? Alex A.'s comment here涉及这个问题,但不是很深入。
尤其是第一个!
- 斯坦达特方式范畴的功能转换成数字 - OneHotEncoding
-
这是完全不同的类别:
[DictVectorizer][2].vocabulary_
对应的字典功能名称功能指标。
即后
fit()
DictVectorizer
具有所有可能的功能名称,而现在它知道在特定的列会放置特征的特定值。所以DictVectorizer.vocabulary_
包含indicies的特点,而不是价值。LabelEncoder
相反地图的每个可能的标签(标签可以是字符串或整数),以某个整数值,并返回这些整数值的一维向量。
您可以为不同类别创建指标变量。例如:
animal_names = {'mouse';'cat';'dog'}
Indicator_cat = strcmp(animal_names,'cat')
Indicator_dog = strcmp(animal_names,'dog')
然后我们有:
[0 [0
Indicator_cat = 1 Indicator_dog = 0
0] 1]
而且你可以连接这些到你的原始数据矩阵:
X_with_indicator_vars = [X, Indicator_cat, Indicator_dog]
但请记住,以留下一类无如果常数项被包括在数据矩阵的指示符!否则,您的数据矩阵将不会是满栏排名(或者在计量经济学方面,您有多重共线性)。
[1 1 0 0 Notice how constant term, an indicator for mouse,
1 0 1 0 an indicator for ca,t and an indicator for dog
1 0 0 1] leads to a less than full column rank matrix:
the first column is the sum of the last three.
感谢您的回复。考虑到这一点,但我想到的特点是超过40个分类值(猫,狗,大象,狮子,..............)。一定有更好的方法。 – Optimesh
我不确定你想要什么吗?你可以把他们分成更大的类别?或者将这些类别映射到一个'n'维向量空间? (例如将动物名称映射到2维向量空间(身高,体重))。但是如果你想把每个类别当作自己的独特类别,这就是你(通常用于回归)必须做的。如果您认为效果可能按类别变化,则您必须将所有类别与您的其他回归者的所有互动条款都包含在内。也许sklearn会在幕后为你做这件事(我不知道),但这可能会发生。 –
@Optimesh,没有更好的方法,但是可以通过FeatureHashing或更复杂的技术(如PCA等)降低维度。此外,本文提出了相同的一种热门编码技术。 –
假设每个分类变量的类型是“object”。首先,你可以创建类别列名的panda.index
:
import pandas as pd
catColumns = df.select_dtypes(['object']).columns
然后,您可以使用一个for循环下面创建指标变量。对于二元分类变量,请使用LabelEncoder()
将其转换为0
和1
。对于具有两个以上类别的分类变量,请使用pd.getDummies()
来获取指标变量,然后删除一个类别(以避免多重共线性问题)。
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
for col in catColumns:
n = len(df[col].unique())
if (n > 2):
X = pd.get_dummies(df[col])
X = X.drop(X.columns[0], axis=1)
df[X.columns] = X
df.drop(col, axis=1, inplace=True) # drop the original categorical variable (optional)
else:
le.fit(df[col])
df[col] = le.transform(df[col])
在最近的sklearn版本中,您现在可以将le.fit用于具有两个以上类的分类变量。 – Bismarck
感谢您的回复。转换本身不是问题(我认为),我主要关心的是后勤注册会将数值视为标准数值,因此如果Cat编码为1和狗作为2,它会假设'狗'的观察结果具有'更多'该属性,而我们知道分配的值是没有意义的。 – Optimesh
@Optimesh,你是什么意思的“编码”?如果你正在谈论目标变量 - 目标没有问题[1,2,3],LogisticRegression将简单地构建3(在这种特殊情况下)分类器并将它们组合到OneVsRest方案中。 如果您在谈论功能 - OneHotEncoder将以二进制格式对每个分类功能进行编码,即它将创建新的二进制功能,而不是分类功能的每个可能的值,即结果数据集将具有用于值的单独二进制功能(列)Dog = 1,Dog = 2,Dog = 3,Cat = 1等。查看官方文档中的示例。 –