Вопрос или проблема
Цель того, что я пытаюсь достичь здесь, заключается в том, чтобы вывод содержал все use_cols, но модель строилась только для вычислений на categorical_features. Затем вывод будет использоваться для предсказания и сравнения предсказания ‘REVIEW_ACTION’ с фактическим ‘REVIEWER_ACTION’. Игнорируя на данный момент, почему это ПЛОХОЕ ДЕЛО, можем ли мы сосредоточиться на том, как это реализовать?
use_cols = ['FIRST_NAME', 'LAST_NAME', 'PERSON_STATUS', 'DIVISION_NAME',
'PERSON_TYPE', 'JOB_CHANGE', 'JOB_TRANSFER', 'IDENTIFY_DATE',
'SSO', 'USER_ID', 'ASSET_ID', 'ROLE', 'HPA',
'LAST_LOGIN_DATE', 'ASSET_NAME', 'AUDIT_ID',
'REVIEWER_ACTION', 'USER ID', 'LABELED_ROLE', 'REVIEW_ACTION']
prediction_col = ['REVIEW_ACTION']
categorical_features = ['DIVISION_NAME', 'PERSON_TYPE', 'JOB_CHANGE', 'JOB_TRANSFER',
'SSO', 'USER_ID', 'ASSET_ID', 'ROLE', 'HPA', 'LAST_LOGIN_DATE',
'USER ID', 'LABELED_ROLE']
categorical_transformer = Pipeline(steps=[
('si', SimpleImputer(strategy='constant', fill_value="missing")),
('ohe', OneHotEncoder(handle_unknown='ignore'))],remainder="passthrough")
preprocessor = ColumnTransformer(
transformers=[
('cat', categorical_transformer, categorical_features)])
rf = Pipeline(steps=[('preprocessor', preprocessor),
('rfc', RandomForestClassifier(n_estimators=100))
])
Затем я обучаю данные и пытаюсь выполнить предсказание
df['rf_prediction'] = df[categorical_features].apply(rf.predict)
и получаю ошибку:
IndexingError: ('Too many indexers', 'occurred at index DIVISION_NAME')
Это связано с тем, что некоторые столбцы обрабатываются как ‘passthrough’, но я не уверен, как это разрешить. Я не хочу обрабатывать некоторые из этих столбцов, но хочу их включить в результаты, когда я напишу файл, чтобы я мог проверить результаты.
Где-то в процессе отладки я сделал шаг назад и увидел разные ошибки, когда вызываю fit. Если X = data, я вижу:
ValueError: could not convert string to float: 'Herve'
Обратите внимание, что “Herve” — это поле, которое проходит через (remainder="passthrough"
), поэтому модель не должна его видеть — или, по крайней мере, я был в этом уверен.
Удаление remainder="passthrough"
решило проблему. Я просто добавил предсказание к ‘X’ и получил то, что мне нужно, так как sklearn версии 20 может работать с pandas dataframes.
.
Ответ или решение
Решение проблемы с ошибкой IndexingError: (‘Too many indexers’, ‘occurred at index ‘) в sklearn
Ваша задача заключается в том, чтобы создать модель машинного обучения с использованием библиотеки sklearn
, которая будет осуществлять предсказания на основе предназначенных для обработки категориальных признаков. При этом вы хотите, чтобы в выводе присутствовали дополнительные колонки. Однако, вы столкнулись с ошибкой IndexingError: ('Too many indexers', 'occurred at index <name>')
и другими проблемами на этапе подбора и прогноза. В данной статье мы рассмотрим пути решения этой ошибки и предложим рекомендации для успешного выполнения вашей задачи.
1. Понимание структуры данных и ошибки
Ошибка IndexingError: ('Too many indexers', 'occurred at index <name>')
может возникать в результате неправильного обращения к DataFrame pandas
после применения методов, которые изменяют его размерность или структуру. В вашем случае проблема связана с тем, что предсказания применяются к DataFrame, но не к тому формату, который ожидает метод predict
.
Также ошибка ValueError: could not convert string to float: 'Herve'
указывает на то, что последовательно переданные в модель данные включают строки, которые не были корректно обработаны. Это происходит из-за неправильного использования параметра remainder="passthrough"
в конвейере преобразования данных (ColumnTransformer
).
2. Подход к решению
Ваше текущее решение, которое включает удаление remainder="passthrough"
, исправляет ситуацию, так как все намеренные данные обрабатываются в рамках вашего конвейера, предотвращая попадание нечисловых значений в модель. Однако, это также убирает важный аспект — желание сохранить некоторые столбцы в выходных данных. Давайте рассмотрим, как можно обойти эту проблему.
3. Поэтапные рекомендации
Шаг 1: Защитите ваши данные
Перед началом убедитесь, что ваши данные не содержат пропусков или некорректных типов данных в столбцах, которые вы собираетесь использовать. Примените предварительную обработку данных, включая импротацию и преобразование типов в DataFrame
.
Шаг 2: Измените структуру конвейера
Вместо удаления remainder="passthrough"
, подумайте о создании отдельного конвейера для преобразования категориальных данных и применения к ним дополнительного этапа для сбора выходных данных:
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestClassifier
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder
import pandas as pd
# Предположим, что df является вашим оригинальным DataFrame.
X = df[categorical_features] # только категориальные признаки для обучения
y = df[prediction_col] # целевой признак
categorical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='constant', fill_value="missing")),
('ohe', OneHotEncoder(handle_unknown='ignore'))
])
preprocessor = ColumnTransformer(
transformers=[
('cat', categorical_transformer, categorical_features),
],
remainder='drop' # здесь мы убираем остальные столбцы
)
# Создание и обучение модели
rf = Pipeline(steps=[
('preprocessor', preprocessor),
('classifier', RandomForestClassifier(n_estimators=100))
])
rf.fit(X, y.values.ravel()) # важно использовать ravel для единой размерности
# Прогнозирование
df['rf_prediction'] = rf.predict(X)
# Теперь, если хотите, можете объединить с остальными столбцами
output_df = df[use_cols] # выборка только нужных столбцов
Шаг 3: Проверка выходных данных
После того, как вы выполните предсказания, важно убедиться, что выходной DataFrame действительно содержит все необходимые столбцы. Вы можете использовать df[['REVIEW_ACTION', 'rf_prediction']]
, чтобы проверить результаты, и дальнейшие действия с сохранением в файл, как CSV или Excel.
Заключение
Обрабатывая данные правильно и используя возможности Python и pandas
, вы сможете избежать ошибок индексирования и гарантировать, что ваша модель корректно получает нужные данные. Убедитесь, что ваши столбцы соответствуют формату, который требуется для машинного обучения, и ошибки отступят.