Отказ от категорических функций от быстрого кодирования в Scikit-Learn?
Я пытаюсь построить модель прогнозирования лассо-регрессии. Я закодировал все свои категориальные целочисленные функции, используя схему one-of-K, которая называется One-of-K, с использованием OneHotEncoder в scikit-learn. Основываясь на результате, только 51 параметр фактически влияет на модель прогнозирования. Я хочу исследовать эти параметры, но они закодированы, как описано выше. Знаете ли вы, как я могу извлечь, какая целочисленная категориальная особенность соответствует какому горячему кодированному массиву? Спасибо!
3 ответа
Используя атрибуты active_features_, feature_indices_ и n_values_ sklearn.preprocessing.OneHotEncoder, вектор категориальных объектов, упорядоченных по их "позиции" в массиве с одним горячим элементом, может быть создан следующим образом:
import numpy as np
from sklearn import preprocessing
enc = preprocessing.OneHotEncoder()
enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])
enc.active_features_ - np.repeat(enc.feature_indices_[:-1], enc.n_values_)
# array([0, 1, 0, 1, 2, 0, 1, 2, 3], dtype=int64)
Кроме того, исходные данные могут быть возвращены из горячего массива следующим образом:
x = enc.transform([[0, 1, 1], [1, 2, 3]]).toarray()
# array([[ 1., 0., 0., 1., 0., 0., 1., 0., 0.],
# [ 0., 1., 0., 0., 1., 0., 0., 0., 1.]])
cond = x > 0
[enc.active_features_[c.ravel()] - enc.feature_indices_[:-1] for c in cond]
# [array([0, 1, 1], dtype=int64), array([1, 2, 3], dtype=int64)]
Это работает:
import pickle
with open('model.pickle', 'rb') as handle:
one_hot_categories = pickle.load(handle)
print(one_hot_categories.categories_)
Я разработал конструкцию для улучшения Pipele и FeatureUnion в sklearn, благодаря которой мы также можем откатить категориальные функции после горячего кодирования или других этапов предварительной обработки. Кроме того, мы можем "нарисовать" преобразование с помощью GraphX: например,
Вы можете найти их на моей странице Github.