sklearn предсказание: IndexingError: (‘Слишком много индексаторов’, ‘произошло на индексе ‘)

Вопрос или проблема

Цель того, что я пытаюсь достичь здесь, заключается в том, чтобы вывод содержал все 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, вы сможете избежать ошибок индексирования и гарантировать, что ваша модель корректно получает нужные данные. Убедитесь, что ваши столбцы соответствуют формату, который требуется для машинного обучения, и ошибки отступят.

Оцените материал
Добавить комментарий

Капча загружается...