时序特征相关系数的稳定性分析,真的很重要

在时序中,特征也许是具有时效性的,比如在某些市场环境下,股票的收益更看重公司的市盈率,另外的行情时,有看重换手率。本质上,可以反映为:在时间上,特征与目标变量之间相关性的不稳定

为此,我们能做一些相关性分析,帮我们找到这些时间上不稳定的特征,剔除它们,并让模型更加鲁棒。喜欢本文记得收藏、点赞、关注。

【注】文末提供技术交流群

这里,直接上例子:

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()

图片

先对训练集数据,每月统计特征与target的相关性:

# 获取(年,月)特征
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)

再观察每月各个特征相关性,随着时间变化的情况:

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()

图片

也可以看下,各个特征的月度相关性的标准差:

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()

图片

我们打印看看,top相关性标准差大的特征有哪些:

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)

图片

总结以上内容,打包函数如下:

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)

图片

实际使用上述方法,确实对含冗余特征且存在明显相关性不稳定的数据集,有提分的帮助。

扩展:除了相关性分析,Kaggle常见的一个技巧:对抗验证也能做这块不稳定特征的筛选工作(参考:https://www.kaggle.com/competitions/ubiquant-market-prediction/discussion/312398)。

推荐文章

技术交流

欢迎转载、收藏、有所收获点赞支持一下!

在这里插入图片描述

目前开通了技术交流群,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友

  • 方式①、发送如下图片至微信,长按识别,后台回复:加群;
  • 方式②、添加微信号:dkl88191,备注:来自CSDN
  • 方式③、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

长按关注

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据分析数据挖掘的步骤 数据挖掘主要包括以下⼏个步骤: 1、定义挖掘的⽬的 【⽬的】 清楚挖掘的⽬的是什么? 想要达到的⽬的是什么? 2、数据取样 【⽬的】抽取与挖掘⽬的关的数据集 抽取数据标准 关性 可靠性 完整性 有效性 3、数据探索 【⽬的】保证数据的质量,为模型质量打下基础 数据探索主要包括 异常值分析 缺失值分析 关性分析 周期性分析 可以从数据质量分析和数据特征分析两个⾓度对数据进⾏探索 数据质量分析 【⽬的】数据质量分析的主要任务是检查原始数据中是否存在脏数据; 数据质量分析要求我们拿到数据后先检测是否存在缺失值和异常值; 脏数据主要包括 缺失数据 数据的缺失主要包括记录的缺失和记录中某个字段的缺失 缺失的处理分为删除存在缺失值的记录、对可能值进⾏插补和不处理3种情况 异常数据 异常值分析是检验数据中是否有录⼊错误以及含有不合常理的数据(eg:年龄超过130岁) 异常值分析常⽤的⽅法有:简单统计量分析、3delta原则、箱型图分析等 不⼀致数据 数据不⼀致性是指数据的⽭盾性、不形容性;(eg:由于电话号码更新没有同步,⼀个⽤户的电话号码在不同的数据集中有不同的值) 重复数据以及含有特殊符号(eg:# ¥ *)的数据 数据特征分析 【⽬的】数据特征分析要求我们在数据挖掘建模前,通过频率分析、对⽐分析、帕累托分析、周期分析关性分析等⽅法,对采集的样本 数据的特征规律进⾏分析,以了解数据的规律和趋势,为数据挖掘的后续环节提供⽀持 特征分析的⽅法 分布分析 分布分析能揭⽰数据的分布特征和分布类型,有定量数据的分布分析和定性数据的分布分析两种⽅式; 定量分布分析的主要思想是将数据按照某⼀特征数据的分布按照特定的"组宽"对数据进⾏分组,并统计组内数据的频率信息 定性分布分析的主要思想是按照样本的某个特征的不同取值对样本进⾏分类并统计其频率 对⽐分析 对⽐分析是指把两个互联系的指标进⾏⽐较,特别适⽤于指标见的横纵向⽐较、时间序列的⽐较分析; 统计量分析 ⽤统计指标对定量数据进⾏统计描述,常从集中趋势(均值、中卫市、众数)和离散趋势(极差、标准差、变异系数、四分位数间距) 两⽅⾯进⾏分析; 周期性分析 周期性分析是探索某个变量是否随着时间变化⽽呈现出某种周期性变化趋势 贡献度分析 关性分析 分析两虚变量之间关性程度的强弱 可以通过绘制散点图、绘制散点图矩阵、计算关系数的⽅法进⾏分析 4、数据预处理 【⽬的】 提⾼数据的质量 让数据更好的适应特定的挖掘技术和⼯具 数据预处理主要包括 数据清洗 数据集成 数据变换 数据规约 数据清洗 【⽬的】数据清洗主要是删除原始数据中⽆关数据、重复数据,平滑噪声数据,筛选掉与挖掘主题⽆关的数据,处理缺失值、异常值等 缺失值处理:删除记录、数据插补(均值、中位数、众数插补、固定值插补、最近邻差补、回归⽅法、插值法{拉格朗⽇插值法、⽜顿 插值法}等)和不处理3种 数据集成 【⽬的】将多个数据源合并存放在⼀个⼀致的数据存储中; 需要考虑实体识别和属性冗余问题; 数据变换 【⽬的】对数据进⾏规范化处理 【⽅法】简单函数变换、规范化(最⼩-最⼤规范化、零-均值规范化、⼩数定标规范化等)、连续属性离散化、⼩波变换 数据规约 【⽬的】产⽣更⼩但保持源数据完整性的新数据集 【⽅法】属性规约(通过属性合并来创建或删除或合并属性)、数值规约(通过选择替代的、较⼩的数据来减少数据量) 5、挖掘建模 【⽬的】分析本次建模属于数据挖掘应⽤种的哪类问题(分类、聚类、关联规则、事需模型或智能推荐等) 根据挖掘⽬标和数据形式可以建⽴分类与预测、聚类分析、关联规则、事需模型和偏差检测等模型 【⽅法】 分类与预测 聚类分析 关联规则 时序模型 离群点检测 6、模型评估 【⽬的】在多个模型中找出⼀个最好的模型 根据业务对模型进⾏解释和应⽤

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值