Машинное обучение в трейдинге: теория, модели, практика и алготорговля - страница 3609

[Удален]  

Ну и понятно, что чем на большее кол-во кластеров разбивать, тем больше можно найти хороших, но кол-во сэмплов в них будет маленькое.

По сути большинство датасетов - мусор. И часто даже исправление не помогает, либо мало сделок.

В примере разбил на 500 кластеров, выведены лучшие. Вручную их объединять и комбинировать не имеет никакого смысла.

Iteration: 0
Cluster 479: Count = 9, Mean = 0.50
Cluster 437: Count = 12, Mean = 0.50
Cluster 195: Count = 22, Mean = 0.41
Cluster 255: Count = 10, Mean = 0.40
Cluster 52: Count = 26, Mean = 0.38
Cluster 246: Count = 14, Mean = 0.36
Cluster 420: Count = 27, Mean = 0.35
Cluster 354: Count = 20, Mean = 0.35
Cluster 366: Count = 32, Mean = 0.34
Cluster 271: Count = 18, Mean = 0.33
Cluster 229: Count = 69, Mean = 0.33
Cluster 349: Count = 26, Mean = 0.31
Cluster 373: Count = 39, Mean = 0.29
Cluster 326: Count = 85, Mean = 0.29
Cluster 289: Count = 66, Mean = 0.29
Cluster 295: Count = 14, Mean = 0.29
Cluster 353: Count = 18, Mean = 0.28
Cluster 202: Count = 61, Mean = 0.27
Cluster 296: Count = 29, Mean = 0.26
Cluster 286: Count = 33, Mean = 0.26
Cluster 344: Count = 57, Mean = 0.25
Cluster 13: Count = 73, Mean = 0.25
Cluster 101: Count = 44, Mean = 0.25
Cluster 397: Count = 20, Mean = 0.25
Cluster 209: Count = 28, Mean = 0.25
Cluster 43: Count = 43, Mean = 0.24
Cluster 262: Count = 84, Mean = 0.24
Cluster 88: Count = 61, Mean = 0.24
Cluster 129: Count = 38, Mean = 0.24
Cluster 277: Count = 19, Mean = 0.24
Cluster 90: Count = 171, Mean = 0.24
Cluster 417: Count = 135, Mean = 0.23
Cluster 60: Count = 45, Mean = 0.23
Cluster 190: Count = 15, Mean = 0.23
Cluster 128: Count = 89, Mean = 0.23
Cluster 460: Count = 22, Mean = 0.23
Cluster 154: Count = 110, Mean = 0.23
Cluster 109: Count = 65, Mean = 0.22
Cluster 385: Count = 36, Mean = 0.22
Cluster 328: Count = 71, Mean = 0.22
Cluster 191: Count = 46, Mean = 0.22
Cluster 120: Count = 44, Mean = 0.20
Cluster 379: Count = 54, Mean = 0.20
Cluster 56: Count = 138, Mean = 0.20
Cluster 360: Count = 131, Mean = 0.20
Cluster 87: Count = 50, Mean = 0.20
Cluster 431: Count = 43, Mean = 0.20
Cluster 259: Count = 26, Mean = 0.19
Cluster 232: Count = 13, Mean = 0.19
Cluster 436: Count = 55, Mean = 0.19
Cluster 111: Count = 45, Mean = 0.19
[Удален]  

Ф-я для вывода такой инфы и для исправления кластеров по порогу, а не по количеству лучших:

через чатгпт можно на другие ЯП переписать наверное.

def find_best_clusters_proba(dataset, n_clusters=200, probability_threshold=0.02) -> pd.DataFrame:
    # Применяем KMeans для кластеризации
    dataset['clusters'] = KMeans(n_clusters=n_clusters).fit(dataset[dataset.columns[1:-1]]).labels_
    # Вычисляем среднее значение 'labels' для каждого кластера
    cluster_means = dataset.groupby('clusters')['labels'].mean()
    # Вычисляем количество элементов в каждом кластере
    cluster_counts = dataset.groupby('clusters')['labels'].count()
    # Вычисляем абсолютные разности между средними значениями меток и 0.5
    abs_diff_from_05 = cluster_means.sub(0.5).abs()
    # Выбираем все индексы, значения которых больше или равны порогу вероятности
    sorted_clusters = abs_diff_from_05[abs_diff_from_05 >= probability_threshold].index
    # Сортируем кластеры по их абсолютным разностям
    sorted_clusters_for_print = abs_diff_from_05.sort_values(ascending=False).index
    for cluster in sorted_clusters_for_print:
        count = cluster_counts[cluster]
        mean = abs_diff_from_05[cluster]
        print(f"Cluster {cluster}: Count = {count}, Mean = {mean:.2f}")
    # Создаем словарь для отображения средних значений в новые значения только для выбранных кластеров
    mean_to_new_value = {cluster: 0.0 if mean < 0.5 else 1.0 for cluster, mean in cluster_means.items() if cluster in sorted_clusters}
    # Применяем изменения к исходным значениям 'labels' только для выбранных кластеров
    dataset['labels'] = dataset.apply(lambda row: mean_to_new_value[row['clusters']] if row['clusters'] in mean_to_new_value else row['labels'], axis=1)
    # Создаем новый столбец 'meta_labels'
    dataset['meta_labels'] = dataset['clusters'].apply(lambda x: 1 if x in sorted_clusters else 0)
    # Удаляем столбец 'clusters'
    dataset = dataset.drop(columns=['clusters'])
    return dataset
 
по одной функции весь процесс не понять, покажы с данными и моделью, чтобы можно было весь процесс прогнать и осмыслить
[Удален]  
mytarmailS #:
по одной функции весь процесс не понять, покажы с данными и моделью, чтобы можно было весь процесс прогнать и осмыслить

Еще больше объяснять придется.. :) ты же знаешь, что будут одни вопросы. Пока что не охото, потому что не доделал все, что хотел. Саму суть идеи пока описываю. Еще сам не обкатал до конца.

На вход любой датасет с метками, на выходе тот же датасет, но уже с исправленными. На нем обучаешься, потом проверяешь на другом (новых данных). Другие модификации функций, более простые, раньше по тексту

Это весь код тогда надо будет расписывать, лучше через статью, потому что долго
 
Maxim Dmitrievsky #:

Еще больше объяснять придется.. :) ты же знаешь, что будут одни вопросы. Пока что не охото, потому что не доделал все, что хотел. Саму суть идеи пока описываю. Еще сам не обкатал до конца.

На вход любой датасет с метками, на выходе тот же датасет, но уже с исправленными. На нем обучаешься, потом проверяешь на другом (новых данных). Другие модификации функций, более простые, раньше по тексту

Это весь код тогда надо будет расписывать, лучше через статью, потому что долго

как раз полный код исключит все вопросы

[Удален]  
mytarmailS #:

как раз полный код исключит все вопросы

Нет, там начнутся вопросы к тестеру, а че там наверное где-то подглядывание, а как вот это работает, а что вот здесь нажать... А как файл правильно загрузить, а какая версия библиотеки, а какая версия питона... А чето у меня не запускается.. Там же много кода.
 
Maxim Dmitrievsky #:
Нет, там начнутся вопросы к тестеру, а че там наверное где-то подглядывание, а как вот это работает, а что вот здесь нажать... А как файл правильно загрузить, а какая версия библиотеки, а какая версия питона... А чето у меня не запускается.. Там же много кода.

ладно, возьми простой общеизвестный датасет например ирисы фишера или сделай свой синтетический и примени свою функцию и покажы код этого, без модели, тестирования , тестера итп

[Удален]  
mytarmailS #:

ладно, возьми простой общеизвестный датасет например ирисы фишера или сделай свой синтетический и примени свою функцию и покажы код этого, без модели, тестирования , тестера итп

У ирисов много классов, надо бинарный. Можно будет потом взять как пример что-нибудь, да.

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

Попробуй переписать на R через чатгпт, он должен справиться.

from sklearn.cluster import KMeans

def fix_labels_subset_mean(dataset, n_clusters=200, subset_size=100) -> pd.DataFrame:
    # Применяем KMeans для кластеризации
    dataset['clusters'] = KMeans(n_clusters=n_clusters).fit(dataset[dataset.columns[:-1]]).labels_
    # Вычисляем среднее значение 'labels' для каждого кластера
    cluster_means = dataset.groupby('clusters')['labels'].mean()
    # Сортируем кластеры по их средним значениям и выбираем те, которые наиболее далеки от 0.5
    sorted_clusters = cluster_means.sub(0.5).abs().sort_values(ascending=False).index[:subset_size]
    # Создаем словарь для отображения средних значений в новые значения только для выбранных кластеров
    mean_to_new_value = {cluster: 0.0 if mean < 0.5 else 1.0 for cluster, mean in cluster_means.items() if cluster in sorted_clusters}
    # Применяем изменения к исходным значениям 'labels' только для выбранных кластеров
    dataset['labels'] = dataset.apply(lambda row: mean_to_new_value[row['clusters']] if row['clusters'] in mean_to_new_value else row['labels'], axis=1)
    dataset = dataset.drop(columns=['clusters'])
    return dataset
 
Maxim Dmitrievsky #:

У ирисов много классов, надо бинарный. Можно будет потом взять как пример что-нибудь, да.

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

Попробуй переписать на R через чатгпт, он должен справиться.

У ирисов три класса, можешь сделать бинарную целевую в одну строку типа класс есть 1 и не есть 2 и не есть 3.
В результате бинарная целевая..


Да я могу загнать в гпт и перевести на другой ЯП но я не могу быть уверен что работает коректно.. те надо проконтролировать какие данные входят , как преобразовкються и какие выходят..  нужен  нормальный воспроизводимый пример понимаешь
[Удален]  
mytarmailS #:
У ирисов три класса, можешь сделать бинарную целевую в одну строку типа класс есть 1 и не есть 2 и не есть 3.
В результате бинарная целевая..


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

Что-нибудь соображу попозже. Тогда оценивать можно будет только через ошибки моделей, если без тестера.