Я использую случайный лес в качестве модели регрессии и имею следующие данные, где X — это многомерный набор данных в симплексной форме. Я пробовал использовать перестановку и следующий код:
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error
X = pd.read_csv("X_p.csv", delimiter = ",", engine = "c", index_col=0, low_memory=False)
Y = pd.read_csv("Y_p.csv", delimiter = ",", engine = "c", low_memory=False)
X = X.iloc[:, 1:]
Y = Y.iloc[:, 1:]
Y = Y['0'].values.ravel()
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.25, random_state=42)
rf_model = RandomForestRegressor(n_estimators=100,min_samples_split=5,max_depth=50, random_state=42)
original_mse = mean_squared_error(Y_train, rf_model.fit(X_train, Y_train).predict(X_train))
permuted_mse = []
for _ in range(10): # Number of permutations
permuted_Y = np.random.permutation(Y_train)
permuted_mse.append(mean_squared_error(permuted_Y, rf_model.fit(X_train, permuted_Y).predict(X_train)))
# Step 6: Significance Testing based on MSE
p_value_mse = np.sum(permuted_mse > original_mse) / (len(permuted_mse)+1)
# Print results
print("Original MSE:", original_mse)
print("Permutation test p-value based on MSE:", p_value_mse)
выход:
Original MSE: 2.2922379491349436
Permutation test p-value based on MSE: 0.9090909090909091
Process finished with exit code 0
Просто запустив 10 перестановок, код занимает довольно много времени и всегда возвращает очень высокое значение p (в основном все перестановленные mse больше исходного), в чем моя ошибка? Я пытался изменить параметры случайного леса, но, похоже, ничего не помогает.
Я добавил ответ об аспекте кода, связанном с p-значением. Мне нечего предложить, как ускорить обучение модели случайного леса. (За время между публикацией этого вопроса и сейчас у вас, возможно, было время для многих перестановок, поэтому скорость может не быть проблемой!) Возможно, вы захотите открыть новый вопрос по этому поводу, поскольку этот вопрос (и ответ) в основном касается тест на перестановку и С.О. лучше подходит для ответа на один конкретный вопрос за раз. Вы также можете опубликовать на Cross Validated (stats.stackexchange.com) информацию о других тестах, которые могут быть быстрее.
Я предполагаю, что идея использования mse состоит в том, чтобы оценить, что наша начальная mse должна быть ниже, чем случайно переставленное представление данных.
Это подчеркивает проблему с реализацией теста перестановки: ваша альтернативная гипотеза состоит в том, что наблюдаемая MSE ниже, чем если бы Y не зависела от X. Другими словами, более низкая MSE является «более экстремальной», чем можно было бы ожидать случайно. при нулевой гипотезе. Итак, последний шаг должен быть:
p_value_mse = (np.sum(permuted_mse <= original_mse) + 1) / (len(permuted_mse)+1)
Это вносит три изменения в приведенный выше код:
<
вместо >
, чтобы соответствовать проверяемой альтернативной гипотезе.<=
вместо <
, потому что элементы нулевого распределения, равные наблюдаемой статистике, также будут считаться «экстремальными».+1
в числитель и знаменатель (ссылка ). Эти +1
обычно интерпретируются как включение исходного наблюдения в распределение перестановок, что дает интуитивное основание для включения их как в числитель, так и в знаменатель. Однако см. 1 для получения дополнительной информации: есть основания полагать, что это приближение к (долгосрочному) «точному» значению p (несмотря на использование рандомизации).Вы также можете прочитать учебник SciPy о Повторной выборке и методах Монте-Карло, если вы не знакомы с темой тестов перестановки.
Какую нулевую гипотезу вы пытаетесь проверить? Если это не очевидно, можете ли вы объяснить, почему обучающая MSE регрессора, обученного на данных, является подходящей статистикой для обнаружения отклонения от этой нулевой гипотезы?