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

 
Maxim Dmitrievsky #:

Нынче принято ко всему добавлять слово "causal" - и читается красиво и с намеком на волшебство :)

Да,  есть такое, даже в R чатике в телеге часто этот казуал упоминается 
 

Если увлекаетесь перебором признаков, здесь есть список с формулами, для временных рядов:

https://tsfresh.readthedocs.io/en/latest/text/list_of_features.html

Overview on extracted features — tsfresh 0.20.2.post0.dev1+ga7e14f8 documentation
  • tsfresh.readthedocs.io
tsfresh calculates a comprehensive number of features. All feature calculators are contained in the submodule: The following list contains all the feature calculations supported in the current version of tsfresh : Calculates a linear least-squares regression for values of the time series that were aggregated over chunks versus the sequence from...
 

Ранее публиковал графики смещения вероятности в кластерах тут , но там выборка была на листьях, а вот теперь решил посмотреть так будет выглядит ситуация, если просто взять выборку, при этом я использовал разные методы нормализации (в скобках название метода из библиотеки sklearn).


1. Без нормализации


2. Приводит значения признаков к диапазону от 0 до 1 (MinMaxScaler)


3. Приводит значения признаков к распределению со средним значением 0 и стандартным отклонением 1 (StandardScaler)


4. Приводит значения признаков к диапазону, устойчивому к наличию выбросов (RobustScaler)

Мне показалось любопытным, как нормализация влияет на кластеризацию.

Если отфильтровать по двум критериям - смещение вероятности от 5% и число примеров в кластере от 1% строк, то вариант без нормализации ничего не даёт вообще, а остальные по порядку выше:

MinMaxScaler - суммарный процент строк выборки train 4% 

StandardScaler - суммарный процент строк выборки train 5,6% 

RobustScaler - суммарный процент строк выборки train 8,83% 

Да, по моим критериям отбора строк получается маловато выборки для дальнейшего обучения, разве что попробовать отбор после кластеризации с методом нормализации  RobustScaler.

Вот что сообщает ChatGPT:

"

RobustScaler - это метод нормализации данных, который использует медиану и интерквартильный размах, чтобы масштабировать данные. Этот метод более устойчив к наличию выбросов в данных, чем стандартный MinMaxScaler или StandardScaler .

Вот как работает RobustScaler :

  1. Вычисление медианы и интерквартильного размаха: В отличие от MinMaxScaler или StandardScaler , которые используют среднее значение и стандартное отклонение соответственно, RobustScaler использует медиану и интерквартильный размах (IQR). Медиана - это значение, которое делит распределение данных пополам, а IQR - это разница между значениями квартиля 75% и квартиля 25%.

  2. Нормализация данных: Затем каждое значение признака вычитается из медианы и делится на IQR. Это масштабирует данные таким образом, что они имеют медиану 0 и размах 1.

Преимущества RobustScaler :

  • Устойчивость к выбросам: Использование медианы и интерквартильного размаха делает RobustScaler более устойчивым к выбросам в данных. Это позволяет лучше сохранять структуру данных при наличии выбросов.

  • Не требует предположений о распределении данных: Поскольку RobustScaler использует медиану и IQR, он не требует предположений о нормальном распределении данных.

"

 
Aleksey Vyazmikin #:

Ранее публиковал графики смещения вероятности в кластерах тут , но там выборка была на листьях, а вот теперь решил посмотреть так будет выглядит ситуация, если просто взять выборку, при этом я использовал разные методы нормализации (в скобках название метода из библиотеки sklearn).

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

 
Maxim Dmitrievsky #:

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

Вроде не должно

n_Set = len(arr_Set_Viborka)
for Set in range(n_Set):   
    if Use_Load_CSV == True:
        arr_data_load,arr_Target,arr_Info=f_Load_Data(dir_cb+'\\Setup',arr_Set_Viborka[Set],True,False)#Открыть файл в формате feather

        if Set == 0:#Нормализая - для не бинарной выборки
            scaler.fit(arr_data_load)
        arr_data_load = scaler.transform(arr_data_load)
 
Aleksey Vyazmikin #:

Вроде не должно

ну аrr data load всю историю содержит? значит кластеризация на всей истории проводится

проницателен как ванга

 
Maxim Dmitrievsky #:

ну аrr data load всю историю содержит? значит кластеризация на всей истории проводится

меня не на..шь, проницателен как ванга

# Функция для загрузки выборки - можно выбрать тип файлов CSV или feather
def f_Load_Data(Work_Dir,Name_File,Use_feather,Save_feather):
    # Булева переменная, которая определяет способ загрузки данных
    #Use_feather = True  # Измените на False, если хотите использовать CSV

    if Use_feather:
        feather_file_Load = Work_Dir+'\\'+Name_File+'.feather'
        # Чтение данных из файла Feather
        Load_data=feather.read_feather(feather_file_Load)
        # Вывод информации о типах данных для каждого столбца
        print(Load_data.dtypes)
        # Разделение на предикторы и целевой столбец
        x_Load = Load_data.drop(columns=['Time','Target_P','Target_100','Target_100_Buy','Target_100_Sell'])
        y_Load = Load_data['Target_100']
        Target_Info_Load=Load_data[['Time', 'Target_P', 'Target_100', 'Target_100_Buy', 'Target_100_Sell']].copy()
        del Load_data
    else:
        # Чтение данных из файла CSV
        csv_file_Load = Work_Dir+'\\'+Name_File+'.csv'
        with open(csv_file_Load, 'r', newline='', encoding='utf-8') as file:
            # Создаем объект чтения CSV файла
            csv_reader = csv.reader(file, delimiter=';')
            # Читаем только первую строку (заголовки)
            headers = next(csv_reader)
            # Находим индекс столбца "Время"
            index_of_time_column = headers.index("Time")
            # Подсчитываем количество столбцов до столбца "Time"
            num_columns_before_time = index_of_time_column
        # Теперь переменная num_columns_before_time содержит количество столбцов до столбца "Время"
        print(f"Количество столбцов до 'Время': {num_columns_before_time}")
        # Удалим ссылку/закроем файл
        del file

        # Определение типов данных для бинарных столбцов
        LAST_BINARY_COLUMN_INDEX = num_columns_before_time
        dtype_dict = {i: 'int8' for i in range(LAST_BINARY_COLUMN_INDEX)}#Указывается значение от 0 до числа, но не включительно!
        dtype_dict.update({'Time': 'object', 'Target_P': 'int8', 'Target_100': 'int8', 'Target_100_Buy': 'float64', 'Target_100_Sell': 'float64'})

        # Загрузка данных из файла CSV с указанием типов данных и срезом столбцов
        #Load_data = pd.read_csv(csv_file_Load, sep=';',decimal='.', dtype=dtype_dict, usecols=range(LAST_BINARY_COLUMN_INDEX + 5))
        Load_data = pd.read_csv(csv_file_Load, sep=';',decimal='.')
        # Преобразование столбца "Time" в тип данных datetime64
        Load_data['Time'] = pd.to_datetime(Load_data['Time'], errors='coerce')
        # Вывод информации о типах данных для каждого столбца
        print(Load_data.dtypes)

        # Сохраняем в формате Feather
        if Save_feather:
            feather.write_feather(Load_data, Work_Dir+'\\'+Name_File+'.feather')

        # Разделение на предикторы и целевой столбец
        x_Load = Load_data.drop(columns=['Time','Target_P','Target_100','Target_100_Buy','Target_100_Sell'])
        y_Load = Load_data['Target_100']
        Target_Info_Load=Load_data[['Time', 'Target_P', 'Target_100', 'Target_100_Buy', 'Target_100_Sell']].copy()
        print('Target_Info_Load=',Target_Info_Load)
        del Load_data
    return x_Load,y_Load,Target_Info_Load

Нет, данные из файлов, разбитых на подвыборки ранее.

 
Aleksey Vyazmikin #:

Нет, данные из файлов, разбитых на подвыборки ранее.

А где тогда аплай на другой подвыборке (тест, экзам) того же скалера

 
Maxim Dmitrievsky #:

А где тогда аплай на другой подвыборке (тест, экзам) того же скалера

Вроде как это же

arr_data_load = scaler.transform(arr_data_load)
На первой выборке считаем, и на всех применяем в цикле.
 
Maxim Dmitrievsky #:

А где тогда аплай на другой подвыборке (тест, экзам) того же скалера

типа здесь

n_Set = len(arr_Set_Viborka)
for Set in range(n_Set):   
    if Use_Load_CSV == True:
        arr_data_load,arr_Target,arr_Info=f_Load_Data(dir_cb+'\\Setup',arr_Set_Viborka[Set],True,False)#Открыть файл в формате feather

        if Set == 0:#Нормализая - для не бинарной выборки
            scaler.fit(arr_data_load)
        arr_data_load = scaler.transform(arr_data_load)

а, ну допустим норм

тогда не понимаю почему такая разница в результатах

Причина обращения: