特征工程基本方法

特征重要性

特征工程决定了模型精度的上限
而数据挖掘的主要工作内容就是:数据清洗,数据预处理,数据转换

也就是说,特征工程主要针对字段进行处理
字段类型包括:数值字段,类别字段,日期字段,图像和文本等

具体细分特征工程的主要内容可以大致分为三部分:数据处理(信息合并,数据的删除/增加),数据归一化和数据转换

我们可以更直观地感受特征工程的作用:将原始数据突出的特征提取出来(简化)成我们要用到的信息,成为我们模型能够训练的模型
在这里插入图片描述

类别特征

数据的类型有很多种,有些数据本身不是以数字直接呈现的。所以,想要将这些数据变成可以被模型进行拟合的数据,就要对这些数据进行进一步的加工和处理

在这里插入图片描述
在这里插入图片描述

创建数据

我们自己先创建一个数据,共有四个特征

import pandas as pd
df = pd.DataFrame({
    'student_id': [1,2,3,4,5,6,7],
    'country': ['China', 'USA', 'UK', 'Japan', 'Korea', 'China', 'USA'],
    'education': ['Master', 'Bachelor', 'Bachelor', 'Master', 'PHD', 'PHD', 'Bachelor'],
    'target': [1, 0, 1, 0, 1, 0, 1]
})
df.head(10)

# 学生信息

在这里插入图片描述

类别特征

Onehot

独热编码将某个特征中的所有可能选项展开(相当于1->n个特征),1表示是这个特征,0则表示不是

  • 使用pandas自带的独热编码
pd.get_dummies(df, columns=['education'])
# one-of-k

# 1 0 0
# 0 1 0 
# 0 0 1

在这里插入图片描述

  • 使用sklearn中的独热编码方法
from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder()
ohe.fit_transform(df[['education']]).toarray()

在这里插入图片描述

LabelEncoder

LabelEncoder会将该特征的所有情况进行排序(通常是按首字母顺序),当然,我们也可以手动设置顺序(使用map规定顺序)

  • 使用sklearn中的LabelEncoder
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['country_LabelEncoder'] = le.fit_transform(df['country'])
df.head(10)

在这里插入图片描述

  • 使用pandas中的LabelEncoder(pandas中的编码顺序一般按出现次数排列)
df['country_LabelEncoder'] = pd.factorize(df['country'])[0]
df.head(10)

在这里插入图片描述

与上面的onehot编码对比,我们可以看出,onehot编码一定程度上增大了我们的特征数,容易将我们的数据变复杂。
一般情况下,遇到一个类别,取值空间个数 < 10, onehot, 否则就用LabelEncoder

Ordinal Encoding

与LabelEncoder思路相同,不同的是手动设置特征标签取值

df['education'] = df['education'].map(
                    {'Bachelor': 1, 
                    'Master': 2, 
                    'PHD': 3})
df.head(10)

在这里插入图片描述

BinaryEncoder

方法与onehot相同,不同的是将结果看作二进制,再转换为十进制

import category_encoders as ce
encoder = ce.BinaryEncoder(cols= ['country'])

pd.concat([df, encoder.fit_transform(df['country']).iloc[:, 1:]], axis=1)

在这里插入图片描述

Frequency/Count Encoding

相当于用数学统计方法,对每个标签进行频率/出现次数的统计

  • 对频率进行统计
df['country_count'] = df['country'].map(df['country'].value_counts()) / len(df)
df.head(10)

在这里插入图片描述

  • 对标签出现次数进行统计
df['country_count'] = df['country'].map(df['country'].value_counts())
df.head(10)

在这里插入图片描述

优点:对任意数据类型都可以进行编码
缺点:要求训练样本与测试样本分布一致,不然结果会有较大偏差

Mean/Target Encoding

将目标特种按种类进行分组,再对target目标值进行求平均
也就是说,把需要编码的字段与target值联系在了一起

df.groupby(['country'])['target'].mean()

在这里插入图片描述

df['country_target'] = df['country'].map(df.groupby(['country'])['target'].mean())
df.head(10)

在这里插入图片描述
对于验证集不能直接使用Target Encoding,需要使用训练集的Target Encoding

缺点:可能过拟合/标签泄露
标签泄露:当字段中的某一类别只出现一次时(如本例子中的Japan),并不能很好地代表这一类的所有情况。

数值特征

常见的数值类型特征如下:
在这里插入图片描述

首先创建一个自定义数据集

df = pd.DataFrame({
    'student_id': [1,2,3,4,5,6,7],
    'country': ['China', 'USA', 'UK', 'Japan', 'Korea', 'China', 'USA'],
    'education': ['Master', 'Bachelor', 'Bachelor', 'Master', 'PHD', 'PHD', 'Bachelor'],
    'age': [34.5, 28.9, 19.5, 23.6, 19.8, 29.8, 31.7],
    'target': [1, 0, 1, 0, 1, 0, 1]
})
df.head(10)

在这里插入图片描述

Round

对于某些信息特征,我们只需要记住它的大致分布就好,不必过于精确,我们就可以采取:
1)取整
2)划分区间
的方法来对数值进行处理

df['age_round1'] = df['age'].round()
df['age_round2'] = (df['age'] / 10).astype(int)
df.head(10)

在这里插入图片描述

Box/Bins

与round类似,将数据手动拆分为相应区间,将数据进行分箱

df['age_<20'] = (df['age'] <= 20).astype(int)
df['age_20-25'] = ((df['age'] > 20) & (df['age'] <=25)).astype(int)
df['age_20-25'] = ((df['age'] > 25) & (df['age'] <= 30)).astype(int)
df['age_>30'] = (df['age'] > 30).astype(int)
df.head(10)

在这里插入图片描述

日期字段

下面列出了日期字段的出现形式及相应的处理方法

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值