A análise de estabilidade do coeficiente de correlação das características das séries temporais é muito importante

Na série temporal, as características podem ser sensíveis ao tempo, por exemplo, em algumas condições de mercado, o lucro da ação é mais importante para a relação preço/lucro da empresa, e em outras condições de mercado, a taxa de rotatividade é mais importante. Em essência, pode ser refletido como: no tempo, a instabilidade da correlação entre o recurso e a variável alvo .

Para isso, podemos fazer algumas análises de correlação para nos ajudar a encontrar essas características temporalmente instáveis, eliminá-las e tornar o modelo mais robusto. Se você gostou deste artigo, lembre-se de marcar, curtir e seguir.

[Nota] Um grupo de intercâmbio técnico é fornecido no final do artigo

Aqui, diretamente no exemplo:

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

# 导入数据
train_df = pd.read_csv('train.csv')
train.head()

foto

Primeiro, para os dados do conjunto de treinamento, a correlação entre os recursos estatísticos mensais e o destino:

# 获取(年,月)特征
train_df['Date'] = pd.to_datetime(train_df['Date'])
train_df['Date_year'] = train_df['Date'].dt.year
train_df['Date_month'] = train_df['Date'].dt.month
def concat_year_month(year, month):
    return (year, month)
train_df['Date_ym'] = train_df.apply(lambda x:concat_year_month(x['Date_year'], x['Date_month']), axis=1)

# 针对每月,统计特征与target的相关性
date_yms = train_df['Date_ym'].unique()
corr_df = []
for date_ym in date_yms:
    curr_df = train_df[train_df['Date_ym']==date_ym]
    curr_corr_df = curr_df.corr()
    curr_corr_df = curr_corr_df['target'].reset_index()
    curr_corr_df.rename(columns={
    
    'index':'feature', 'target':'corr'}, inplace=True)
    curr_corr_df['Date_ym'] = str(date_ym)
    corr_df.append(curr_corr_df)

corr_df = pd.concat(corr_df, axis=0).reset_index(drop=True)

Em seguida, observe a correlação de cada recurso em cada mês e mude com o tempo:

USE_COLS = [f for f in corr_df['feature'].unique() \
            if f not in ['Date', 'Date_year', 'Date_month', 'target']] # 训练时用的列名
corr_df = corr_df[corr_df['feature'].isin(USE_COLS)]
fig = plt.figure(figsize=(25,4))
fig = sns.lineplot(data=corr_df, x='Date_ym', y='corr', hue='feature')
fig.set_xticklabels(date_yms, rotation=90)
plt.title('the correlation along the time axis')
plt.show()

foto

Você também pode ver o desvio padrão da correlação mensal de cada recurso:

fig = plt.figure(figsize=(25,4))
fig = sns.boxplot(data=corr_df.sort_values('feature'), x='feature', y='corr')
plt.xticks(rotation=90)
plt.title('The BoxPlot of each feature')
plt.show()

foto

Vamos imprimir e ver quais são os recursos com grande desvio padrão de correlação superior:

top_corrStd_fnum = 10 # 选择top相关性标准差大的特征的数量
top_corrStd_feats = corr_df.groupby('feature').std().reset_index().sort_values('corr', ascending=False)['feature'].iloc[:top_corrStd_fnum].to_list()
print(top_corrStd_feats)

foto

Resumindo o que foi dito acima, a função da embalagem é a seguinte:

def get_unstable_feats(df, top_fnum=10, corr_thresh=0.15):
    """对训练集数据,每月统计特征与target的相关性,
       基于每个特征相关性的标准差,选择出TOP不稳定的特征,用于后续的特征选择工作
    输入:
        df       (pd.DataFrame): 训练集
        top_fnum          (int): top不稳定特征数量
        corr_thresh     (float): 相关性的标准差阈值
    注意:若选择corr_thresh,而不是top_fnum,只要将top_fnum设为None就好。
    输出:
        unstable_feats   (list): 不稳定的特征
    """
    # 获取(年,月)特征
    df['Date'] = pd.to_datetime(df['Date'])
    df['Date_year'] = df['Date'].dt.year
    df['Date_month'] = df['Date'].dt.month
    def concat_year_month(year, month):
        return (year, month)
    df['Date_ym'] = df.apply(lambda x:concat_year_month(x['Date_year'], x['Date_month']), axis=1)
    # 针对每月,统计特征与target的相关性
    date_yms = df['Date_ym'].unique()
    corr_df = []
    for date_ym in date_yms:
        curr_df = df[df['Date_ym']==date_ym]
        curr_corr_df = curr_df.corr()
        curr_corr_df = curr_corr_df['target'].reset_index()
        curr_corr_df.rename(columns={
    
    'index':'feature', 'target':'corr'}, inplace=True)
        curr_corr_df['Date_ym'] = str(date_ym)
        corr_df.append(curr_corr_df)
    corr_df = pd.concat(corr_df, axis=0).reset_index(drop=True)
    # 剔除非训练特征
    USE_COLS = [f for f in corr_df['feature'].unique() if f not in ['Date', 'Date_year', 'Date_month', 'target']]
    corr_df = corr_df[corr_df['feature'].isin(USE_COLS)]
    # 基于每个特征相关性的标准差,选择出TOP不稳定的特征
    if top_fnum != None:
        top_corrStd_fnum = top_fnum # 选择top相关性标准差大的特征的数量
        top_corrStd_feats = corr_df.groupby('feature').std().reset_index().sort_values('corr', ascending=False)['feature'].iloc[:top_corrStd_fnum].to_list()
    elif corr_thresh != None:
        corr_df = corr_df.groupby('feature').std().reset_index().sort_values('corr', ascending=False)
        top_corrStd_feats = corr_df[corr_df['corr'] >= corr_thresh]['feature'].to_list()
    print('Features with Unstable Correlation:', top_corrStd_feats)
    return top_corrStd_feats
    
top_corrStd_feats = get_unstable_feats(train_df, top_fnum=10, corr_thresh=None)

foto

O uso real do método acima é realmente útil para pontuar conjuntos de dados com recursos redundantes e instabilidade de correlação óbvia.

Extensão: Além da análise de correlação, uma técnica comum do Kaggle: a validação adversarial também pode fazer a triagem desse recurso instável (Referência: https://www.kaggle.com/competitions/ubiquant-market-prediction/discussion/312398 ).

artigo recomendado

Intercâmbio de Tecnologia

Bem-vindo a reimprimir, coletar, curtir e apoiar!

insira a descrição da imagem aqui

Atualmente, foi aberto um grupo de intercâmbio técnico, com mais de 2.000 membros . A melhor maneira de comentar ao adicionar é: fonte + direção de interesse, o que é conveniente para encontrar amigos com ideias semelhantes

  • Método 1. Envie a seguinte imagem para o WeChat, pressione e segure para identificar e responda em segundo plano: adicionar grupo;
  • Método ②, adicione micro-sinal: dkl88191 , nota: da CSDN
  • Método ③, conta pública de pesquisa do WeChat: aprendizado de Python e mineração de dados , resposta em segundo plano: adicionar grupo

pressione longamente siga

Acho que você gosta

Origin blog.csdn.net/weixin_38037405/article/details/123940973
Recomendado
Clasificación