• 一、连续型变量

    • 1.1 连续变量无量纲化
    • 1.2 连续变量数据变换
    • 1.3 连续变量离散化
  • 二、类别变量编码
  • 三、时间型、日期型变量转换
  • 四、 缺失值处理
  • 五、 特征组合

一、连续型变量

1.1 连续变量无量纲化
无量纲化: 使不同规格尺度的数据转化统一规格尺度(将数据单位统一)
无量纲化方法:标准化, 区间所方法
标准化: 将连续性变量转变为 均值0 标准差1 的变量
x′=x−x¯¯¯σ     其中x¯¯¯是均值,σ是标准差x′=x−x¯σ其中x¯是均值,σ是标准差

{x}'=\frac{x-\overline{x}}{\sigma}~~~~~其中\overline{x}是均值,{\sigma}是标准差

代码:                                 #对 Amount字段--均值为0,方差为1标准化
from sklearn import preprocessing
std = preprocessing.StandardScaler()  #StandardScaler
Amount = RFM['Amount'].values.reshape(-1,1)
std.fit(Amount)
RFM['Amount_std'] = std.transform(Amount)
RFM.head(5)

区间缩放法:把原始的连续型变量转换为范围在[a,b]或者 [0,1] 之间的变量

x′=x−min(x)max(x)−min(x)x′=x−min(x)max(x)−min(x)

{x}'=\frac{x-\mathit{min}(x)}{\mathit{max}(x)-\mathit{min}(x)}

代码:                                       #对 Amount字段--[0,1]区间归一化
from sklearn import preprocessing
MinMaxscaler = preprocessing.MinMaxscaler()  #MinMaxscaler
Amount = RFM['Amount'].values.reshape(-1,1)
MinMaxscaler.fit(Amount)                     #拟合(训练)
RFM['Amount_range'] = MinMaxscaler.transform(Amount)
RFM.head(5)
1.2 连续变量数据变换
数据变换:通过函数变换改变原始数据的分布
目   的: 数据从无关系 -> 有关系呈偏态分布-->变换后差异拉开让数据符合模型理论所需要的假设,然后对其分析,例如:变换后数据呈正态分布
数据变化方法:
logX,Ine 等 对数函数变换 x′=ln(x)x′=ln(x){x}'=ln(x)
box-cox 变换 :自动寻找最佳正态分布变换函数的方法

代码1:             #对 Amount字段--log 变换
import numpy as np
RFM['Amount_log'] = np.log(RFM['Amount'])
RFM,head(5)代码2:             #对 Amount字段--sqrt (平方根) 变换
import numpy as np
RFM['Amount_sqrt'] = np.sqrt(RFM['Amount'])
RFM,head(5)
1.3 连续变量离散化
目的:方便探索数据相关性减少异常数据对模型的干扰为模型引入非线性,提升模型预测能力离散后,可进行特征交叉组合,又M+N 变成 M*N
数据离散化方法:非监督离散方法:自定义规则,等宽方法,等频/等深方法 
非监督离散方法:#对 Amount字段--自定义区间 离散化cut_points = [0,200,500,800,1000]RFM['Amount_bin'] = pd.cut(RFM['Amount'],bin = cut_points)RFM,head(5)#对 Amount字段--等宽 离散化RFM['Amount_width_bin'] = pd.cut(RFM.Amount,20) #分成20等分RFM,head(5)grouped = RFM.groupby('Amount_width_bin')grouped['CardID'].count()#对 Amount字段--等深 离散化RFM['Amount_depth_bin'] = pd.qcut(RFM.Amount,5) #分成5人的等分约20%RFM,head(5)grouped = RFM.groupby('Amount_depth_bin')grouped['CardID'].count()
有监督离散方法:决策树
离散化后的目标分类纯度最高(对目标有很好的区分能力)
一种特殊的离散化方法:二值化:           把连续型变量分割为0/1(是/否) 例如:是否大于18岁(是/否)Rounding(取整): 本质上时一种类似‘等距方法’的离散

二、类别变量编码

类别变量编码:
类别型变量—-编码成—> 数值型变量
目的:
机器学习算法 无法处理类别型变量,必须转换为数值型变量
一定程度起到了扩充特征的作用(构造了新的特征)
one-hot encoding 独热编码
dummy encoding 哑变量编码
label-encoding 标签编码
count-Encoding 频数编码 (可以去量纲化,秩序,归一化)
Target encoding 二分类 用目标变量中的某一类的比例来编码
代码:
import pandas as pd                    #导入的数据源于 特征构造
trade = pd.read_csv('./data/transaction.txt')
trade['Date'] = pd.to_datetime(trade['Date'])
RFM = trade.groupby('CardID').egg({'Date':'max','CardID':'count','Amount':'sum'})
RFM.head()--------------Onehot 编码(独热编码)使用pandas------------------
onehot = pd.get_dummies(RFM['CardID']),drop_first = False,prefix = 'Freq'onehot.head()from sklearn import preprocessing      #使用sklearn 导入OneHotEncoderonehot = preprocessing.OneHotEncoder() #OneHotEncoderFreq = RFM['CardID'].values.reshape(-1,1)
onehot.fit(Freq)Freq_onehot = onehot.transform(Freq).toarray()Freq_onehotdf = pd.DataFrame(Freq_onehot)         #将array 转为pandas 的dataframedf.head()

三、时间型、日期型变量转换

代码:
import pandas as pd
data = pd.DataFrame({'data_time':pd.date_range('1/1/2017 00:00:00',period = 12,freq = 'H'),'data':pd.date_range('2017-1-1',period = 12,freq = 'M')
})■ data:提取日期型和时间型的特征变量
data['year']= data['data_time'].dt.year
data['month'] = data['data_time'].dt.month
data['day'] = data['data_time'].dt.day
data['hour'] = data['data_time'].dt.hour
data['minute'] = data['data_time'].dt.minute
data['second'] = data['data_time'].dt.second
data['quarter'] = data['data_time'].dt.quarter
data['week'] = data['data_time'].dt.week
data['yearmonth'] = data['data_time'].dt.strftime('%Y-%m')
data['halfyear'] = data['data_time'].mapa(lambda d:'H' if d.month <= 6 else 'H2')■ data:转换为相对时间特征
import datetime
data['deltaDayToToday'] = (datetime.date.today()-data['date'].dt.date).dt.days  #距离今天的间隔(天数)
data['deltaMonthToToday'] = datetime.date.today().month - data['date'].dt.month #距离今天的间隔(月数)
data['daysOfyear'] = data['date'].map(lambda d:366 if d.is_leap_year els 365)   #一年过去的进度
data['rateOfyear'] = data['date'].dt.dayofyear/data['daysOfyear']
data.head()

四、 缺失值处理

删除缺失值记录缺失值替换:
用0替换
平均数替换
众数替换
预测模型替换
构造NaN encoding编码
构造一个新的字段来标识是否有缺失(1/0) 任何时候都可使用
import pandas as pd
titanic = pd.read_csv('./data/titanic.csv')
titanic.info()age_mean = round(titanic['Age'].mean())        #对缺失值进行填充
titanic['Age'].fillna(age_mean,inplace = True) #填充平均年龄
titanic.info()titanic = pd.read_csv('./data/titanic.csv')    #构造缺失值的标志变量(0/1)
titanic.info()
titanic['Age_ismissing'] = 0
titanic.loc[titanic['Age'].isnull(),'Age_ismissing'] = 1
titanic['Age_ismissing'].value_counts()

五、 特征组合

目的:
构造更多更好的特征,提升模型精度(例如:地球仪的经纬密度)
方法:
多个连续变量: 加减乘除运算
多个类别型变量: 所有值交叉组合
import pandas as pd
titanic = pd.read_csv('./data/titanic.csv')
titanic.head()# 组合特征
titanic['Sex_pclass_combo'] = titanic['Sex']+'_pclass_'+titanic['Pclass'].astype(str)
titanic.Sex_pclass_combo.value_counts()# onehot编码
Sex_pclass_combo = pd.get_dummies['Sex_pclass_combo'],drop_first = False,prefix = 'onehot'
Sex_pclass_combo.head()

特征工程——特征转换相关推荐

  1. K-近邻算法之特征工程-特征预处理

    K-近邻算法之特征工程-特征预处理 1 什么是特征预处理 1.1 特征预处理定义 scikit-learn的解释 provides several common utility functions a ...

  2. 机器学习之特征工程--特征预处理(上)

    机器学习特征工程--特征预处理(上) 最近又重新看了下常用的特征预处理方法,主要来源是sklearn官方文档,一些关键信息记录下,留存用,有些乱和杂,抽时间再整理. 此为上篇,主要包括:线性转化,非线 ...

  3. 数据挖掘:特征工程——特征处理与特征生成

    数据挖掘:特征工程--特征处理与特征构建 这里贴一张网上特征工程的流程,供大家学习. 一.什么是特征工程 特征工程:其本质是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用..就是 ...

  4. 特征工程——特征构造

    特征工程概述 一.特征工程概述 特征工程 = 数据准备(for 数据挖掘) 数据清洗.转换 1.1 特征工程主要内容 1.2 特征工程重要性 好数据>多数据>好算法数据和特征决定了模型预测 ...

  5. 特征工程特征预处理归一化与标准化、鸢尾花种类预测代码实现

    一.特征预处理 特征工程目的:把数据转换成机器更容易识别的数据 scikit-learn:提供几个常见的实用程序函数和转换器类,以将原始特征向量更改为更适合下游估计器的表示形式.即通过一些转换函数将特 ...

  6. 特征工程--特征离散化的意义

    连续特征的离散化:在什么情况下将连续的特征离散化之后可以获得更好的效果? Q:CTR预估,发现CTR预估一般都是用LR,而且特征都是离散的.为什么一定要用离散特征呢?这样做的好处在哪里? A: 在工业 ...

  7. 特征工程——特征衍生

    难点 技术复杂.资料混乱.没有现成第三方库 特征衍生方法 单变量特征衍生--一个变量放进去衍生多个特征 双变量特征衍生--二组合生多 关键特征衍生--文本/时序 多变量特征衍生--三个及以上特征进行组 ...

  8. 特征工程+特征组合+特征交叉+特征变换+生成特征

    特征组合+特征交叉(交叉特征,组合特征,特征组合)+特征变换+生成特征+特征提取+ 特征缩放+特征选择+特征分箱+时间特征+特征关联+文本特征+特征采样 特征关联---->corr() 特征分箱 ...

  9. 特征工程 - 特征筛选

    https://www.cnblogs.com/iupoint/p/11289650.html

最新文章

  1. 秋色园QBlog技术原理解析:性能优化篇:数据库文章表分表及分库减压方案(十五)...
  2. 浅谈Java内存泄漏问题
  3. linux 文本搜索命令 grep egrep fgrep 区别
  4. wxpython收费吗_wxPython 使用总结
  5. 2020-07-28
  6. ichat在线客服jQuery插件(可能是历史上最灵活的)
  7. Python模块(8)-sklearn 简易使用教程
  8. 2020.7.20-每日进步
  9. 出现 Request Entity Too Large问题的解决方法
  10. html页面整体换算单位,通过媒体查询meta和JS转换REM单位实现100%自适应
  11. 漂亮的英文字体 android,资深字体设计师私藏的10大APP,只怪你知道的太晚 !
  12. oracle 10g下载百度云地址
  13. 机器学习技法-01-2-Large-Margin Separating Hyperplane
  14. Php区分自然量跟aso量,ASO优化——判断下载量与评论的比例关系
  15. 用计算机怎么打出箭头,怎么打出箭头
  16. Linux添加中文字体
  17. win10计算机管理器端口号,Win10设备管理器没有端口选项的解决方法
  18. p语言是python吗-Python是什么?简单了解pythonp-入门
  19. 北京卓镭激光完成近亿元B轮融资,君联资本领投...
  20. Quartz配置参考

热门文章

  1. 计算机的云是什么意思_网络上所说的云是什么意思?能通俗一点解释吗?
  2. kaggle中关于图像的比赛整理
  3. Android踩坑之 couldnt find libClingSDK.so
  4. 第8周 项目5 定期存款利息计算器
  5. Java实现8枚硬币问题(减治法)
  6. java 中文转码_java 下载文件中文名称转码详解
  7. 原谅我一直对B站有误解!
  8. 15 个优秀开源的 Spring Boot 学习项目,一网打尽!
  9. 硬件笔记(2)---- 贴片电容材质NPO与X7R、X5R、Y5V、Z5U的区别
  10. Python获取所有股票代码以及股票历史成交数据分析(二)