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