7

Kategorik verilerin nasıl kullanılacağını anlamaya çalışıyorum sklearn.linear_modelLogisticRegression.Kategorik verileri sklean'da özellikler olarak kullanma LogisticRegression

Elbette bunu şifrelemem gerekiyor. Anlamıyorum ne

  1. bir kategorik özellik olarak işlenmiş oluyor böylece Lojistik regresyon için kodlanmış özelliğini geçmek ve standart ölçülebilir özellik olarak kodlayan zaman var int değerini yorumlama değil nasıl olduğunu.

  2. (Daha az önemli) Birisi, preprocessing.LabelEncoder(), DictVectorizer.vocabulary kullanımı arasındaki farkı açıklayabilir mi yoksa yalnızca kategorik verileri kendiniz basit bir kodla kodluyor mu? Konuya Alex A.'s comment here dokunur ama çok derin değil.

Özellikle birincisi ile!

cevap

1
  1. Standart yaklaşım sayısal içine ulamsal özellikleri dönüştürmek için - OneHotEncoding
  2. Bu tamamen farklı sınıflar var: endekslerini özelliği

    [DictVectorizer][2].vocabulary_

    eşleyen bir sözlük özelliği isimleri.

    yani sonra fit()DictVectorizer tüm olası özelliği isimleri vardır ve şimdi özellikle hangi sütunun içinde bir özelliğin amacındadır bilir. Yani DictVectorizer.vocabulary_, belirtiminde belirtiminde bulunur, ancak değerler içermez. Karşılıklı haritalarda, her bir olası etiketin (Etiket, dize veya tamsayı olabilir) bir tamsayı değerine karşılık gelir ve bu tamsayı değerlerinin 1B vektörünü döndürür. .

+0

sayesinde benim asıl sorun Kedi 1 olarak kodlanan eğer öyleyse lojistik reg, standart bir sayısal değer olarak sayısal değerleri dikkate alacaktır olmasıdır ve Köpek 2 olarak, atanan değerlerin anlamsız olduğunu bildiğimiz halde, 'Köpek' ile ilgili gözlemlerin söz konusu mülkün 'daha fazla' olduğunu varsayacaktır. – Optimesh

+0

@Optimesh, "Kodlanmış" ile ne demek istiyorsun? Hedef değişkenler hakkında konuşuyorsanız - hedeflerde [1,2,3] yanlış bir şey yoksa, LogisticRegression basitçe 3 (bu özel durumda) sınıflandırıcılar oluşturacak ve bunları OneVsRest şemasında birleştirecektir. Özellikler hakkında konuşuyorsanız - OneHotEncoder her bir kategorik özelliği ikili biçimde kodlayacaktır, yani kategorik özellik için her bir olası değer yerine yeni ikili özellik yaratacaktır, örneğin sonuç kümesi veri değerleri için ayrılmış ikili özellikler (sütunlar) olacaktır. 1, Köpek = 2, Köpek = 3, Kedi = 1, vb. Resmi belgelerindeki örneklere bakın. –

3

Farklı kategoriler için gösterge değişkenleri oluşturabilirsiniz. Örneğin:

   [0       [0 
Indicator_cat = 1  Indicator_dog = 0 
       0]       1] 

Ve Özgün veri matrisi üzerine bu arada kullanabilirsiniz:

animal_names = {'mouse';'cat';'dog'} 

Indicator_cat = strcmp(animal_names,'cat') 
Indicator_dog = strcmp(animal_names,'dog') 

Sonra elimizdeki

X_with_indicator_vars = [X, Indicator_cat, Indicator_dog] 

olmadan bir kategori ayrılmak olsa hatırla Veri matrisinde sabit bir terim varsa bir gösterge! Aksi takdirde, veri matrisiniz tam sütun sıralaması olmayacaktır (ya da ekonometrik olarak, çok değişkenli olmanız gerekir).

[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

Yanıt için teşekkürler. Bunu düşündüm, ama aklımda olan özellik 40 kategorik değerleri (kedi, köpek, fil, aslan, ..............) var. Daha iyi bir yolu olmalı. – Optimesh

+0

O zaman ne istediğinden emin değilim? Bunları daha büyük kategorilere ayırabilirsiniz? Veya kategorileri bir "n" boyutlu vektör uzayında mı eşleştirelim? (ör. 2 boyutlu vektör uzayına harita hayvan ismi (yükseklik, ağırlık)). Ama eğer her kategoriyi kendi benzersiz kategorisi olarak ele almak istiyorsanız, (genel olarak regresyon için) yapmak zorunda olduğunuz şey budur. Ve etkilerin kategoriye göre VARY olduğunu varsayarsanız, kategorilerinizin tüm etkileşim koşullarını diğer regresörlerinizle de almanız gerekir. Belki de sklearn bunu sahnelerin ardında yapar (hiçbir fikrim yok), ama bu muhtemelen olacak. –

+0

@Optimesh, daha iyi bir yol yoktur, ancak FeatureHashing veya PCA, vb. Gibi daha karmaşık tekniklerle boyutsallığı azaltabilirsiniz. Ayrıca, bu yazı aynı One Hot Encoding tekniğini önermektedir. –

0

Her bir kategorik değişkenin türünün "object" olduğunu varsayalım.İlk olarak, kategorik sütun adları bir panda.index oluşturabilir:

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

Daha sonra, bir döngü için aşağıdaki kullanılarak gösterge değişkenlerin oluşturabilir. Ikili kategorik değişkenler için, 0 ve 1'a dönüştürmek için LabelEncoder() kullanın. İki kategoriden daha fazlasına sahip kategorik değişkenler için, gösterge değişkenlerini elde etmek için pd.getDummies() kullanın ve ardından bir kategori bırakın (çoklu doğrusallık sorununu önlemek için). reply.The dönüşüm kendisi sorun (Bence) daha az olduğu için

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

Son sklearn sürümlerinde artık iki sınıftan fazla kategorik değişkenler için le.fit kullanabilirsiniz. – Bismarck

İlgili konular