Próbuję użyć zestawu danych oceny samochodu z repozytorium UCI i zastanawiam się, czy istnieje wygodny sposób binaryzacji zmiennych jakościowych w sklearn. Jednym z podejść byłoby użycie DictVectorizer z LabelBinarizera, ale tutaj dostaję k różnych funkcji, podczas gdy powinieneś mieć tylko k-1, aby uniknąć kolinearyzacji. Zgaduję, że mógłbym napisać własną funkcję i upuścić jedną kolumnę, ale ta księgowość jest nudna, czy istnieje prosty sposób na przeprowadzenie takich przekształceń i uzyskanie w rezultacie rzadkiej matrycy?Jak zakodować zmienną kategoryczną w sklearn?
Odpowiedz
DictVectorizer jest zalecanym sposobem generowania jedno-gorącego kodowania zmiennych jakościowych; możesz użyć argumentu sparse
, aby utworzyć rzadką matrycę CSR zamiast gęstej tablicy numpy. Zwykle nie dbam o wieloklinowość i nie zauważyłem problemu z podejściami, z których korzystam (tj. LinearSVC, SGDClassifier, metody oparte na drzewach).
Nie powinno być problemu z łataniem DictVectorizera, aby upuścić jedną kolumnę na kategorię - wystarczy, że usuniesz jeden termin z DictVectorizer.vocabulary
na końcu metody fit
. (Wnioski Pull są zawsze mile widziane!)
Czy istnieje jakiś szczególny powód, dla którego polecasz DictVectorizer na klasę OneHotEncoder? – Dexter
DictVectorizer jest bardziej ogólny - wejście OneHotEncoder jest ograniczone do kolumn liczb całkowitych reprezentujących kategorie. DictVectorizer zajmuje się również tekstowymi wartościami kategorycznymi. Z drugiej strony, jeśli wszystko, co masz, to przede wszystkim kategorie całkowite, OneHotEncoder wydaje się najprostszym wyborem. –
Aby jednak użyć DictVectorizer, musiałbym przekonwertować tablicę na listę słowników z każdym słownikiem na liście odpowiadającym wierszowi w tablicy. To wygląda na włamanie. Dlaczego nie mogę po prostu przekazać tablicy do DictVectorizer? – Ben
Podstawową metodą jest
import numpy as np
import pandas as pd, os
from sklearn.feature_extraction import DictVectorizer
def one_hot_dataframe(data, cols, replace=False):
vec = DictVectorizer()
mkdict = lambda row: dict((col, row[col]) for col in cols)
vecData = pd.DataFrame(vec.fit_transform(data[cols].apply(mkdict, axis=1)).toarray())
vecData.columns = vec.get_feature_names()
vecData.index = data.index
if replace is True:
data = data.drop(cols, axis=1)
data = data.join(vecData)
return (data, vecData, vec)
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9]}
df = pd.DataFrame(data)
df2, _, _ = one_hot_dataframe(df, ['state'], replace=True)
print df2
Oto jak to zrobić w formacie rozrzedzony
import numpy as np
import pandas as pd, os
import scipy.sparse as sps
import itertools
def one_hot_column(df, cols, vocabs):
mats = []; df2 = df.drop(cols,axis=1)
mats.append(sps.lil_matrix(np.array(df2)))
for i,col in enumerate(cols):
mat = sps.lil_matrix((len(df), len(vocabs[i])))
for j,val in enumerate(np.array(df[col])):
mat[j,vocabs[i][val]] = 1.
mats.append(mat)
res = sps.hstack(mats)
return res
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
'year': ['2000', '2001', '2002', '2001', '2002'],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9]}
df = pd.DataFrame(data)
print df
vocabs = []
vals = ['Ohio','Nevada']
vocabs.append(dict(itertools.izip(vals,range(len(vals)))))
vals = ['2000','2001','2002']
vocabs.append(dict(itertools.izip(vals,range(len(vals)))))
print vocabs
print one_hot_column(df, ['state','year'], vocabs).todense()
Jak radzisz sobie z niewidocznymi wartościami w nowych danych z tym podejściem? – marbel
jeśli dane jest DataFrame pandy, to możesz po prostu zadzwoń get_dummies. Załóżmy, że twoja ramka danych jest df i chcesz mieć jedną zmienną binarną na każdy poziom zmiennej "klucz". Możesz po prostu zadzwonić:
pd.get_dummies(df['key'])
a następnie usunąć jedną ze zmiennych fikcyjnych, aby uniknąć problemu multi-współliniowości. Mam nadzieję, że to pomoże ...
Osobiście wolę pandasowe get_dummies od OneHotEncoder lub DictVectorizer od sklearn. Używanie get_dummies w Pandach często skutkuje bardziej usprawnioną procedurą i mniejszym kodem. Panda to bardziej analiza danych i wstępne przetwarzanie, a sklearn to bardziej "ciężkie" procesy uczenia się, jeśli o mnie chodzi. – luanjunyi
Wadą dla get_dummies jest to, że niekoniecznie będzie generować te same fałszywe kolumny w zestawie danych scoringowych (pozostawiając tony złożoności przy próbie oceny modelu). – Chris
Jednym ze sposobów na zrobienie tego jest najpierw przećwiczenie treningu i przetestowanie DataFrame, a następnie zastosuj get_dummies, a na końcu oddziel osobne szkolenie i test DataFrame. W ten sposób dane treningowe i testowe będą miały spójne, jedno gorące kodowanie. – weidongxu
- 1. dane aglomeracyjne sklearn sklearn
- 2. Jak używać wyjścia z OneHotEncoder w sklearn?
- 3. Jak zakodować DropDownButton w Javie
- 4. Jak wyprowadzać sklearn standardcaler
- 5. Jak zainstalować sklearn?
- 6. Trwałe dane w sklearn
- 7. orzecznik zakodować w prologu
- 8. Jak zakodować regułę impasu szachów?
- 9. Jak dokonać dyskretyzacji atrybutów ciągłych w sklearn?
- 10. Jak poprawnie zakodować link mailto?
- 11. Jak prawidłowo zakodować akcenty kodujące?
- 12. Jak zakodować '/' w ASP.NET MVC Razor
- 13. Jak URL zakodować URL w JSP?
- 14. Jak zakodować ciąg dartów w base64?
- 15. Jak zakodować zielony przycisk w arkuszu UIActionSheet?
- 16. Jak zakodować względną krótkie JMP w x86
- 17. Nieujemna faktoryzacja macierzy w Sklearn
- 18. Sklearn SGDClassifier częściowy pasuje
- 19. sklearn LinearRegression.Predict() numer
- 20. Jak dekompilować zmienną zmienną w Javie?
- 21. Zapisywanie części sklearn potoku
- 22. Czy można zakodować Haskell?
- 23. import check_arrays z sklearn
- 24. sklearn: Jak przyspieszyć vectorizer (np. Tfidfvectorizer)
- 25. Jak zakodować n-tego rzędu Krzywa Beziera
- 26. Jak zakodować nazwę pliku do pobrania?
- 27. Jak zakodować plik wykonywalny na ścieżce Linux?
- 28. Jak zakodować wartość za pomocą serializacji jquery?
- 29. Jak poprawnie zakodować rekursywną obietnicę jquery
- 30. Powinowactwo propagacji (sklearn) - dziwne zachowanie
Czy istnieje szczególny powód, dla którego preferujesz cechy k-1 powyżej k? Posiadanie k cech sprawia, że interpretacja współczynników (powiedzmy w modelu liniowym) jest znacznie łatwiejsza i może promować rzadkie cechy. –
Próbowałem znaleźć znaczenie współczynników i wpadłem w problemy kolinearności http://en.wikipedia.org/wiki/Multicollinearity – tonicebrian
Myślę, że nie jestem wystarczająco w statystyce strony, aby zobaczyć, dlaczego to byłby problem . Wyobrażam sobie kodowanie cech k, które daje znacznie bardziej znaczące wyniki pod względem istotności funkcji niż jakakolwiek inna metoda kodowania. –