Вопрос или проблема
Я создал модель прогнозирования для этого набора данных
>>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 для категориальных переменных. Вопрос заключается в том, как использовать эту модель для предсказания, если мы имеем входные данные в их оригинальном виде, в частности, как конвертировать их в подходящий формат для модели.
Шаги Решения
-
Преобразование Исходного Датафрейма:
- Начнем с датафрейма, который содержит категориальную переменную
Service
, а также числовые переменныеTasks
иDifficulty
. - Применим преобразователь столбцов (
ColumnTransformer
), чтобы применить кодировку one-hot дляService
, оставляя остальные данные без изменений.
- Начнем с датафрейма, который содержит категориальную переменную
-
Создание Конвейера:
- Создаем конвейер (
Pipeline
), включающий этапы преобработки данных и шаг применения моделиRandomForestRegressor
. - Конвейер позволяет автоматизировать процесс подготовки данных и предсказания, управляя этими действиями как одним единственным процессом.
- Создаем конвейер (
-
Предсказание для Новых Данных:
- При получении новых входных данных, таких как
[['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
мы можем обеспечить, чтобы новые данные проходили те же шаги преобразования, что и обучающая выборка, упрощая процесс прогнозирования и минимизируя риски ошибок, связанных с несовпадением форматов данных. Это не только упрощает код, но и делается более устойчивым для развертывания в реальных приложениях.