Как справиться с большим разбросом целевой переменной при работе над проблемой многомерной регрессии?
Я работаю над проблемой регрессии, где у меня есть три переменных-предиктора как [count], [mean], [usage]
и одна целевая переменная как Max_utilization
. Мои данные выглядят примерно так:
df1
count mean usage Max_utilzation
1 8515 5.305 23570
1 7906 5.985 5347
1 7819 5.245 121296
1 7646 14.735 19547
1 7852 10.255 569256
1 7852 10.255 569256
1 7852 9.52 7872
2 7033 18.675 8744
2 7030 6.72 185786
2 6998 12.1 94806.6
2 6987 14.535 4766
2 6971 12.145 281594
2 6960 7.405 140075
2 6963 4.83 13328
Как мы видим, для единственного значения count
есть несколько Max_utilization
значения присваиваются, и это тоже с очень большими вариациями. я сделалlog
преобразование моих переменных-предикторов с использованием np.log10
а затем использовал RandomForestRegressor
модель, чтобы соответствовать моим данным поезда.
Когда я проверял прогноз, я обнаружил, что мой прогноз неточный. Допустим, прогноз на моей записи в test
данные выглядят так:
count mean usage prediction
1 7200 4.9 9320
В приведенном выше сценарии моя модель предсказала значение как 9320
однако фактическое значение 7845
.
Я предполагаю, что это предсказание связано с тем, что в моем столбце фрейма данных count
, для одного значения есть несколько значений Max_utilization
присвоено. Итак, моя модель предсказывает значение между min
а также max
диапазон целевой переменной. Если я ошибаюсь, поправьте меня.
Также есть способ решить эту проблему, чтобы получить более точные результаты.
Я также пробовал нормализовать целевую переменную и после предсказания попытался инвертировать целевую переменную, но у меня это не сработало.
Я также попытался взять среднее значение каждого столбца при единственном значении count
Но и там у меня это не сработало.
df1['mean'] = np.log10(df1['mean'])
df1['usage'] = np.log10(df1['usage'])
df1['count'] = np.log10(df1['count'])
df1['Max_utilization'] = np.log10(df1['Max_utilization'])
X_TC01_v1 = df1.drop(['Max_utilization'],axis=1)
y_TC01_v1 = df1['Max_utilization']
"""split data into train and test"""
X_train_tc01_v1, X_test_tc01_v1, y_train_tc01_v1, y_test_tc01_v1 = train_test_split(X_TC01_v1,
y_TC01_v1, test_size=0.1,random_state=111)
rf_model = RandomForestRegressor(n_estimators=20,criterion='mse',verbose=0)
rf_model.fit(X_train_tc01_v1, y_train_tc01_v1)