Обсуждение статьи "Продвинутый ресемплинг и выбор CatBoost моделей брутфорс методом" - страница 10

 
elibrarius:

Какие?

F1, MCC вроде получше

вот полный список

https://catboost.ai/docs/concepts/loss-functions-classification.html

Classification: objectives and metrics - CatBoost. Documentation
  • catboost.ai
If the target type is not binary, then every object with target value and weight is replaced with two objects for the metric calculation: Target values must be in the range [0; 1]. If the target type is not binary...
 
Maxim Dmitrievsky:

F1, MCC вроде получше

вот полный список

https://catboost.ai/docs/concepts/loss-functions-classification.html

Тут сложно что-то предположить, почему они лучше.
 
Maxim Dmitrievsky:

Еще раз

Ну да, есть смысл иногда.

Еще немного позапускал. Да, есть смысл стакать. Вопрос кол-ва пока открытый.

Прекрасная статья и титаническая работа!

Дропнул метки стоящие после смены направления в датасете перед тем как подать их в модель смесей. 

X['labels'].loc[X['labels'].diff(2)!=0] = np.nan
X = X.dropna().reset_index(drop=True)

по наблюдениям, большее число моделей дают положительный результат. 

Iteration:  0 R^2:  0.5260017837414628
Iteration:  1 R^2:  0.6331497253790681
Iteration:  2 R^2:  0.029844101542724655
Iteration:  3 R^2:  0.792134192720112
Iteration:  4 R^2:  -0.5575595243513453
Iteration:  5 R^2:  0.6266442030501214
Iteration:  6 R^2:  0.22435035980633944
Iteration:  7 R^2:  0.38384379495564724
Iteration:  8 R^2:  0.028795249767878173
Iteration:  9 R^2:  0.4976165963899961
Iteration:  10 R^2:  0.38091909530246537
Iteration:  11 R^2:  0.6668471456765452
Iteration:  12 R^2:  0.9173487144971179
Iteration:  13 R^2:  0.31007344321289365
Iteration:  14 R^2:  0.4391449002278133
Iteration:  15 R^2:  0.8643834389201246
Iteration:  16 R^2:  0.1609614914253078
Iteration:  17 R^2:  -0.593998636390909
Iteration:  18 R^2:  0.7253019217609338
Iteration:  19 R^2:  0.11872614816490491
Iteration:  20 R^2:  0.0023909994463473527
Iteration:  21 R^2:  0.6486563192357756
Iteration:  22 R^2:  0.011546691763490213
Iteration:  23 R^2:  0.8085201529889603
Iteration:  24 R^2:  0.9233877589157101
Iteration:  25 R^2:  -0.08743681307491602
Iteration:  26 R^2:  0.6132492793114834
Iteration:  27 R^2:  0.0016322532208268292
Iteration:  28 R^2:  -0.2241780583190326
Iteration:  29 R^2:  0.6739577294046565
Iteration:  30 R^2:  0.43270922254052624
Iteration:  31 R^2:  -0.40571688327667377
Iteration:  32 R^2:  0.8558895655918841
Iteration:  33 R^2:  0.22222950417101828
Iteration:  34 R^2:  0.8718519436072187
Iteration:  35 R^2:  0.3103828388939166
Iteration:  36 R^2:  -0.3274785257455094
Iteration:  37 R^2:  -0.056797883380174774
Iteration:  38 R^2:  0.7372428685425149
Iteration:  39 R^2:  0.46650446544282376
Iteration:  40 R^2:  0.7158974618001703
Iteration:  41 R^2:  -0.08982821839565835
Iteration:  42 R^2:  -0.004541876992860683
Iteration:  43 R^2:  0.39737057218337546
Iteration:  44 R^2:  -0.35131421135378293
Iteration:  45 R^2:  -0.003237278102928842
Iteration:  46 R^2:  0.37272998002935753
Iteration:  47 R^2:  -0.5554473442698793
Iteration:  48 R^2:  0.38766288235168855
Iteration:  49 R^2:  0.8582912360226171

результаты лучшего теста в тестере и терминале:


Вообще, прекраская работа. С помощью нее я проверил все свои целевые и выбросил их в мусору)) 

 
welimorn:

Прекрасная статья и титаническая работа!

Дропнул метки стоящие после смены направления в датасете перед тем как подать их в модель смесей. 

по наблюдениям, большее число моделей дают положительный результат. 

результаты лучшего теста в тестере и терминале:


Вообще, прекраская работа. С помощью нее я проверил все свои целевые и выбросил их в мусору)) 

да, можно дропать перед кластеризацией

спасибо за отзыв :)

З.Ы так можно тестировать сразу все модели, усредненные. Поиграть. Парсер для всех моделей пока не делал, еще пока сомневаюсь. Но иногда ансамбль из нескольких моделей реально улучшает.

def test_models(result):
    pr_tst = get_prices(FULL_DATE, STOP_DATE)
    X = pr_tst[pr_tst.columns[1:]]
    X.columns = [''] * len(X.columns)

    #test the learned model
    p = 0
    for i in range(len(result)):
        p += result[i][2].predict_proba(X)

    p = p/len(result)
    p2 = [x[0]<0.5 for x in p]
    pr2 = pr_tst.iloc[:len(p2)].copy()
    pr2['labels'] = p2
    R2 = tester(pr2, MARKUP, plot=True)

test_models(res)
ЗЫЗЫ. можно сделать перебор разных комбинаций обученных моделей по той же метрике R2, как развитие темы. Потом сохранять лучший ансамбль. Можно даже через генетику, если моделей много.
 
Hi Maxim,

Thanks for another nice article! :)

I took EURUSD, H1 data from 2015 to 2020 and did split it into three sets:

1. Training Set: from 2015.01.01 to 2018.01.01
    This only be used to train GMM.

2. Validation Set: from 2018.01.01 to 2019.01.01
    This set together with Training Set will be used in brute force function to find the best model

3. Test Set: from 2019.01.01 to 2020.01.01
    This set only be used to test the best model obtained from brute force algorithm

Below is the result of a backtest on whole data set,


I have double checked my code and yet I might have done something wrong. Anyhow you might have some idea about the results. Best regards, Rasoul


Документация по MQL5: Константы, перечисления и структуры / Именованные константы / Предопределенные макроподстановки
Документация по MQL5: Константы, перечисления и структуры / Именованные константы / Предопределенные макроподстановки
  • www.mql5.com
//| Expert initialization function                                   | //| Expert deinitialization function                                 | //| Expert tick function                                             | //| test1                                                            |...
 
Rasoul Mojtahedzadeh:
Hi Maxim,

Thanks for another nice article! :)

I took EURUSD, H1 data from 2015 to 2020 and did split it into three sets:

1. Training Set: from 2015.01.01 to 2018.01.01
    This only be used to train GMM.

2. Validation Set: from 2018.01.01 to 2019.01.01
    This set together with Training Set will be used in brute force function to find the best model

3. Test Set: from 2019.01.01 to 2020.01.01
    This set only be used to test the best model obtained from brute force algorithm

Below is the result of a backtest on whole data set,


I have double checked my code and yet I might have done something wrong. Anyhow you might have some idea about the results. Best regards, Rasoul


Hi, Rasoul. Try to reduce the training set size. It can depends of different settings, but key trick is that then less train size, better generalization on new data. In the next article I’ll try to explain this effect.
 
Maxim Dmitrievsky

Подскажите, а как можно загружать свои данные через csv-файл? 


Пробывал так, но не загрузилось. 


В файле такой формат: 

time,close

2020,11,15,1.3587

2020,11,16,1.3472 


def get_prices(START, STOP):
    prices = pd.read_csv('file.csv', columns=['time', 'close']).set_index('time')
    prices.index = pd.to_datetime(prices.index, unit='s')
    prices = prices.dropna()
    pr = prices.copy()
    count = 0
    for i in MA_PERIODS:
        returns = pr - pr.rolling(i).mean()
        for l in range(LOOK_BACK):
            prices[str(count)] = returns.shift(l)
            count += 1
    return prices.dropna()
 
Evgeni Gavrilovi:

Подскажите, а как можно загружать свои данные через csv-файл? 

def get_prices(look_back = 15):
    prices = pd.DataFrame(mt5.copy_rates_range(SYMBOL, TIMEFRAME, START_DATE, STOP_DATE), 
                            columns=['time', 'close']).set_index('time')
    prices.index = pd.to_datetime(prices.index, unit='s')
    prices = prices.dropna()
    pr = prices.copy()
    count = 0
    for i in MA_PERIODS:
        returns = pr - pr.rolling(i).mean()
        for l in range(look_back):
            prices[str(count)] = returns.shift(l)
            count += 1
    
    prices = prices.dropna()
    prices.to_csv('pr.csv', sep=';')
pr = pd.read_csv('pr.csv', sep=';')

т.е. это пример загрузки данных из терминала, сохранения в файл. А потом можно использовать в колабе

 
Maxim Dmitrievsky:
Hi, Rasoul. Try to reduce the training set size. It can depends of different settings, but key trick is that then less train size, better generalisation on new data. In the next article I’ll try to explain this effect.

Вот это хорошо. Было бы здорово увидеть в статье ремарку об области применимости данного тезиса - в частности, к различным методам МО. Почему-то для НС рекомендуют 70/30. А по логике, ИМХО, 50/50 должно давать более стабильные результаты.

 
Stanislav Korotky:

Вот это хорошо. Было бы здорово увидеть в статье ремарку об области применимости данного тезиса - в частности, к различным методам МО. Почему-то для НС рекомендуют 70/30. А по логике, ИМХО, 50/50 должно давать более стабильные результаты.

Есть активное и пассивное обучение. Пассивное заключается в ручной разметке данных и обучении на них, в этом случае данных должно быть много, но возникает проблема правильной разметки. Т.е. "учитель" сам должен так разметить данные, чтобы они были, условно, из одного и того же распределения и хорошо обобщались. В этой связи почти нет разницы какая пропорция трейн\тест. Это почти ничего не дает, просто проверка модели, проверка того, насколько хорошо вы разметили данные вручную.

В активном обучении модель учится сама размечать данные оптимальным образом. В статье как раз такой случай разметки через GMM. То есть используется как обучение с учителем, так и без учителя. В данном случае модель учится учиться на небольших размеченных данных и должна сама разметить оставшиеся данные оптимальным образом. Это относительно новый подход (примерно от 2017 г.). И я хочу рассмотреть его более детально в след. статье.

слишком много "данных" в предложениях, извиняюсь за тавтологию )
Причина обращения: