特征工程系列:空间特征构造以及文本特征构造
本文为数据茶水间群友原创,经授权在本公众号发表。
关于作者:JunLiang,一个热爱挖掘的数据从业者,勤学好问、动手达人,期待与大家一起交流探讨机器学习相关内容~
0x00 前言
数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。由此可见,特征工程在机器学习中占有相当重要的地位。在实际应用当中,可以说特征工程是机器学习成功的关键。
那特征工程是什么?
特征工程是利用数据领域的相关知识来创建能够使机器学习算法达到最佳性能的特征的过程。
特征工程又包含了 Data PreProcessing(数据预处理)、Feature Extraction(特征提取)、Feature Selection(特征选择)和 Feature construction(特征构造)等子问题,本章内容主要讨论特征构造的方法。
创造新的特征是一件十分困难的事情,需要丰富的专业知识和大量的时间。机器学习应用的本质基本上就是特征工程。
——Andrew Ng
0x01 特征构造介绍
空间特征构造以及文本特征构造具体方法:
0x02 空间特征构造
1.按经纬度对空间进行划分
划分流程:
1)对经纬度进行特征分桶,得到类别特征
binned_latitude(lat) = [
0 < lat <= 10
10 < lat <= 20
]
binned_longitude(lon) = [
0 < lon <= 15
15 < lon <= 30
]
2)使用笛卡尔乘积生成空间划分后的特征
样本 | 0<lat<=10& 0<lon<=15 | 0<lat<=10& 15<lon<=30 | 10<lat<=20& 0<lon<=15 | 10<lat<=20& 15<lon<=30 |
---|---|---|---|---|
1 | 1 | 0 | 0 | 0 |
2 | ... | ... | ... | ... |
3)对每块子空间进行编码,得到类别特征
效果类似下图,把空间划分为多块子空间。
2.使用坐标拾取系统获取行政区域信息(类别特征)
-
省份ID/名字 -
城市ID/名字 -
市辖区ID/名字 -
街道ID/名字
3.结合其他地址计算距离
例如:计算每个地点至某商业中心的距离。
距离类型:
-
欧式距离 -
球面距离 -
曼哈顿距离 -
真实距离
0x03 文本特征构造
1.文本统计特征
-
文本长度; -
单词个数; -
数字个数; -
字母个数; -
大小写单词个数; -
大小写字母个数; -
标点符号个数; -
特殊字符个数; -
数字占比; -
字母占比; -
特殊字符占比; -
名词个数; -
动词个数;
适用范围:所有文本特征。
统计单词的个数作为特征的程序实现
import pandas as pd
# 构造数据集
df = pd.DataFrame({'兴趣': ['健身 电影 音乐', '电影 音乐', '电影 篮球', '篮球 羽毛球', ]})
# 统计兴趣爱好的数量
df['兴趣数量'] = df['兴趣'].apply(lambda x: len(x.split()))
display(df.head())
# 输出:
兴趣 兴趣数量
0 健身 电影 音乐 3
1 电影 音乐 2
2 电影 篮球 2
3 篮球 羽毛球 2
2.字典映射
有序特征的映射,使用的方法是先构建一个映射字典 mapping,再用 pandas 的 map() 或者 replace() 函数进行映射转换。
适用范围:只有一个词语的有序特征。
程序实现:
import pandas as pd
df = pd.DataFrame({'edu_level': ['博士', '硕士', '大学', '大专及以下']})
#构建学历字典
mapping_dict={'博士':4,'硕士':3,'大学':2,'大专及以下':1}
#调用map方法进行转换
df['edu_level_map']=df['edu_level'].map(mapping_dict)
display(df.head())
# 输出
edu_level edu_level_map
0 博士 4
1 硕士 3
2 大学 2
3 大专及以下 1
3.标签二值化(LabelBinarizer)
功能与 OneHotEncoder 一样,但是 OneHotEncode 只能对数值型变量二值化,无法直接对字符串型的类别变量编码,而 LabelBinarizer 可以直接对字符型变量二值化。
适用范围:只有一个词语或者包含多个词语的特征。例子:
只有一个词语的特征:职业。
有多个词语的特征:用户兴趣特征为“健身 电影 音乐”。
程序实现:
import pandas as pd
from sklearn.preprocessing import LabelBinarizer
df = pd.DataFrame({'职业': ['老师', '程序员', '警察', '销售', '销售', ]})
lb = LabelBinarizer()
lb.fit(df['职业'])
print('类别:{}'.format(lb.classes_))
# 输出:类别:['程序员' '老师' '警察' '销售']
display(lb.fit_transform(df['职业']))
# 输出:
array([[0, 1, 0, 0],
[1, 0, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1],
[0, 0, 0, 1]])
4.多标签二值化(MultiLabelBinarizer)
把有多个单词的文本转换01特征向量,转换后的结果可能会有多个为1的值。
适用范围:包含多个词语的特征。
程序实现:
import pandas as pd