Как использовать модель предсказания после кодирования One-hot?

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

Я создал модель прогнозирования для этого набора данных

>>df.head()

    Service    Tasks Difficulty     Hours
0   ABC         24     1           0.833333
1   CDE         77     1           1.750000
2   SDE         90     3           3.166667
3   QWE         47     1           1.083333
4   ASD         26     3           1.000000

>>df.shape
(998,4)

>>X = df.iloc[:,:-1]
>>y = df.iloc[:,-1].values
>>from sklearn.compose import ColumnTransformer 
>>ct = ColumnTransformer([("cat", OneHotEncoder(),[0])], remainder="passthrough")
>>X = ct.fit_transform(X)  
>>x = X.toarray()
>>x = x[:,1:]

>>x.shape
(998,339)

>>from sklearn.ensemble import RandomForestRegressor
>>rf_model = RandomForestRegressor(random_state = 1)
>>rf_model.fit(x,y)

Как я могу использовать эту модель для предсказания Hours для пользовательского ввода в формате [["SDE", 90, 3]]

Я попробовал

>>test_input = [["SDE", 90, 3]]
>>test_input = ct.fit_transform(test_input)  
>>test_input = test_input[[:,1:]

>>test_input[0]
array([24, 1], dtype=object)


>>predict_hours = rf_model.predict(test_input)
ValueError

Так как в моем наборе данных много категориальных значений, невозможно ввести закодированное значение "SDE" в качестве входных данных, мне нужно преобразовать "SDE" в формат onehot после получения ввода [["SDE", 90, 3]]

Я не знаю, как это сделать, может кто-нибудь помочь?

from sklearn.compose import ColumnTransformer 
from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestRegressor

df.head()

    Service    Tasks Difficulty     Hours
0   ABC         24     1           0.833333
1   CDE         77     1           1.750000
2   SDE         90     3           3.166667
3   QWE         47     1           1.083333
4   ASD         26     3           1.000000

df.shape
(998,4)

X = df.drop(["Hours"],axis = 1)
y = df.Hours

ct = ColumnTransformer([("cat", OneHotEncoder(handle_unknown = "ignore"),[0])], remainder="passthrough")
    

rf_model = RandomForestRegressor(random_state = 1)

model = Pipeline([("preprocessing",ct),("model",rf_model)]).fit(X,y)

x_test = pd.DataFrame({"Service":"SDE", "Tasks":90, "Difficulty":3}, index = [0])

# В идеале вы разбиваете данные на тренировочные и тестовые, в этом случае вы должны передать x_test, который является DataFrame pandas с значениями, которые вы хотите предсказать
model.predict(x_test)

Ответ или решение

Чтобы успешно использовать модель предсказания после одноразовой кодировки (one-hot encoding), необходимо правильно преобразовать входные данные и применить модель для предсказания. Рассмотрим подробно процесс, начиная с преобразования и заканчивая использованием модели на тестовых данных.

Проблематика

У нас есть модель, обученная на данных с использованием кодирования one-hot для категориальных переменных. Вопрос заключается в том, как использовать эту модель для предсказания, если мы имеем входные данные в их оригинальном виде, в частности, как конвертировать их в подходящий формат для модели.

Шаги Решения

  1. Преобразование Исходного Датафрейма:

    • Начнем с датафрейма, который содержит категориальную переменную Service, а также числовые переменные Tasks и Difficulty.
    • Применим преобразователь столбцов (ColumnTransformer), чтобы применить кодировку one-hot для Service, оставляя остальные данные без изменений.
  2. Создание Конвейера:

    • Создаем конвейер (Pipeline), включающий этапы преобработки данных и шаг применения модели RandomForestRegressor.
    • Конвейер позволяет автоматизировать процесс подготовки данных и предсказания, управляя этими действиями как одним единственным процессом.
  3. Предсказание для Новых Данных:

    • При получении новых входных данных, таких как [['SDE', 90, 3]], нам необходимо создать структура данных, совместимую с предыдущей архитектурой модели.
    • Сконвертируем новый ввод в pandas.DataFrame, соответствующий структуре переменных с правильным типом данных.

Пример Реализации

Вот как можно реализовать этот процесс на практике:

import pandas as pd
from sklearn.compose import ColumnTransformer 
from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestRegressor
from sklearn.preprocessing import OneHotEncoder

# Данные
df = pd.DataFrame({
    'Service': ['ABC', 'CDE', 'SDE', 'QWE', 'ASD'],
    'Tasks': [24, 77, 90, 47, 26],
    'Difficulty': [1, 1, 3, 1, 3],
    'Hours': [0.833333, 1.750000, 3.166667, 1.083333, 1.000000]
})

# Подготовка данных
X = df.drop(["Hours"], axis=1)
y = df["Hours"]

# Преобразователь
ct = ColumnTransformer([
    ("cat", OneHotEncoder(handle_unknown="ignore"), [0])
], remainder="passthrough")

# Модель
rf_model = RandomForestRegressor(random_state=1)

# Конвейер
model = Pipeline([
    ("preprocessing", ct),
    ("model", rf_model)
])

# Обучение модели
model.fit(X, y)

# Новые данные для предсказания
x_test = pd.DataFrame({"Service": ["SDE"], "Tasks": [90], "Difficulty": [3]})

# Предсказание
predicted_hours = model.predict(x_test)

print(predicted_hours)

Заключение

Важно помнить, что с помощью Pipeline мы можем обеспечить, чтобы новые данные проходили те же шаги преобразования, что и обучающая выборка, упрощая процесс прогнозирования и минимизируя риски ошибок, связанных с несовпадением форматов данных. Это не только упрощает код, но и делается более устойчивым для развертывания в реальных приложениях.

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

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