मैं पायथन में एक गर्म एन्कोड कैसे कर सकता हूं?


132

मुझे 80% श्रेणीबद्ध चर के साथ मशीन सीखने की वर्गीकरण समस्या है। यदि मुझे वर्गीकरण के लिए कुछ क्लासिफायर का उपयोग करना है तो क्या मुझे एक गर्म एन्कोडिंग का उपयोग करना चाहिए? क्या मैं एन्कोडिंग के बिना किसी क्लासिफायर डेटा को पास कर सकता हूं?

मैं सुविधा चयन के लिए निम्नलिखित करने की कोशिश कर रहा हूं:

  1. मैंने ट्रेन फ़ाइल पढ़ी:

    num_rows_to_read = 10000
    train_small = pd.read_csv("../../dataset/train.csv",   nrows=num_rows_to_read)
    
  2. मैं श्रेणीगत विशेषताओं के प्रकार को 'श्रेणी' में बदलता हूँ:

    non_categorial_features = ['orig_destination_distance',
                              'srch_adults_cnt',
                              'srch_children_cnt',
                              'srch_rm_cnt',
                              'cnt']
    
    for categorical_feature in list(train_small.columns):
        if categorical_feature not in non_categorial_features:
            train_small[categorical_feature] = train_small[categorical_feature].astype('category')
    
  3. मैं एक गर्म एन्कोडिंग का उपयोग करता हूं:

    train_small_with_dummies = pd.get_dummies(train_small, sparse=True)

समस्या यह है कि 3'rd हिस्सा अक्सर अटक जाता है, हालांकि मैं एक मजबूत मशीन का उपयोग कर रहा हूं।

इस प्रकार, सुविधाओं के महत्व को निर्धारित करने के लिए, एक हॉट एन्कोडिंग के बिना मैं कोई फीचर चयन नहीं कर सकता।

आप क्या सलाह देते हैं?

जवाबों:


159

दृष्टिकोण 1: आप पंडों के डेटाफ्रेम पर get_dummies का उपयोग कर सकते हैं।

उदाहरण 1:

import pandas as pd
s = pd.Series(list('abca'))
pd.get_dummies(s)
Out[]: 
     a    b    c
0  1.0  0.0  0.0
1  0.0  1.0  0.0
2  0.0  0.0  1.0
3  1.0  0.0  0.0

उदाहरण 2:

निम्नलिखित दिए गए कॉलम को एक हॉट में बदल देगा। कई डमी रखने के लिए उपसर्ग का उपयोग करें।

import pandas as pd

df = pd.DataFrame({
          'A':['a','b','a'],
          'B':['b','a','c']
        })
df
Out[]: 
   A  B
0  a  b
1  b  a
2  a  c

# Get one hot encoding of columns B
one_hot = pd.get_dummies(df['B'])
# Drop column B as it is now encoded
df = df.drop('B',axis = 1)
# Join the encoded df
df = df.join(one_hot)
df  
Out[]: 
       A  a  b  c
    0  a  0  1  0
    1  b  1  0  0
    2  a  0  0  1

दृष्टिकोण 2: Scikit-learn का उपयोग करें

तीन विशेषताओं और चार नमूनों वाले डेटासेट को देखते हुए, हम एनकोडर को प्रति फीचर का अधिकतम मूल्य ज्ञात करते हैं और डेटा को बाइनरी एक-हॉट एन्कोडिंग में बदल देते हैं।

>>> from sklearn.preprocessing import OneHotEncoder
>>> enc = OneHotEncoder()
>>> enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])   
OneHotEncoder(categorical_features='all', dtype=<class 'numpy.float64'>,
   handle_unknown='error', n_values='auto', sparse=True)
>>> enc.n_values_
array([2, 3, 4])
>>> enc.feature_indices_
array([0, 2, 5, 9], dtype=int32)
>>> enc.transform([[0, 1, 1]]).toarray()
array([[ 1.,  0.,  0.,  1.,  0.,  0.,  1.,  0.,  0.]])

यहाँ इस उदाहरण के लिए लिंक है: http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html


20
मूल स्तंभ को अलग से छोड़ने की आवश्यकता को दूर करने के drop_first=Trueसाथ सेटिंगget_dummies
अतिप्रवाह

1
उदाहरण 2 में, क्या नए कॉलम में शामिल होने के बिना डेटाफ्रेम में शामिल होने का एक तरीका है? जब मैं ऐसा करने की कोशिश कर रहा हूं, तो मैं वास्तव में बड़े डेटासेट के साथ काम कर रहा हूं और मेमोरीरेज प्राप्त करता हूं।
जे। दहलग्रेन

यदि आप df2 में समान पंक्तियों के साथ df2 हैं, तो बिना ज्वाइन किए आप डेटाफ़्रेम में नया कॉलम जोड़ सकते हैं। आप का उपयोग करके कॉपी कर सकते हैं: df ["newColname"] = df2 ["col"]
सयाली

1
उदाहरण 2 के लिए एक छवि का उपयोग करना बुराई थी
विलास

9
@ ओवरफ्लोइंग .ग्लास- ड्रॉप-फर्स्ट = ट्रू असली कॉलम को नहीं हटाता है। यह श्रेणीबद्ध सुविधा के पहले स्तर को गिरा देता है ताकि आप k-कॉलम के बजाय k-1 कॉलम के साथ समाप्त हो जाएं, और श्रेणीबद्ध सुविधा की कार्डिनैलिटी हो।
गरिमा जैन

42

बुनियादी एक-गर्म एन्कोडिंग के लिए पंडों का उपयोग करना बहुत आसान है। यदि आप अधिक विकल्पों की तलाश कर रहे हैं तो आप उपयोग कर सकते हैं scikit-learn

पंडों के साथ बुनियादी एक-हॉट एन्कोडिंग के लिए आप बस अपने डेटा फ्रेम को get_dummies फ़ंक्शन में पास करें ।

उदाहरण के लिए, यदि मेरे पास imdb_movies नामक डेटाफ्रेम है :

यहाँ छवि विवरण दर्ज करें

... और मैं एक-रेटेड रेटेड कॉलम को गर्म करना चाहता हूं, मैं बस यही करता हूं:

pd.get_dummies(imdb_movies.Rated)

यहाँ छवि विवरण दर्ज करें

यह रेटिंग के dataframeहर " स्तर " के लिए एक कॉलम के साथ एक नया रिटर्न देता है, साथ ही 1 या 0 के साथ किसी दिए गए अवलोकन के लिए उस रेटिंग की उपस्थिति को निर्दिष्ट करता है।

आमतौर पर, हम चाहते हैं कि यह मूल का हिस्सा हो dataframe। इस स्थिति में, हम अपने नए डमी कोडित फ्रेम को " कॉलम-बाइंडिंग " का उपयोग करके मूल फ्रेम पर संलग्न करते हैं ।

हम पांडा का उपयोग करके स्तंभ बाध्य कर सकते हैं concat समारोह:

rated_dummies = pd.get_dummies(imdb_movies.Rated)
pd.concat([imdb_movies, rated_dummies], axis=1)

यहाँ छवि विवरण दर्ज करें

अब हम अपने पूर्ण पर विश्लेषण चला सकते हैं dataframe

सरल उपयोगिता समारोह

मैं इसे शीघ्रता से करने के लिए अपने आप को एक उपयोगिता कार्य करने की सलाह दूंगा:

def encode_and_bind(original_dataframe, feature_to_encode):
    dummies = pd.get_dummies(original_dataframe[[feature_to_encode]])
    res = pd.concat([original_dataframe, dummies], axis=1)
    return(res)

उपयोग :

encode_and_bind(imdb_movies, 'Rated')

परिणाम :

यहाँ छवि विवरण दर्ज करें

इसके अलावा, @pmalbu टिप्पणी के अनुसार, यदि आप फ़ंक्शन को मूल feature_to_encode को निकालना चाहते हैं, तो इस संस्करण का उपयोग करें:

def encode_and_bind(original_dataframe, feature_to_encode):
    dummies = pd.get_dummies(original_dataframe[[feature_to_encode]])
    res = pd.concat([original_dataframe, dummies], axis=1)
    res = res.drop([feature_to_encode], axis=1)
    return(res) 

आप निम्न के रूप में एक ही समय में कई विशेषताओं को एन्कोड कर सकते हैं:

features_to_encode = ['feature_1', 'feature_2', 'feature_3',
                      'feature_4']
for feature in features_to_encode:
    res = encode_and_bind(train_set, feature)

1
मैं आपको मूल डेटाफ़्रेम के साथ एक हॉट एंड कॉलम को समाप्‍त करने के बाद मूल feature_to_encode छोड़ने का सुझाव दूंगा।
पीतबलु

जवाब देने के लिए इस विकल्प को जोड़ा गया। धन्यवाद।
साइबरनेट

28

आप numpy.eyeसरणी तत्व चयन तंत्र के साथ और इसका उपयोग कर सकते हैं :

import numpy as np
nb_classes = 6
data = [[2, 3, 4, 0]]

def indices_to_one_hot(data, nb_classes):
    """Convert an iterable of indices to one-hot encoded labels."""
    targets = np.array(data).reshape(-1)
    return np.eye(nb_classes)[targets]

का रिटर्न वैल्यू indices_to_one_hot(nb_classes, data)अब है

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

यह .reshape(-1)सुनिश्चित करने के लिए कि आपके पास सही लेबल प्रारूप है (आपके पास भी हो सकता है [[2], [3], [4], [0]])।


1
यह स्ट्रिंग मान वाले स्तंभों के OHE के लिए काम नहीं करेगा।
अभिलाष अवस्थी

2
@ अभिलाषा अवस्थी ज़रूर ... लेकिन आप इसके बाद काम करने की उम्मीद क्यों करेंगे?
मार्टिन थोमा

22

सबसे पहले, एक गर्म एन्कोडिंग का सबसे आसान तरीका: स्केलेर का उपयोग करें।

http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html

दूसरी बात, मुझे नहीं लगता कि पंडों को एक हॉट एनकोड का उपयोग करना सरल है (हालांकि अपुष्ट)

अजगर के लिए पांडा में डमी चर बनाना

अंत में, क्या यह आपके लिए एक हॉट एनकोडिंग के लिए आवश्यक है? एक गर्म एन्कोडिंग तेजी से सुविधाओं की संख्या में वृद्धि करता है, किसी भी क्लासिफायर या आप जो कुछ भी चलाने जा रहे हैं उसके रन समय में काफी वृद्धि होती है। विशेषकर जब प्रत्येक श्रेणीगत विशेषता के कई स्तर होते हैं। इसके बजाय आप डमी कोडिंग कर सकते हैं।

डमी एन्कोडिंग का उपयोग करना आमतौर पर बहुत कम समय और जटिलता के लिए अच्छा काम करता है। एक बुद्धिमान प्रोफेसर ने एक बार मुझसे कहा था, 'कम इज मोर'।

यदि आप चाहते हैं तो मेरे कस्टम एन्कोडिंग फ़ंक्शन का कोड यहाँ है।

from sklearn.preprocessing import LabelEncoder

#Auto encodes any dataframe column of type category or object.
def dummyEncode(df):
        columnsToEncode = list(df.select_dtypes(include=['category','object']))
        le = LabelEncoder()
        for feature in columnsToEncode:
            try:
                df[feature] = le.fit_transform(df[feature])
            except:
                print('Error encoding '+feature)
        return df

संपादित करें: तुलना स्पष्ट होने के लिए:

एक-गर्म एन्कोडिंग: एन स्तरों को एन -1 कॉलम में परिवर्तित करें।

Index  Animal         Index  cat  mouse
  1     dog             1     0     0
  2     cat       -->   2     1     0
  3    mouse            3     0     1

आप देख सकते हैं कि यह कैसे आपकी मेमोरी में विस्फोट करेगा यदि आपकी श्रेणीगत विशेषता में कई अलग-अलग प्रकार (या स्तर) हैं। ध्यान रखें, यह सिर्फ एक कॉलम है।

डमी कोडिंग:

Index  Animal         Index  Animal
  1     dog             1      0   
  2     cat       -->   2      1 
  3    mouse            3      2

इसके बजाय संख्यात्मक अभ्यावेदन में बदलें। बहुत सटीकता की कीमत पर सुविधा स्थान बचाता है।


1
1. मेरे पास एक डेटा सेट है जिसमें 80% श्रेणीबद्ध चर हैं। मेरी समझ के लिए मुझे एक हॉट एन्कोडिंग का उपयोग करना चाहिए यदि मैं इस डेटा के लिए एक क्लासिफायरियर का उपयोग करना चाहता हूं, तो क्लासिफायर के एक हॉट एन्कोडिंग नहीं करने के मामले में क्या सही तरीके से श्रेणीबद्ध चर का इलाज नहीं किया जाएगा? क्या कोई विकल्प नहीं है सांकेतिक शब्दों में बदलना? 2. अगर मैं sdrse = True के साथ pd.get_dummies (train_small, sparse = True) का उपयोग करता हूं - तो क्या यह मेमोरी समस्या का समाधान नहीं करता है? 3. मुझे ऐसी समस्या से कैसे संपर्क करना चाहिए?
एविकोहेन

जैसा कि मैंने कहा, दो विकल्प हैं। 1) एक गर्म एनकोड -> हर स्तर को श्रेणीबद्ध विशेषताओं में एक नए कॉलम में परिवर्तित करता है। 2) डमी कोडिंग -> हर कॉलम को संख्यात्मक अभ्यावेदन में परिवर्तित करें। मैं अपना उत्तर स्पष्ट करने के लिए ऊपर संपादित करूँगा। लेकिन आप केवल मेरे द्वारा दिए गए फ़ंक्शन को चला सकते हैं और यह काम करना चाहिए
वॉब

17
"थोड़ी सटीकता की कीमत पर।" आप "थोड़ा" कैसे कह सकते हैं? शायद कुछ मामलों में, लेकिन दूसरों में, सटीकता को बहुत चोट पहुंचाई जा सकती है। इस समाधान के परिणामस्वरूप गुणात्मक विशेषताओं का इलाज निरंतर होता है जिसका अर्थ है कि आपका मॉडल डेटा से ठीक से नहीं सीखेगा।
जोश मोरल

2
जैसा कि जोश ने ऊपर कहा, अपने दूसरे उदाहरण में आप मॉडल के बारे में बताते हुए कहते हैं कि mouse > cat > dogलेकिन ऐसा नहीं है। get_dummiesमेरे अनुभव से मॉडल के अनुकूल डेटा में श्रेणीबद्ध चर को स्थानांतरित करने का सबसे सीधा तरीका है (यद्यपि बहुत सीमित)
मार्टिन ओ लेरी

5
कुछ अन्य टिप्पणियों द्वारा बताया गया यह समाधान बहुत खतरनाक है। यह मनमाने ढंग से वैरिएबल चर के लिए आदेश और दूरी प्रदान करता है। ऐसा करने से यादृच्छिक तरीके से मॉडल लचीलापन कम हो जाता है। पेड़ आधारित मॉडल के लिए, इस तरह के एन्कोडिंग संभव सबसे कम संभावनाओं को कम करते हैं। उदाहरण के लिए, आप अब केवल दो संभावित विभाजन देख सकते हैं [(0), (1,2)] और [(0,1), (2)], और विभाजन [(0,2), (1)] असंभव। श्रेणियों की संख्या अधिक होने पर नुकसान अधिक महत्वपूर्ण है।
रैंडम निश्चितता

19

पांडा के साथ एक गर्म एन्कोडिंग बहुत आसान है:

def one_hot(df, cols):
    """
    @param df pandas DataFrame
    @param cols a list of columns to encode 
    @return a DataFrame with one-hot encoding
    """
    for each in cols:
        dummies = pd.get_dummies(df[each], prefix=each, drop_first=False)
        df = pd.concat([df, dummies], axis=1)
    return df

संपादित करें:

Sklearn का उपयोग करके one_hot का दूसरा तरीका LabelBinarizer:

from sklearn.preprocessing import LabelBinarizer 
label_binarizer = LabelBinarizer()
label_binarizer.fit(all_your_labels_list) # need to be global or remembered to use it later

def one_hot_encode(x):
    """
    One hot encode a list of sample labels. Return a one-hot encoded vector for each label.
    : x: List of sample Labels
    : return: Numpy array of one-hot encoded labels
    """
    return label_binarizer.transform(x)

14

आप numpy.eye फ़ंक्शन का उपयोग कर सकते हैं।

import numpy as np

def one_hot_encode(x, n_classes):
    """
    One hot encode a list of sample labels. Return a one-hot encoded vector for each label.
    : x: List of sample Labels
    : return: Numpy array of one-hot encoded labels
     """
    return np.eye(n_classes)[x]

def main():
    list = [0,1,2,3,4,3,2,1,0]
    n_classes = 5
    one_hot_list = one_hot_encode(list, n_classes)
    print(one_hot_list)

if __name__ == "__main__":
    main()

परिणाम

D:\Desktop>python test.py
[[ 1.  0.  0.  0.  0.]
 [ 0.  1.  0.  0.  0.]
 [ 0.  0.  1.  0.  0.]
 [ 0.  0.  0.  1.  0.]
 [ 0.  0.  0.  0.  1.]
 [ 0.  0.  0.  1.  0.]
 [ 0.  0.  1.  0.  0.]
 [ 0.  1.  0.  0.  0.]
 [ 1.  0.  0.  0.  0.]]

2
क्या आपने सिर्फ मेरे उत्तर की नकल की?
मार्टिन थोमा

@Martin थोमा - मुझे लगता है, मैंने नहीं किया
डीटर

5

पांडा के रूप में इनबिल्ट फंक्शन "get_dummies" में उस विशेष कॉलम / एस की एक हॉट एन्कोडिंग पाने के लिए होता है।

एक-हॉट-एन्कोडिंग के लिए एक लाइन कोड:

df=pd.concat([df,pd.get_dummies(df['column name'],prefix='column name')],axis=1).drop(['column name'],axis=1)

4

यहाँ एक समाधान का उपयोग कर DictVectorizerऔर पंडों DataFrame.to_dict('records')विधि है।

>>> import pandas as pd
>>> X = pd.DataFrame({'income': [100000,110000,90000,30000,14000,50000],
                      'country':['US', 'CAN', 'US', 'CAN', 'MEX', 'US'],
                      'race':['White', 'Black', 'Latino', 'White', 'White', 'Black']
                     })

>>> from sklearn.feature_extraction import DictVectorizer
>>> v = DictVectorizer()
>>> qualitative_features = ['country','race']
>>> X_qual = v.fit_transform(X[qualitative_features].to_dict('records'))
>>> v.vocabulary_
{'country=CAN': 0,
 'country=MEX': 1,
 'country=US': 2,
 'race=Black': 3,
 'race=Latino': 4,
 'race=White': 5}

>>> X_qual.toarray()
array([[ 0.,  0.,  1.,  0.,  0.,  1.],
       [ 1.,  0.,  0.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  0.,  1.,  0.],
       [ 1.,  0.,  0.,  0.,  0.,  1.],
       [ 0.,  1.,  0.,  0.,  0.,  1.],
       [ 0.,  0.,  1.,  1.,  0.,  0.]])

3

एक-गर्म एन्कोडिंग को संकेतक चर के मूल्यों को परिवर्तित करने की तुलना में थोड़ा अधिक की आवश्यकता होती है। आमतौर पर एमएल प्रक्रिया के लिए आपको इस कोडिंग को कई बार सत्यापन या परीक्षण के लिए सेट करना पड़ता है और आपके द्वारा बनाए गए मॉडल को वास्तविक समय में देखे गए डेटा पर लागू करना पड़ता है। आपको मानचित्रण (परिवर्तन) को संग्रहीत करना चाहिए जो मॉडल के निर्माण के लिए उपयोग किया गया था। एक अच्छा समाधान ( DictVectorizerया LabelEncoderउसके बाद) का उपयोग करेगा get_dummies। यहां एक फ़ंक्शन है जिसका आप उपयोग कर सकते हैं:

def oneHotEncode2(df, le_dict = {}):
    if not le_dict:
        columnsToEncode = list(df.select_dtypes(include=['category','object']))
        train = True;
    else:
        columnsToEncode = le_dict.keys()   
        train = False;

    for feature in columnsToEncode:
        if train:
            le_dict[feature] = LabelEncoder()
        try:
            if train:
                df[feature] = le_dict[feature].fit_transform(df[feature])
            else:
                df[feature] = le_dict[feature].transform(df[feature])

            df = pd.concat([df, 
                              pd.get_dummies(df[feature]).rename(columns=lambda x: feature + '_' + str(x))], axis=1)
            df = df.drop(feature, axis=1)
        except:
            print('Error encoding '+feature)
            #df[feature]  = df[feature].convert_objects(convert_numeric='force')
            df[feature]  = df[feature].apply(pd.to_numeric, errors='coerce')
    return (df, le_dict)

यह एक पांडा डेटाफ्रेम पर काम करता है और डेटाफ्रेम के प्रत्येक कॉलम के लिए यह मैपिंग बनाता है और वापस मैप करता है। तो आप इसे इस तरह कहेंगे:

train_data, le_dict = oneHotEncode2(train_data)

फिर परीक्षण डेटा पर, प्रशिक्षण से वापस आए शब्दकोश को पास करके कॉल किया जाता है:

test_data, _ = oneHotEncode2(test_data, le_dict)

एक समान विधि का उपयोग करना है DictVectorizer। उसी से संबंधित एक पोस्ट मेरे ब्लॉग पर है। मैं यहां इसका उल्लेख करता हूं क्योंकि यह get_dummies पोस्ट (प्रकटीकरण: यह मेरा ब्लॉग है) का उपयोग करके इस दृष्टिकोण के पीछे कुछ तर्क प्रदान करता है ।


3

आप एन्कोडिंग के बिना वर्गीकरण को कैटबॉस्ट करने के लिए डेटा पास कर सकते हैं। कैटबॉस्ट एक-गर्म और लक्ष्य विस्तार एन्कोडिंग का प्रदर्शन करके श्रेणीबद्ध चर को स्वयं संभालता है।


3

आप निम्नलिखित भी कर सकते हैं। नीचे का उपयोग करने के लिए ध्यान दें pd.concat

import pandas as pd 
# intialise data of lists. 
data = {'Color':['Red', 'Yellow', 'Red', 'Yellow'], 'Length':[20.1, 21.1, 19.1, 18.1],
       'Group':[1,2,1,2]} 

# Create DataFrame 
df = pd.DataFrame(data) 

for _c in df.select_dtypes(include=['object']).columns:
    print(_c)
    df[_c]  = pd.Categorical(df[_c])
df_transformed = pd.get_dummies(df)
df_transformed

आप स्पष्ट कॉलम को श्रेणीबद्ध में भी बदल सकते हैं। उदाहरण के लिए, यहाँ मैं बदल रहा हूँ ColorऔरGroup

import pandas as pd 
# intialise data of lists. 
data = {'Color':['Red', 'Yellow', 'Red', 'Yellow'], 'Length':[20.1, 21.1, 19.1, 18.1],
       'Group':[1,2,1,2]} 

# Create DataFrame 
df = pd.DataFrame(data) 
columns_to_change = list(df.select_dtypes(include=['object']).columns)
columns_to_change.append('Group')
for _c in columns_to_change:
    print(_c)
    df[_c]  = pd.Categorical(df[_c])
df_transformed = pd.get_dummies(df)
df_transformed

2

मुझे पता है कि मुझे इस पार्टी में देरी हो रही है, लेकिन स्वचालित रूप से डेटाफ़्रेम को गर्म करने का सबसे सरल तरीका इस फ़ंक्शन का उपयोग करना है:

def hot_encode(df):
    obj_df = df.select_dtypes(include=['object'])
    return pd.get_dummies(df, columns=obj_df.columns).values

1

मैंने अपने ध्वनिक मॉडल में इसका उपयोग किया: शायद यह उर मॉडल में मदद करता है।

def one_hot_encoding(x, n_out):
    x = x.astype(int)  
    shape = x.shape
    x = x.flatten()
    N = len(x)
    x_categ = np.zeros((N,n_out))
    x_categ[np.arange(N), x] = 1
    return x_categ.reshape((shape)+(n_out,))

0

अन्य प्रश्नों में जोड़ने के लिए, मैं यह प्रदान करता हूं कि मैंने Numpy का उपयोग करके पायथन 2.0 फ़ंक्शन के साथ यह कैसे किया:

def one_hot(y_):
    # Function to encode output labels from number indexes 
    # e.g.: [[5], [0], [3]] --> [[0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0]]

    y_ = y_.reshape(len(y_))
    n_values = np.max(y_) + 1
    return np.eye(n_values)[np.array(y_, dtype=np.int32)]  # Returns FLOATS

n_values = np.max(y_) + 1यदि आप उदाहरण के लिए मिनी-बैचों का उपयोग करते हैं तो आपके लिए न्यूरॉन्स की अच्छी संख्या का उपयोग करने के लिए लाइन हार्ड-कोडित हो सकती है।

डेमो प्रोजेक्ट / ट्यूटोरियल जहां इस फ़ंक्शन का उपयोग किया गया है: https://github.com/guillaume-chevalier/LSTM-Human-Activity-Recognition


0

यह मेरे लिए काम करता है:

pandas.factorize( ['B', 'C', 'D', 'B'] )[0]

आउटपुट:

[0, 1, 2, 0]

0

यह कर सकते हैं और यह आसान होना चाहिए:

class OneHotEncoder:
    def __init__(self,optionKeys):
        length=len(optionKeys)
        self.__dict__={optionKeys[j]:[0 if i!=j else 1 for i in range(length)] for j in range(length)}

उपयोग:

ohe=OneHotEncoder(["A","B","C","D"])
print(ohe.A)
print(ohe.D)

0

विस्तार @Martin Thoma का जवाब

def one_hot_encode(y):
    """Convert an iterable of indices to one-hot encoded labels."""
    y = y.flatten() # Sometimes not flattened vector is passed e.g (118,1) in these cases
    # the function ends up creating a tensor e.g. (118, 2, 1). flatten removes this issue
    nb_classes = len(np.unique(y)) # get the number of unique classes
    standardised_labels = dict(zip(np.unique(y), np.arange(nb_classes))) # get the class labels as a dictionary
    # which then is standardised. E.g imagine class labels are (4,7,9) if a vector of y containing 4,7 and 9 is
    # directly passed then np.eye(nb_classes)[4] or 7,9 throws an out of index error.
    # standardised labels fixes this issue by returning a dictionary;
    # standardised_labels = {4:0, 7:1, 9:2}. The values of the dictionary are mapped to keys in y array.
    # standardised_labels also removes the error that is raised if the labels are floats. E.g. 1.0; element
    # cannot be called by an integer index e.g y[1.0] - throws an index error.
    targets = np.vectorize(standardised_labels.get)(y) # map the dictionary values to array.
    return np.eye(nb_classes)[targets]

0

संक्षिप्त जवाब

यहाँ एक कार्य हॉट-एन्कोडिंग करने के लिए किया गया है जिसमें सुन्न, पांडा या अन्य पैकेज का उपयोग किए बिना । यह पूर्णांक, बूलियन या स्ट्रिंग्स (और शायद अन्य प्रकार भी) की एक सूची लेता है।

import typing


def one_hot_encode(items: list) -> typing.List[list]:
    results = []
    # find the unique items (we want to unique items b/c duplicate items will have the same encoding)
    unique_items = list(set(items))
    # sort the unique items
    sorted_items = sorted(unique_items)
    # find how long the list of each item should be
    max_index = len(unique_items)

    for item in items:
        # create a list of zeros the appropriate length
        one_hot_encoded_result = [0 for i in range(0, max_index)]
        # find the index of the item
        one_hot_index = sorted_items.index(item)
        # change the zero at the index from the previous line to a one
        one_hot_encoded_result[one_hot_index] = 1
        # add the result
        results.append(one_hot_encoded_result)

    return results

उदाहरण:

one_hot_encode([2, 1, 1, 2, 5, 3])

# [[0, 1, 0, 0],
#  [1, 0, 0, 0],
#  [1, 0, 0, 0],
#  [0, 1, 0, 0],
#  [0, 0, 0, 1],
#  [0, 0, 1, 0]]
one_hot_encode([True, False, True])

# [[0, 1], [1, 0], [0, 1]]
one_hot_encode(['a', 'b', 'c', 'a', 'e'])

# [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [1, 0, 0, 0], [0, 0, 0, 1]]

दीर्घ (er) उत्तर

मुझे पता है कि इस प्रश्न के पहले से ही बहुत सारे उत्तर हैं, लेकिन मैंने दो बातों पर ध्यान दिया। सबसे पहले, अधिकांश उत्तर संख्यात्मक और / या पांडा जैसे संकुल का उपयोग करते हैं। और यह एक अच्छी बात है। यदि आप उत्पादन कोड लिख रहे हैं, तो आपको संभवत: मजबूत, तेज एल्गोरिदम का उपयोग करना चाहिए जैसे कि खस्ता / पांडा पैकेज में प्रदान किया गया है। लेकिन, शिक्षा के लिए, मुझे लगता है कि किसी को एक ऐसा उत्तर प्रदान करना चाहिए जिसमें पारदर्शी एल्गोरिथ्म हो, न कि किसी और के एल्गोरिदम का कार्यान्वयन हो। दूसरा, मैंने देखा कि बहुत से उत्तर एक-गर्म एन्कोडिंग का एक मजबूत कार्यान्वयन प्रदान नहीं करते हैं क्योंकि वे नीचे की आवश्यकताओं में से एक को पूरा नहीं करते हैं। नीचे एक उपयोगी, सटीक और मजबूत एक-गर्म एन्कोडिंग फ़ंक्शन के लिए कुछ आवश्यकताएं (जैसा कि मैं उन्हें देखता हूं) हैं:

एक-गर्म एन्कोडिंग फ़ंक्शन को होना चाहिए:

  • इनपुट के रूप में विभिन्न प्रकारों (जैसे पूर्णांक, स्ट्रिंग्स, फ्लोट्स, आदि) की सूची
  • डुप्लिकेट के साथ एक इनपुट सूची को संभालें
  • इनपुट्स के अनुरूप (समान क्रम में) सूचियों की सूची लौटाएं
  • उन सूचियों की सूची लौटाएं जहां प्रत्येक सूची यथासंभव कम है

मैंने इस प्रश्न के कई उत्तरों का परीक्षण किया और उनमें से अधिकांश उपरोक्त आवश्यकताओं में से एक पर विफल रहे।


0

इसे इस्तेमाल करे:

!pip install category_encoders
import category_encoders as ce

categorical_columns = [...the list of names of the columns you want to one-hot-encode ...]
encoder = ce.OneHotEncoder(cols=categorical_columns, use_cat_names=True)
df_train_encoded = encoder.fit_transform(df_train_small)

df_encoded.head ()

परिणामी डेटाफ्रेम df_train_encodedमूल के समान है, लेकिन श्रेणीबद्ध विशेषताएं अब उनके एक-हॉट-एन्कोडेड संस्करणों के साथ बदल दी गई हैं।

अधिक जानकारी category_encoders यहाँ पर ।


-1

यहाँ मैंने इस दृष्टिकोण के साथ कोशिश की:

import numpy as np
#converting to one_hot





def one_hot_encoder(value, datal):

    datal[value] = 1

    return datal


def _one_hot_values(labels_data):
    encoded = [0] * len(labels_data)

    for j, i in enumerate(labels_data):
        max_value = [0] * (np.max(labels_data) + 1)

        encoded[j] = one_hot_encoder(i, max_value)

    return np.array(encoded)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.