Как я могу связать записи в наборе обучающих данных с соответствующими прогнозами модели?

Используя scikit-learn, я создал регрессионную модель для прогнозирования максимальных расходов клиентов на транзакцию. Набор данных, который я использую, выглядит примерно так: целевой столбец — это максимальные расходы на транзакцию за предыдущий год:

customer_number | metric_1 | metric_2 | target
----------------|----------|----------|-------
111             | A        | X        | 15
222             | A        | Y        | 20
333             | B        | Y        | 30

Я разделяю набор данных на наборы для обучения и тестирования, сразу кодирую функции, обучаю модель и делаю некоторые тестовые прогнозы:

target = pd.DataFrame(dataset, columns = ["target"])
features = dataset.drop("target", axis = 1)
train_features, test_features, train_target, test_target = train_test_split(features, target, test_size = 0.25)

train_features = pd.get_dummies(train_features)
test_features = pd.get_dummies(test_features)

model = RandomForestRegressor()
model.fit(X = train_features, y = train_target)

test_prediction = model.predict(X = test_features)

Я могу вывести различные показатели точности модели (среднюю среднюю ошибку, среднеквадратическую ошибку и т. д.), используя соответствующие функции в scikit-learn. Однако я хотел бы иметь возможность сказать, какие прогнозы клиентов являются наиболее неточными. Итак, я хочу иметь возможность создать фрейм данных, который выглядит следующим образом:

customer_number | target | prediction | error
----------------|--------|----------- |------
111             | 15     | 17         | 2
222             | 20     | 19         | 1
333             | 30     | 50         | 20

Я могу использовать это, чтобы выяснить, есть ли какая-либо корреляция между функциями и моделью, дающей неточные прогнозы. В этом примере я вижу, что у клиента 333 самая большая ошибка, поэтому я потенциально могу сделать вывод, что клиенты с metric_1 = B в конечном итоге получат менее точные прогнозы.

Я думаю, что могу вычислить подобные ошибки (пожалуйста, поправьте меня, если я ошибаюсь), но я не знаю, как связать их с номером клиента.

error = abs(test_target - test_prediction) 

Как я могу получить желаемый результат?

🤔 А знаете ли вы, что...
Python популярен в анализе данных и машинном обучении с помощью библиотеки scikit-learn.


3
54
2

Ответы:

Решено

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

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

Начнем с DataFrame df и будем использовать идиоматические имена для вещей:

df_train, df_test = train_test_split(df)

y_train, y_test = df_train["target"], df_test["target"]

X_train = df_train.drop(["customer_number", "target"], axis=1)
X_test = df_test.drop(["customer_number", "target"], axis=1)

X_train = pd.get_dummies(X_train)
X_test = pd.get_dummies(X_test)

model = RandomForestRegressor()
model.fit(X_train, y_train)

df_test["prediction"] = model.predict(X_test)
df_test["error"] = abs(df_test["target"] - df_test["prediction"])

Вы можете сделать это, добавив столбец в train_features DataFrame и вызвав DataFrame.nlargest(). Например:

test_features['error'] = abs(test_target - test_prediction)
test_features.nlargest(3, 'error')

Похоже, вы используете customer_number как функцию. Вероятно, это не то, что вы хотите. Вместо этого вы можете удалить поле customer_number следующим образом:

train_data, test_data, train_target, test_target = train_test_split(features, target, test_size = 0.25)

train_features = pd.get_dummies(train_data.drop("customer_number", axis = 1))
test_features = pd.get_dummies(test_data.drop("customer_number", axis = 1))

model = RandomForestRegressor()
model.fit(X = train_features, y = train_target)

test_prediction = model.predict(X = test_features)

test_data['error'] = abs(test_target - test_prediction)
test_data.nlargest(3, 'error')