(горе)Бинирование дискретных значений и избегание ловушек фиктивных переменных в Scikit-Learn и PMML
Одно горячее кодирование категориальных переменных происходит почти в каждой модели. Sklearn предоставляет две функции, которые могут обрабатывать категориальные переменные: LabelBinarizer и недавно представленную в v0.20 OneHotEncoder.
OneHotEncoder обладает более широким набором функций, чем LabelBinarizer, и рекомендуется, если вы выбираете между ними, не принимая во внимание PMML. Одно большое преимущество OneHotEncoder («OHE») по сравнению с LabelBinarizer заключается в обработке новых неизвестных значений во время прогнозирования. Если LabelBinarizer обнаружит значение, с которым функция не сталкивалась во время обучения, она выдаст ошибку. В то время как для OHE разработчик модели может передать значение «игнорировать» параметру «handle_unknown», и OHE создаст нулевые значения для всех преобразованных столбцов (что должно быть правильным поведением).
Sklearn не поддерживает сопоставление дискретных значений с другими дискретными значениями (группирование).
Эту проблему можно решить, объединив LabelBinarizer или OneHotEncoder с функцией LookupTransformer в sklearn2pmml.
Ниже приведен пример использования LookupTransformer для сопоставления необработанных значений с их преобразованными значениями. Кроме того, функция columnTransformer удалит первый столбец, созданный двумя предыдущими шагами конвейера, что позволяет избежать ловушки фиктивной переменной. (Вам не нужно делать это, если вы используете OneHotEncoder, так как вы можете использовать параметр drop для OneHotEncoder).
Рекомендуется, чтобы LookupTransformers предварялся нулевым импутированием, так как конвейер будет работать очень медленно при обнаружении нулевых значений.