Используя 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.
Ошибка, которую вы вычисляете, является абсолютной ошибкой. При усреднении он дает среднюю абсолютную ошибку, которая обычно используется для оценки регрессионных моделей. О выборе метрики ошибок можно прочитать здесь.
Этот вектор ошибок представляет собой длину вашего набора тестовых данных, и его элементы расположены в том же порядке, что и ваши записи. Многие люди назначают их обратно в фрейм данных. Затем, если вы оставите там номер клиента, все должно совпасть.
Начнем с 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')