OneHotEncoder auf mehreren Spalten gleiche Kategorie angehören,

stimmen
2

Ich habe mehrere Spalten aus kategorischen Variablen, die im Bereich von 0-4 in der Form von ganzzahligen Werten sind. Aber gehören alle Spalten zu der gleichen Kategorie. Ich habe versucht, mit OneHotEncoder von scikit lernen, aber es dauert nicht um fehlende Kategorien in der Spalte, die Probleme verursachen würde, wenn ich ungesehen Daten auf meinem Neuralnetzwerkmodells testen. Im Folgenden Code zeigt die Art von Daten muss ich kodieren

>>> df = pd.DataFrame(np.random.randint(low=0, high=4, size=(5, 5)),
                       columns=['color1', 'color2', 'color3', 'color4', 'color5'])
>>> df

   color1  color2  color3  color4  color5
0       0       1       2       3       1
1       3       1       0       1       1
2       0       1       0       3       0
3       0       2       0       1       2
4       0       2       0       3       2

>>> df_onehotencoder = OneHotEncoder(sparse=False)
>>> df2 = df_onehotencoder.fit_transform(df)

>>> df2

array([[1., 0., 1., 0., 0., 1., 0., 1., 0., 1., 0.],
       [0., 1., 1., 0., 1., 0., 1., 0., 0., 1., 0.],
       [1., 0., 1., 0., 1., 0., 0., 1., 1., 0., 0.],
       [1., 0., 0., 1., 1., 0., 1., 0., 0., 0., 1.],
       [1., 0., 0., 1., 1., 0., 0., 1., 0., 0., 1.]])

Dies erzeugt und Array für jede Spalte nur für die Kategorien in dieser Spalte, und nicht für die fehlenden Kategorien. Ich muss für jede Spalte die gleiche Anzahl von codierten Spalten haben also die fehlende Kategorie dann alle Nullen sein. Auch, was wäre die beste Option, um diese OneHotEncoded Array zu entschlüsseln, damit ich die vorausgesagte Ausgabe in tatsächliche ganzzahlige Werte leicht entschlüsseln könnte.

Veröffentlicht am 20/10/2018 um 12:31
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
1

Ausgehend von sklearn==0.20OneHotEncoder hat categoriesParameter , wo Sie eine Liste von Listen mit allen möglichen Werten für eine bestimmte Spalte zur Verfügung stellen können.

import pandas as pd
df = pd.DataFrame([[0, 1, 2, 3, 1],
 [3, 1, 0, 1, 1],
 [0, 1, 0, 3, 0],
 [0, 2, 0, 1, 2],
 [0, 2, 0, 3, 2]], columns=['color1', 'color2', 'color3', 'color4', 'color5'])

from sklearn.preprocessing import OrdinalEncoder, OneHotEncoder

# Get all the unique values if we don't have them
unique_values = pd.unique(df.values.ravel()) 

ohe = OneHotEncoder(categories=[unique_values]*len(df), sparse=False)
encoded = pd.DataFrame(ohe.fit_transform(
    df), columns=ohe.get_feature_names(df.columns))
>>> encoded

   color1_0  color1_1  color1_2  color1_3  color2_0  color2_1    0
0       1.0       0.0       0.0       0.0       0.0       1.0  ...
1       0.0       0.0       0.0       1.0       0.0       1.0  ...
2       1.0       0.0       0.0       0.0       0.0       1.0  ...
3       1.0       0.0       0.0       0.0       0.0       0.0  ...
4       1.0       0.0       0.0       0.0       0.0       0.0  ...

Um wieder original Klassen können Sie tun inverse_transform:

>>> ohe.inverse_transform(encoded) 
array([[0, 1, 2, 3, 1],
       [3, 1, 0, 1, 1],
       [0, 1, 0, 3, 0],
       [0, 2, 0, 1, 2],
       [0, 2, 0, 3, 2]], dtype=int64)
Beantwortet am 20/10/2018 um 21:58
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more