Как обучать LightgBM для непосредственной оптимизации для корреляции производительности в течение периода периодаPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как обучать LightgBM для непосредственной оптимизации для корреляции производительности в течение периода периода

Сообщение Anonymous »

Я пытаюсь построить модель для прогнозирования результата (5 классов в соответствии с [70%, 20%, 1%, 9%]) отдельных событий для разных организаций в течение нескольких периодов времени (например, годы). Для каждой собственности средние средние значения класса варьируются как +/- 5%. Хотя точность на уровне событий важна, моя общая цель-создать модель, чьи прогнозы являются стабильными и прогнозирующими для будущей производительности. Основная подвеска заключается в том, что основной целью является корреляция периода с периодом между ожидаемым средним значением сущностей для T-Entity, среднее для T+1, я также хочу, чтобы ожидаемый результат в результате исхода к исходу, который был на правом уровне, все еще. /> В настоящее время я использую Hyperopt для настройки классификатора LGBM. У меня есть объективная функция для Hyperopt, которая оценивает эту корреляцию в течение периода периода. Прогнозы для выравнивания прогноза последнего периода с фактическим результатом этого периода. Не влюблен в взвешенный Пирсон, но я думаю, что сейчас проходы. Существует несоответствие между моим окончательной метрикой оценки и целевой целью обучения модели. Невозможно для метрики, которая зависит от операций GroupBy () и Shift () по всему набору данных. Существуют ли другие подходы, которые были бы лучше подходят для этой проблемы, чем Simple LogLoss?
X = df[['feature_1', 'feature_2', 'feature_3', 'feature_4', 'feature_5_flag', 'time_period']]
y = df['outcome']

monotone_constraints = [0, 0, 0, -1, 0, 0]

space = {
'n_estimators': hp.quniform('n_estimators', 100, 1000, 100),
'learning_rate': hp.loguniform('learning_rate', np.log(0.01), np.log(0.1)),
'max_depth': hp.quniform('max_depth', 3, 10, 1)
}

df['entity_period_id'] = df['entity_id'].astype(str) + df['time_period'].astype(str)

def objective(space):
"""
Objective function to be minimized by hyperopt.
This calculates the metric I want the model to learn directly.
"""
N_SPLITS = 5
skf = StratifiedKFold(n_splits=N_SPLITS, shuffle=True, random_state=6)
oof_preds = np.zeros(len(df))

for train_idx, val_idx in skf.split(X, y):
X_train, y_train = X.iloc[train_idx], y.iloc[train_idx]
X_val, _ = X.iloc[val_idx], y.iloc[val_idx]

model = lgb.LGBMClassifier(
n_estimators=int(space['n_estimators']),
learning_rate=space['learning_rate'],
max_depth=int(space['max_depth']),
random_state=6, n_jobs=-1,
monotone_constraints=monotone_constraints
)
model.fit(X_train, y_train)
fold_preds = model.predict_proba(X_val)[:, 1]
oof_preds[val_idx] = fold_preds

eval_df = df.copy()
eval_df['predicted_prob'] = oof_preds
entity_means = (
eval_df.groupby('entity_period_id')
.agg(
avg_predicted_prob=('predicted_prob', 'mean'),
actual_outcome_rate=('outcome', 'mean'),
event_count=('outcome', 'count')
).reset_index()
)

entity_means['entity_id'] = entity_means['entity_period_id'].str[:-4]
entity_means['period'] = entity_means['entity_period_id'].str[-4:].astype(int)
entity_means = entity_means.sort_values(by=['entity_id', 'period'])

entity_means['projected_value'] = entity_means.groupby('entity_id')['avg_predicted_prob'].shift(1)
entity_means['prev_period_event_count'] = entity_means.groupby('entity_id')['event_count'].shift(1)
entity_means.dropna(subset=['projected_value', 'actual_outcome_rate', 'prev_period_event_count'], inplace=True)

def weighted_corr(x, y, w):
if len(x) < 2: return 0
w, x, y = np.array(w), np.array(x), np.array(y)
w_mean_x, w_mean_y = np.average(x, weights=w), np.average(y, weights=w)
cov_xy = np.average((x - w_mean_x) * (y - w_mean_y), weights=w)
var_x, var_y = np.average((x - w_mean_x)**2, weights=w), np.average((y - w_mean_y)**2, weights=w)
if var_x == 0 or var_y == 0: return 0
return cov_xy / np.sqrt(var_x * var_y)

if len(entity_means) < 2:
corr = 0
else:
corr = weighted_corr(
entity_means['projected_value'],
entity_means['actual_outcome_rate'],
entity_means['prev_period_event_count']
)
if np.isnan(corr): corr = 0

return {'loss': -corr, 'status': STATUS_OK}

trials = Trials()
best = fmin(fn=objective, space=space, algo=tpe.suggest, max_evals=100, trials=trials)

print(best)

lgb_model = lgb.LGBMClassifier(
n_estimators=int(best['n_estimators']),
learning_rate=best['learning_rate'],
max_depth=int(best['max_depth']),
random_state=6,
n_jobs=-1,
monotone_constraints=monotone_constraints
)

lgb_model.fit(X, y)



Подробнее здесь: https://stackoverflow.com/questions/797 ... ormance-co
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»