Статья с подходом, похожим на тот, что продвигает Aleksey Vyazmikin. Вместо дерева классификации строится "дерево разностей", в котором каждому листу соответствует своя вероятность события (на примере частоты пожаров). По сути, это некий вариант кластеризации.
Сразу скажу, что подробно пересказывать статью не готов, поскольку только вскользь просмотрел её.
Спасибо за статью!
Перевёл, прочёл.
Можете помочь алгоритм в виде формул перевести на более понятный язык? А я постараюсь написать код этого способа построения дерева.
Maxim Dmitrievsky #: Я конкретно ответил на ваш конкретный вопрос - в любой, какой хотите. Это ваше личное дело. Даже странно, почему у меня спросили. К интересующей меня теме это не имело отношения.
Хм, Вы тут в ветке сообщили об uplift моделях, которые являются развитием A-B тестирования. Так вот, метод разработан для оценки влияния, когда меняется от нового влияния целевая. Поэтому для меня очевидно, что точку начала влияния искомого предиктора следует установить. Вот я и хотел услышать Ваши мысли по данному вопросу. В том числе причину, по которой Вы считаете, что это неважно.
Maxim Dmitrievsky #: Зачем шедевры обзывать мусором? Вам я бесплатно предлагал, в том числе на ваших суперпризнаках, как и Алексею. Но был послан в кодобазу. И теперь он, жалобщик, бегает и обзывается еще.
Кто жалобщик? Кто обзывается?
Если речь обо мне, то обвинения беспочвенны. Я буду тратить свои силы на устранение неугодных, по справедливости, только в случае, если это будет необходимо для достижения моих целей.
Я предложил дать значения предикторов для проверки, так как это быстро.
Ранее уже писал, что использую предикторы в большом количестве на данных с ZZ, даже суть описывал. Переписывать это на питон - контрпродуктивно.
Можете помочь алгоритм в виде формул перевести на более понятный язык? А я постараюсь написать код этого способа построения дерева.
Там, в статье, на 10-й странице есть реализация в виде псевдокода. На предпоследней странице, в приложении, есть ссылки на реализацию на языке R и на данные, использованные в статье.
Как, в общих чертах, реализуете деревья решений на mql5? Через массивы или шаблоны?
Хм, Вы тут в ветке сообщили об uplift моделях, которые являются развитием A-B тестирования. Так вот, метод разработан для оценки влияния, когда меняется от нового влияния целевая. Поэтому для меня очевидно, что точку начала влияния искомого предиктора следует установить. Вот я и хотел услышать Ваши мысли по данному вопросу. В том числе причину, по которой Вы считаете, что это неважно.
Выборки в рандомизированных экспериментах определяются слу чай но. Самое начало книги.
Есть открытие сделок в случайном порядке и соответствующий результат на контрольной группе, а есть модель, построенная на другой подвыборке, тестовой. Нужно определить эффект от использования такой модели, является ли он положительным для контрольной группы. Если да, то аплифтнуть модель одним из предложенных способов.
Простым тестированием на новых данных вы не можете определить эффект, потому что часто есть смещение в данных. Поэтому формула состоит из двух слагаемых ATE + Bias. Можно пойти еще дальше и определить CATE, то есть для каждого отдельного случая, и выбрать только те, которые лучше поддаются лечению, остальные игнорировать/пропускать в торговле.
В терминах Саныча, ищете стационарное в нестационарном.
Если речь обо мне, то обвинения беспочвенны. Я буду тратить свои силы на устранение неугодных, по справедливости, только в случае, если это будет необходимо для достижения моих целей.
Я предложил дать значения предикторов для проверки, так как это быстро.
Ранее уже писал, что использую предикторы в большом количестве на данных с ZZ, даже суть описывал. Переписывать это на питон - контрпродуктивно.
def R_learner():
dataset = get_prices()
dataset = labeling(dataset)
data = dataset[dataset.index < FORWARD].copy()
data['treatment'] = data['labels'].apply(lambda x: np.random.choice([0, 1], p=[0.2, 0.8])) // случайно выбрал элементы для лечения
X = data[data['treatment'] == 1]
X = X[X.columns[1:-2]]
X_t = data[data['treatment'] == 0]
X_t = X_t[X_t.columns[1:-2]]
y = data[data['treatment'] == 1]
y = y[y.columns[-2]]
y_t = data[data['treatment'] == 0]
y_t = y_t[y_t.columns[-2]]
treat_m = CatBoostClassifier(iterations=1000,
depth=6,
custom_loss=['Accuracy'],
eval_metric='Accuracy',
verbose=False,
use_best_model=True,
task_type='CPU')
treat_m.fit(X, y, eval_set=(X_t, y_t),
early_stopping_rounds=50, plot=False) // обучил модель на этих примерах, остальные попали в валидацию
data['y_t'] = [x[0] < 0.5for x in treat_m.predict_proba(data[data.columns[1:-2]])] // теперь метки классов - это предсказания обученной модели
data['y_t'] = data['y_t'].astype(float)
# perform residualisation
debias_m = CatBoostClassifier(iterations = 5,
max_depth = 1,
early_stopping_rounds = 2,
verbose = False) // эта модель определяет смещение в оценках тритмента
denoise_m = CatBoostClassifier(iterations = 5,
max_depth = 1,
early_stopping_rounds = 2,
verbose = False) // эта модель определяет смещение в оценках целевой
t_diff = data['treatment'] - cross_val_predict(debias_m,
data[data.columns[1:-3]],
data[data.columns[-2]],
method='predict_proba', cv=5)[:, 0] // определяем тритмент эффект
y_diff = data['y_t'] - cross_val_predict(denoise_m,
data[data.columns[1:-3]],
data[data.columns[-1]],
method='predict_proba', cv=5)[:, 0] // определяем байес
# create the weights
w = t_diff ** 2 // новые веса для модели
# create the transformed target
y_debias = (y_diff / t_diff).apply(lambda x: 1if x > 0.0else0) // новые метки без смещения
data['weights'] = w
data['y_debias'] = y_debias
data = data.drop(['labels', 'treatment', 'y_t'], axis=1)
X = data[data.columns[1:-2]]
y = data[data.columns[-2:]]
train_X, test_X, train_y, test_y = train_test_split(
X, y, train_size=0.5, test_size=0.5, shuffle=True)
train_data = Pool(
data=train_X,
label=train_y[train_y.columns[1]],
weight=train_y[train_y.columns[0]] // добавляем веса к обучению
)
eval_data = Pool(
data=test_X,
label=test_y[test_y.columns[1]],
weight=test_y[test_y.columns[0]]
)
# learn final model with train and validation subsets
model = CatBoostClassifier(iterations=1000,
depth=6,
learning_rate=0.1,
custom_loss=['Accuracy'],
eval_metric='Accuracy',
verbose=False,
use_best_model=True,
task_type='CPU')
model.fit(X= train_data, eval_set=eval_data,
early_stopping_rounds=50, plot=False) // учим новую модель с обесшумленными метками и дополнительными весами
return model
Такой подход работает плохо на новых данных. Видимо потому, что плохо проработал вопрос с определением, что должно являться тритментом и по отношению к чему :)
Такой подход работает плохо на новых данных. Видимо потому, что плохо проработал вопрос с определением, что должно являться тритментом и по отношению к чему :)
В статье используются очень важные знания о входных данных - эластичность спроса-предложения. Отсюда стойкий запах сверх подгонки.
У нас таких фундаментальных данных о котировках нет, более того, скорее всего эластичность не работает: цена актива может меняться от нуля и до небес.
Код, который Вы выложили, а также сам причинно-следственный подход, будет иметь ценность только после прогона в тестере МКЛ-5, причем обязательно с форвардом.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Статья с подходом, похожим на тот, что продвигает Aleksey Vyazmikin. Вместо дерева классификации строится "дерево разностей", в котором каждому листу соответствует своя вероятность события (на примере частоты пожаров). По сути, это некий вариант кластеризации.
Сразу скажу, что подробно пересказывать статью не готов, поскольку только вскользь просмотрел её.
Спасибо за статью!
Перевёл, прочёл.
Можете помочь алгоритм в виде формул перевести на более понятный язык? А я постараюсь написать код этого способа построения дерева.
Я конкретно ответил на ваш конкретный вопрос - в любой, какой хотите. Это ваше личное дело. Даже странно, почему у меня спросили. К интересующей меня теме это не имело отношения.
Хм, Вы тут в ветке сообщили об uplift моделях, которые являются развитием A-B тестирования. Так вот, метод разработан для оценки влияния, когда меняется от нового влияния целевая. Поэтому для меня очевидно, что точку начала влияния искомого предиктора следует установить. Вот я и хотел услышать Ваши мысли по данному вопросу. В том числе причину, по которой Вы считаете, что это неважно.
Зачем шедевры обзывать мусором? Вам я бесплатно предлагал, в том числе на ваших суперпризнаках, как и Алексею. Но был послан в кодобазу. И теперь он, жалобщик, бегает и обзывается еще.
Кто жалобщик? Кто обзывается?
Если речь обо мне, то обвинения беспочвенны. Я буду тратить свои силы на устранение неугодных, по справедливости, только в случае, если это будет необходимо для достижения моих целей.
Я предложил дать значения предикторов для проверки, так как это быстро.
Ранее уже писал, что использую предикторы в большом количестве на данных с ZZ, даже суть описывал. Переписывать это на питон - контрпродуктивно.
Спасибо за статью!
Перевёл, прочёл.
Можете помочь алгоритм в виде формул перевести на более понятный язык? А я постараюсь написать код этого способа построения дерева.
Там, в статье, на 10-й странице есть реализация в виде псевдокода. На предпоследней странице, в приложении, есть ссылки на реализацию на языке R и на данные, использованные в статье.
Как, в общих чертах, реализуете деревья решений на mql5? Через массивы или шаблоны?
Хм, Вы тут в ветке сообщили об uplift моделях, которые являются развитием A-B тестирования. Так вот, метод разработан для оценки влияния, когда меняется от нового влияния целевая. Поэтому для меня очевидно, что точку начала влияния искомого предиктора следует установить. Вот я и хотел услышать Ваши мысли по данному вопросу. В том числе причину, по которой Вы считаете, что это неважно.
Кто жалобщик? Кто обзывается?
Если речь обо мне, то обвинения беспочвенны. Я буду тратить свои силы на устранение неугодных, по справедливости, только в случае, если это будет необходимо для достижения моих целей.
Я предложил дать значения предикторов для проверки, так как это быстро.
Ранее уже писал, что использую предикторы в большом количестве на данных с ZZ, даже суть описывал. Переписывать это на питон - контрпродуктивно.
Такой подход работает плохо на новых данных. Видимо потому, что плохо проработал вопрос с определением, что должно являться тритментом и по отношению к чему :)
идея R-learner взята отсюдаТакой подход работает плохо на новых данных. Видимо потому, что плохо проработал вопрос с определением, что должно являться тритментом и по отношению к чему :)
идея R-learner взята отсюдаВ статье используются очень важные знания о входных данных - эластичность спроса-предложения. Отсюда стойкий запах сверх подгонки.
У нас таких фундаментальных данных о котировках нет, более того, скорее всего эластичность не работает: цена актива может меняться от нуля и до небес.
Код, который Вы выложили, а также сам причинно-следственный подход, будет иметь ценность только после прогона в тестере МКЛ-5, причем обязательно с форвардом.
Даже с поправкой на эластичность, оно не сработало вообще никак на новых данных. Хотя на трейне осталось нормально.
Причины устанавливаются...
Потому что может быть сработало, но не так, как хотелось бы
Даже с поправкой на эластичность, оно не сработало вообще никак на новых данных. Хотя на трейне осталось нормально.
Причины устанавливаются...
Потому что может быть сработало, но не так, как хотелось бы