#python #pandas #scikit-learn
#python #панды #scikit-learn
Вопрос:
есть ли способ в pandas или sklearn преобразовать категориальные значения в уникальный числовой / плавающий индекс и включить их в конвейер? нужно придерживаться sklearn 18.1, потому что это то, что доступно на сервере
ex:
c1 | c2
--------
cat1 | 1.0
cat2 | 2.0
cat2 | 2.0
cat3 | 3.0
сталкивались с проблемами, когда LabelEncoder и OneHotEncoder НЕ могли работать вместе в конвейере и иметь строковые данные ввода OHE…
для применения прогнозов некоторые категориальные значения присутствуют не всегда, и модель терпит неудачу, потому что я не могу использовать handle_unknown=»ignore» в конвейере
следовательно, мне пришлось использовать pandas.get_dummies() для OHE, который я не хочу использовать из-за отсутствия категорий
# tried
class DataFrameSelector(BaseEstimator, TransformerMixin):
def __init__(self, attribute_names):
self.attribute_names = attribute_names
def fit(self, X, y=None):
return self
def transform(self, X):
return X[self.attribute_names].values
cat_pipeline = Pipeline([
("select", DataFrameSelector(cat_features)),
("index", LabelEncoder()),
("ohe", OneHotEncoder(handle_unknown="ignore"))
])
test = cat_pipeline.fit_transform(X_train)
test.shape
# currently using but fails when applying predictions to new data w/o all the categories that were OHE via pandas.get_dummies()
class DataFrameSelector(BaseEstimator, TransformerMixin):
def __init__(self, attribute_names):
self.attribute_names = attribute_names
def fit(self, X, y=None):
return self
def transform(self, X):
return X[self.attribute_names].values
("cat", Pipeline([
("select", DataFrameSelector(cat_ohe))
])),