7

用分类数据的功能我想了解如何使用分类数据作为sklearn.linear_modelLogisticRegression功能。在sklean逻辑回归

我明白了,我当然要对其进行编码。

  1. 我不明白的是如何编码的功能传递给Logistic回归,所以它作为一个明确的功能处理,而不是解释为标准量化的特征编码时,它得到了int值。

  2. (不太重要)有人能解释一下使用preprocessing.LabelEncoder()DictVectorizer.vocabulary或只是一个简单的字典编码自己分类数据之间的差异? Alex A.'s comment here涉及这个问题,但不是很深入。

尤其是第一个!

回答

1
  1. 斯坦达特方式范畴的功能转换成数字 - OneHotEncoding
  2. 这是完全不同的类别:

    [DictVectorizer][2].vocabulary_

    对应的字典功能名称功能指标。

    即后fit()DictVectorizer具有所有可能的功能名称,而现在它知道在特定的列会放置特征的特定值。所以DictVectorizer.vocabulary_包含indicies的特点,而不是价值。

    LabelEncoder相反地图的每个可能的标签(标签可以是字符串或整数),以某个整数值,并返回这些整数值的一维向量。

+0

感谢您的回复。转换本身不是问题(我认为),我主要关心的是后勤注册会将数值视为标准数值,因此如果Cat编码为1和狗作为2,它会假设'狗'的观察结果具有'更多'该属性,而我们知道分配的值是没有意义的。 – Optimesh

+0

@Optimesh,你是什么意思的“编码”?如果你正在谈论目标变量 - 目标没有问题[1,2,3],LogisticRegression将简单地构建3(在这种特殊情况下)分类器并将它们组合到OneVsRest方案中。 如果您在谈论功能 - OneHotEncoder将以二进制格式对每个分类功能进行编码,即它将创建新的二进制功能,而不是分类功能的每个可能的值,即结果数据集将具有用于值的单独二进制功能(列)Dog = 1,Dog = 2,Dog = 3,Cat = 1等。查看官方文档中的示例。 –

3

您可以为不同类别创建指标变量。例如:

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. 
+0

感谢您的回复。考虑到这一点,但我想到的特点是超过40个分类值(猫,狗,大象,狮子,..............)。一定有更好的方法。 – Optimesh

+0

我不确定你想要什么吗?你可以把他们分成更大的类别?或者将这些类别映射到一个'n'维向量空间? (例如将动物名称映射到2维向量空间(身高,体重))。但是如果你想把每个类别当作自己的独特类别,这就是你(通常用于回归)必须做的。如果您认为效果可能按类别变化,则您必须将所有类别与您的其他回归者的所有互动条款都包含在内。也许sklearn会在幕后为你做这件事(我不知道),但这可能会发生。 –

+0

@Optimesh,没有更好的方法,但是可以通过FeatureHashing或更复杂的技术(如PCA等)降低维度。此外,本文提出了相同的一种热门编码技术。 –

0

假设每个分类变量的类型是“object”。首先,你可以创建类别列名的panda.index

import pandas as pd  
catColumns = df.select_dtypes(['object']).columns 

然后,您可以使用一个for循环下面创建指标变量。对于二元分类变量,请使用LabelEncoder()将其转换为01。对于具有两个以上类别的分类变量,请使用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]) 
+1

在最近的sklearn版本中,您现在可以将le.fit用于具有两个以上类的分类变量。 – Bismarck