Вопрос или проблема
Я довольно нов в области Data Science и изучаю вещи на практике на работе. Я аналитик по мошенничеству, и моя работа заключается в том, чтобы предсказать, является ли заявление мошенническим или нет, исходя из данных.
Перед тем как переходить к большому количеству сложных моделей, мне предложили построить деревья решений на наборе данных. Набор данных, который у меня есть, содержит 1500 колонок; некоторые из них категориальные, а некоторые – числовые. У разных категориальных переменных разные уровни; некоторые бинарные, а некоторые имеют более 100 уровней.
Я столкнулся с тем, что scikit-learn может работать только тогда, когда весь набор данных состоит из числовых переменных (дискретных или непрерывных). И частый обход этого ограничения, который я вижу, касается one-hot кодирования, как здесь – что, на мой взгляд, не является прагматичным в моем случае из-за огромного количества колонок и уровней.
Я попросил своих руководителей дать мне несколько недель, чтобы понять большую часть данных, чтобы ограничить свои переменные и, возможно, выполнить one-hot кодирование, но это не вызвало у них одобрения.
У кого-нибудь есть опыт построения классификационных деревьев решений на наборе данных со смешанными типами данных с большим количеством переменных?
Спасибо.
1.) Перед кодированием ваших категориальных признаков вам, возможно, стоит провести некоторую обработку признаков, чтобы уменьшить количество категориальных признаков. Как только вы убедитесь, что не можете сократить их дальше без потери ценной информации, только тогда кодируйте их, используя one hot encoder или другую технику.
2.) Вы можете использовать функцию drop
One Hot Encoder, чтобы уменьшить закодированные колонки. Например, признак gender
имеет 2 измерения: male
и female
. Когда вы их кодируете, вы получите gender_male
и gender_female
. Если вы используете функцию drop
во время кодирования, одно из измерений будет удалено, так как модели достаточно одного измерения для признака gender
. Это дополнительно уменьшит размерность вашей модели.
3.) Еще одно, что вы можете сделать, это для каждого признака выбрать 3-4 самых частых значения, удалить остальные, а затем закодировать их. Как вы упомянули, у вас есть некоторые признаки, которые имеют более 100 значений. Вы можете выбрать 10-20 самых частых значений для этого признака, удалить остальные, а затем выполнить one hot кодирование. Это уменьшит ваши размеры на 80% для этого переменного признака.
4.) Вы можете ознакомиться с PCA, который используется для целей уменьшения размерности. У меня недостаточно знаний об этом.
Кроме того, вам придется смириться с тем, что ваша модель будет иметь высокую размерность (проклятие размерности!). Это преследует каждого Data Scientist.
То, что вы упомянули, правда, для 99% оценщиков Scikit-learn данные X
должны быть числовыми (я думаю, только HistGradientBoosting работает без числовых категориальных данных). Поэтому при работе с смешанными типами данных в моделировании единственным ответом всегда являются Pipelines + ColumnTransformers
.
Попробуйте что-то вроде этого, и это сработает независимо от типа данных, который у вас есть:
# Вам может понадобиться изменить шаги предобработки как для числовых, так и для категориальных признаков
from sklearn.tree import DecisionTreeClassifier
from sklearn.pipeline import Pipeline
from sklearn.compose import make_column_transformer, make_column_selector as selector
from sklearn.preprocessing import StandardScaler
from sklearn.impute import SimpleImputer
cont_prepro = Pipeline([("imputer",SimpleImputer(strategy = "median")),("scaler",StandarScaler())])
cat_prepro = Pipeline([("imputer",SimpleImputer(strategy = "most_frequent")),("encoder",OneHotEncoder(handle_unknown = "ignore"))])
preprocessing = make_column_transformer((cont_prepro,selector(dtype_exclude = "object")),(cat_prepro,selector(dtype_include = "object"))
pipe = Pipeline([("preprocessing",preprocessing),("model", DecisionTreeClassifier())])
pipe.fit(X_train, y_train)
Если размерность вашей входной матрицы вызывает беспокойство, вы даже можете включить селектор признаков внутри пайплайна, как:
# настройте параметры kbest
from feature_selection import SelectKBest
pipe = Pipeline([("preprocessing",preprocessing),("selector",SelectKBest()),
("model", DecisionTreeClassifier())])
Будьте осторожны, если хотите использовать PCA, вы должны использовать это только для числовых признаков, а не для категориальных.
Ответ или решение
Создание решающих деревьев для классификации в наборе данных с числовыми и категориальными переменными может показаться сложной задачей, особенно если у вас есть большое количество признаков. В этой статье мы изучим, как эффективно использовать библиотеки Python, такие как scikit-learn, для выполнения этой задачи, и предложим несколько методов, которые помогут вам справиться с проблемой высокой размерности данных.
Шаг 1: Исследование и подготовка данных
Прежде всего, важно понять структуру вашего набора данных. Учитывая, что у вас 1500 признаков, важно не только провести исследовательский анализ данных, но и реализовать процесс отбора признаков. Это позволит вам определить, какие из них действительно влияют на целевую переменную (например, является ли приложение мошенническим или нет).
Характеристики категориальных переменных
-
Ограничение количества уровней:
- Для категориальных переменных с большим количеством уровней рассмотрите возможность агрегирования или уменьшения количества категорий до 3-5 наиболее часто встречающихся. Вы можете удалить остальные категории или объединить их в «Прочие».
-
Использование целевых переменных:
- Если контекст позволяет, вы можете использовать целевые переменные для преобразования категориальных признаков. Например, замените редкие категории на значение, которое будет более информативным для вашей модели.
Шаг 2: Применение предварительной обработки данных
Для использования решающих деревьев в scikit-learn требуется, чтобы все данные были числовыми. Вы можете использовать ColumnTransformer
и Pipeline
для комбинирования различных методов предварительной обработки.
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.impute import SimpleImputer
from sklearn.tree import DecisionTreeClassifier
# Признаки
numerical_features = [...] # список числовых признаков
categorical_features = [...] # список категориальных признаков
# Предварительная обработка числовых признаков
numerical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='median')),
('scaler', StandardScaler())
])
# Предварительная обработка категориальных признаков
categorical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='most_frequent')),
('encoder', OneHotEncoder(handle_unknown='ignore'))
])
# Объединение всех этапов предварительной обработки
preprocessor = ColumnTransformer(
transformers=[
('num', numerical_transformer, numerical_features),
('cat', categorical_transformer, categorical_features)
])
# Полная пайплайн модель
model = Pipeline(steps=[
('preprocessor', preprocessor),
('classifier', DecisionTreeClassifier())
])
# Обучение модели
model.fit(X_train, y_train)
Шаг 3: Уменьшение размерности
Если у вас много признаков, это может вызвать проблемы с переобучением модели. Для уменьшения размерности можно использовать SelectKBest
или другие методы отбора признаков. Например:
from sklearn.feature_selection import SelectKBest, f_classif
# Встраивание выбора признаков в пайплайн
model_with_selector = Pipeline(steps=[
('preprocessor', preprocessor),
('selector', SelectKBest(score_func=f_classif, k=10)),
('classifier', DecisionTreeClassifier())
])
# Обучение модели
model_with_selector.fit(X_train, y_train)
Шаг 4: Оценка и оптимизация модели
После того как вы обучили модель, важно провести её оценку с использованием метрик, таких как точность, полнота и F1-мера. Используйте кросс-валидацию для более надежной оценки производительности модели и избегайте переобучения.
Заключение
Создание классификационного решающего дерева в наборе данных с смешанными типами данных может быть выполнено с использованием модульной структуры и подхода к предварительной обработке. Этот процесс поможет вам эффективно работать с большими наборами данных, сохраняя качество и управляемость модели. Не забывайте экспериментировать с различными методами отбора признаков и оптимизации, чтобы улучшить результаты вашей модели.