Генератор фич на основе математических операций

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

import pandas as pd
import numpy as np


def search_features_by_correlation(df: pd.DataFrame, target):
    # only 1000 rows taken for better speed
    mx = df.copy()
    mx['target'] = target
    mx = mx.sample(min(df.shape[0], 1000))
    target = mx.target.values
    mx = mx.drop('target', axis=1)

    # определяем корреляция отдельно для каждой фичи
    single_cc = {}
    real_columns = []
    for k1, c1 in enumerate(mx.columns):
        if not str(c1).startswith('number'):
            continue
        if np.unique(mx[c1].values).shape[0] < 50:
            continue
        single_cc[c1] = np.corrcoef(mx[c1], target)[0][1]
        real_columns.append(c1)

    if len(real_columns) > 100:
        real_columns = real_columns[:100]

    all_combinations = combinations(real_columns, 2)

    def is_cc(col_names: list) -> list:
        cc_base = 0.25
        cc_base_x = 1.5
        res = []
        # signs_to_check = ['*', '/', '-', '+']
        signs_to_check = ['*', '/']

        if len(col_names) == 2:
            for s in signs_to_check:
                if s == '*':
                    prod = mx[col_names[0]] * mx[col_names[1]]
                elif s == '/':
                    prod = mx[col_names[0]] / mx[col_names[1]]
                elif s == '-':
                    prod = mx[col_names[0]] - mx[col_names[1]]
                elif s == '+':
                    prod = mx[col_names[0]] + mx[col_names[1]]

                prod_c = np.corrcoef(prod, target)[0][1]

                if abs(prod_c) > cc_base and abs(prod_c) > cc_base_x * max(abs(single_cc[col_names[0]]),
                                                                           abs(single_cc[col_names[1]])):
                    res.append([s])


        return res

    all_combinations = list(all_combinations)
    corr_results = list(map(is_cc, all_combinations))

    corr_results = {all_combinations[k]: el for k, el in enumerate(corr_results) if el}

    return corr_results

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>