Как получить количество измерений в OneHotEncoder в Scikit-learn

#python #machine-learning #scikit-learn #one-hot-encoding

#python #машинное обучение #scikit-learn #one-hot-encoding

Вопрос:

Я использую OneHotEncoder из Scikit-learn в своем проекте. И мне нужно знать, каким будет размер каждого одноточечного вектора, когда n_value установлено значение auto . Я думал n_value_ , что это покажет, но, похоже, у меня нет другого способа, кроме как попробовать обучающие образцы. Я создал этот игрушечный пример кода, чтобы показать проблему. Знаете ли вы какое-либо другое решение?

 from sklearn.preprocessing import OneHotEncoder

data = [[1], [3], [5]] # 3 different features

encoder = OneHotEncoder()
encoder.fit(data)

print(len(encoder.transform([data[0]]).toarray()[0])) # 3 number of dimensions in one-hot-vector
print(encoder.n_values_) # [6] == len(range(5))
 

Ответ №1:

Это то, что вы ищете?

 >>> encoder.active_features_
array([1, 3, 5])

>>> len(encoder.active_features_)
3
 

Ответ №2:

Я думаю, что лучшим решением является определение размера вектора в n_values . Поскольку автоматическая опция создает нечетное поведение с отсутствующими функциями по сравнению с номерами объектов вне диапазона. Повторяя этот пример, он создает нулевой вектор для пропущенных чисел:

 from sklearn.preprocessing import OneHotEncoder

data = [[1], [3], [5]] 

encoder = OneHotEncoder()
encoder.fit(data)

print(encoder.transform([
            [0],
            [1],
            [2],
            [3],
            [4],
            [5]
        ]).toarray()) 
 

Результат выглядит следующим образом:

 [[ 0.  0.  0.]
 [ 1.  0.  0.]
 [ 0.  0.  0.]
 [ 0.  1.  0.]
 [ 0.  0.  0.]
 [ 0.  0.  1.]]
 

И если я попробую 6 , это просто выдаст ошибки:

 print(encoder.transform([[6]]).toarray()) 
 

Результат:

 ValueError: unknown categorical feature present [6] during transform.
 

Как я упоминал ранее, наилучшей практикой является определение размера векторов с самого начала:

 from sklearn.preprocessing import OneHotEncoder

data = [[1], [3], [5]] 

encoder = OneHotEncoder(n_values=50) # maximum size for my vocabulary, fits for my memory and my future development.
encoder.fit(data)
 

Имейте в виду, что в этом случае больше не будет никакого active_features_ атрибута for encoder .