Task04 特征工程

1 特征工程

1.1 为什么重视特征工程

数据挖掘的二八原则:
• 80% 的精力 => 选取特征
• 20% 的精力 => 模型融合
什么是特征工程?
• 基于数据分析与探索提取潜在有价值的特征
在这里插入图片描述
特征工程有利于我们构建最后的模型
在这里插入图片描述

1.2 特征提取与特征组合

(1)如何进行特征提取
• 基于数据分析与探索提取
• 箱型图分析 => 交易量与周几有关 => 最终应得到 7个0-1型特征(是否周一、是否周二 ……… )
在这里插入图片描述
• 点线图分析 => user_start_level(用户星级)、 user_occupation_id(用户职业)均与is_trade(是否 交易)有关 => 虽然 user_start_level有序,但可以继续考虑离散化
在这里插入图片描述
离散型特征的重要性:
• 可用于 设计规则
• 易于模型拟合,xgboost 、lightgbm 、catboost 等都以决策树为基模型
• 便于理解
• 便于做特征组合
• 在推荐系统等领域很常见
(2)如何进行特征组合
• 简单粗暴的进行加、 减、乘、除、log 、exp 等运算,易于 生成大量特征,但会出现过拟合问题且不易于解释
• 理解问题背景,开发想象力并做数据分析与探索

以时间序列问题为例,常见的特征类别包括统计量(最大值、小中位数偏度峰等)、排序(各统计量在历史同期的排名) 、分位数(各统计量在历史同期的排名)、分位数(各统计量在历史同期的排名的分位数)等;时间序列规则的周期因子可视为特征组合
以推荐系统为例,常见的特征类别包括用户、商品特征、行为特征(按时段计)等; 可对其中的离散型特征直接做组合

1.3 特征处理——“优胜劣汰”

特征工程通常会提取出大量特征,该如何选择好的子集?
• 劣态:剔除几乎无关的特征,保留大量特征
• 处理自变量间共线性:可通过特征组合;A与B存在共线性,保留 A,构造 A/B
在这里插入图片描述
• 优胜:挑选出良好特征,组成最优特征子集
在这里插入图片描述
特征重要性分析方法
1.Mean Variance Test (见 02 .数据分析与探索)
2.SHAP,以一种统一的方法来解释任何机器学习模型的输出
• SHapley Additive exPlanations
• Python包shap
• 解释任意机器学习模型的输出
在这里插入图片描述
可以显示特征的重要程度
在这里插入图片描述
• 特征i的SHAP值
在这里插入图片描述
F —— 所有特征构成的集合
S —— 𝐹{𝑖}的子集
• SHAP Value为正,表明变量对预测值有促进作用
• SHAP Value为负,表明变量对预测值有抑制作用
• 绝对值越大 => 对预测影响越大
在这里插入图片描述
3.Permutation Importance
• Python包eli5
• 一个特征被处理为随机数后,若模型效果下降明显则认该重要

2 面向资金流入流出预测的特征工程

2.1 工具包载入和数据划分

导入工具包

import pandas as  pd
import numpy as np

import datetime
import shap
import eli5
import seaborn as sns
import matplotlib.pyplot as plt

from mvtpy import mvtest
from wordcloud import WordCloud
from scipy import stats
from eli5.sklearn import PermutationImportance
from sklearn import tree
from sklearn.preprocessing import OneHotEncoder
from sklearn.linear_model import LinearRegression

from typing import *
import warnings 
warnings.filterwarnings('ignore')

(1)劣汰
基于02.数据分析与探索,提取是/否类型的特征
• 是否周一、是否周二……是否周日
• 与节假日相关的特征——是否节假日、是否节假日第一天、是否节假日最后一天等等
• 与月初、月末相关的特征
在这里插入图片描述
提取此类特征的方法:

# 是否是假期
total_balance['is_holiday'] = 0
total_balance.loc[total_balance['date'].isin(get_holiday_set()), 'is_holiday'] = 1
    
# 是否是节假日的第一天
last_day_flag = 0
total_balance['is_firstday_of_holiday'] = 0
for index, row in total_balance.iterrows():
    if last_day_flag == 0 and row['is_holiday'] == 1:
        total_balance.loc[index, 'is_firstday_of_holiday'] = 1
    last_day_flag = row['is_holiday']

首先定义一个空列与列名,默认值为0,然后按照选取条件想相应索引对应的值置位1
利用箱型图观察是/否类型特征的特点
• 可发现一些明显不佳的特征
• is_work_on_sunday,样本量严重不平衡
• is_first_week,0/1取值差异不大

在这里插入图片描述
利用相关性分析是/否类型特征
• 申购总额与is_weekend负相关
• 申购总额与is_work正相关
• 剔除一些弱相关(例如,<0.1)的特征
在这里插入图片描述

在这里插入图片描述
考虑到节假日、月初、月末等的特殊性,提取相关距离特征
• 距放假的天数、距上班的天数等
• 距月初天数、距月中天数、距星期日天数等
在这里插入图片描述
基于点线图分析距离特征
在这里插入图片描述
对距节假日和月初天数等特征做处理,处理距离过远的时间点(天数x>5 => x=10)
• dis_to_holiday方差太大
• dis_from_startofmonth
• dis_from_middileofmonth
在这里插入图片描述
基于相关性分析距离特征
• 申购总额与dis_to_nowork正相关
• 申购总额与dis_from_endofweek正相关
• 申购总额与dis_to_work负相关
• 申购总额与dis_from_work负相关
• 剔除一些弱相关(例如,<0.1)的特征
在这里插入图片描述
考虑距波峰、波谷的天数
• 如何确定波峰、波谷?(以星期为周期)
• 申购总额时序图
在这里插入图片描述

在这里插入图片描述
根据时序图得出上图结论,左列为波峰,右列为波谷
添加03.时间序列规则与baseline中的周期因子
• 星期周期因子
• 月份周期因子
• 赎回周期因子也与申购总额相关
剔除相关性低的特征
在这里插入图片描述
添加时序特征
• 以星期为周期
• 统计申购总额的均值、中位数、最大值、最小值、偏度等
在这里插入图片描述
观察特征的分布特点
• is_premonth
• is_midmonth
• is_tailmonth
• is_secday_of_month

在这里插入图片描述
剔除对数据集划分不明显的特征,如’is_gonna_work_tomorrow’,‘is_fourth_week’,‘weekday_onehot_4’
劣汰获得一些相关性较低的特征:

['is_firstday_of_work', 'is_midmonth', 'is_first_week', 'is_lastday_of_workday', 'weekday_onehot_3', 'is_work_on_sunday', 'is_gonna_work_tomorrow', 'is_second_week', 'is_secday_of_month', 'is_worked_yestday', 'weekday_onehot_1', 'is_firstday_of_month', 'weekday_onehot_2', 'weekday_onehot_4', 'weekday_onehot_5', 'weekday_onehot_0', 'weekday_onehot_6', 'is_weekend', 'dis_from_endofweek', 'dis_from_middleofmonth', 'dis_to_nowork', 'dis_from_middleofweek']

使用MVTest挽回一些有依赖性但是不相关的特征

# MVtest Ref: https://github.com/ChuanyuXue/MVTest

l = mvtest.mvtest()

name_list = []
Tn_list = []
p_list = []
for i in [i for i in feature_low_correlation if 'is' in i or 'discret' in i]:
    pair = l.test(feature['total_purchase_amt'], feature[i])
    name_list.append(str(i))
    Tn_list.append(pair['Tn'])
    p_list.append(pair['p-value'][0])
temp = pd.DataFrame([name_list,Tn_list]).T.sort_values(1)
temp[1] = np.abs(temp[1])
feature_saved_from_mv_purchase = list(temp.sort_values(1, ascending=False)[temp[1] > 0.5984][0])

最后剔除复共线特征(存在精确相关关系或高度相关关系而使模型估计失真或难以估计准确)
在这里插入图片描述

(2)优胜
采用Shap方法分析特征重要性,并排序
在这里插入图片描述
采用Permutation Importance方法分析特征重要性,并排序
在这里插入图片描述
对不同方法的排序列表前Top K取交集

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
特征工程是指从原始数据中提取特征以供机器学习算法和模型使用的一项工程活动。在Matlab中进行特征工程时,可以使用不同的方法来处理特征。 其中,对于定性特征(也称为分类特征),需要将其转换为定量特征(也称为数值特征),因为某些机器学习算法和模型只接受定量特征的输入。一种常用的方法是使用OneHot编码,即为每一种定性值指定一个定量值。这种方式避免了手动调参的工作,并且对于线性模型来说,使用OneHot编码后的特征可以达到非线性的效果。 另外,在特征工程中还需要注意数值问题。例如,如果输入的数值很大,而有效权值很小,可能导致数值精度问题。在Matlab中,可以通过合适的数值处理方式来解决这个问题,确保数值计算的准确性。 总结起来,在Matlab中进行特征工程包括从原始数据中提取特征,并使用合适的方法处理定性特征和数值精度问题,以提高机器学习算法和模型的性能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [特征工程系列(一):特征工程的概念/特征的处理](https://blog.csdn.net/Myordry/article/details/105347182)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值