概述
有这么一句话在业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。因此这一步可能比实际上使用的模型和算法更重要,而且会占开发一个机器学习模型80%-90%的时间,是最耗时的环节。
那么到底什么是特征工程?特征工程是将原始数据转化特征的过程,特征要能更好地表示潜在问题并提高预测模型在未知数据上的准确率。
「特征处理是困难的、耗时的且需要专家知识。『实用化的机器学习』基本上就是特征工程。」
—— 吴恩达
下面主要介绍特征工程一般流程和技术点。本文基于预测场景介绍,其它场景基本通用。
通用术语
属性
用来进行预测的变量。在数据集中,一般列表示属性值。在Andrew Ngdeeplearning.ai 的课程上用行表示属性值。属性也被称为:
- 特征
- 预测因子
- 独立变量
- 输入
标签
用来进行预测的结果。在数据集中,一般最后一列表示标签值。在Andrew Ng的deeplearning.ai 课程上用行表示标签值。标签也被称为:
- 结果
- 目标
- 响应
- 输出
实例
实例是属性和标签的一个实例值。在数据集中,一般一行表示一个实例。在Andrew Ng的deeplearning.ai 课程上用列表示实例。
一般流程
一般流程包括数据预处理、特征降维、特征构造和特征选择等几部分,下面先聊聊数据预处理。
数据预处理
数据预处理包括特征值映射、缺失值处理、异常值处理和特征值转换等
特征值映射
数值类型无需映射,字符串类型需要通过one-hot编码映射,具体参考google机器学习教程章节https://developers.google.com/machine-learning/crash-course/representation/feature-engineering?hl=zh-cn
pandas示例:
pd.get_dummies(all_df)
缺失值处理
缺失值处理也叫做缺失值插补(imputation)。以下是两种简单的处理方式:
- 最简单的方法,用该属性的平均值来代替缺失值。可以用pandas的fillna函数。
pandas示例:pd.fillna("平均值")
- 如果数据实例过多的时候,可以删除实例。可以用pandas的dropna函数。
pandas示例:pd.dropna(columns="列名")
- 预测插补
- 更多请见 https://www.jianshu.com/p/0127b187a7c2
异常值处理
异常值指明显离群的点,一般将等同缺失值一样处理。可用以下方式检测:
- 将一组数据按照百分位进行划分。如四分位、五分位和十分位等。
- 可以用python probplot的画分位数图(quantile-quantile,Q-Q),检测异常点
- 更多请见 https://www.jianshu.com/p/0127b187a7c2
特征值转换
一般有以下三种方式
- 标准化,Z-Score,公式为:(X-mean)/std 计算时对每个属性/每列分别进行。sklearn示例:
import sklearn.preprocessing as pre #X 特征矩阵 pre.StandardScaler().fit_transform(X)
- 归一化,常用的方法是将属性缩放到一个指定的最大和最小值(通常是1-0)之间。公式为:(X-X.min(axis=0))/(X.max(axis=0)-X.min(axis=0))。sklearn示例:
import sklearn.preprocessing as pre #X 特征矩阵 pre.MinMaxScaler().fit_transform(X)
- 正则化,Normalization主要思想是对每个样本计算其p-范数,然后对该样本中每个元素除以该范数,这样处理的结果是使得每个处理后样本的p-范数(l1-norm,l2-norm)等于1。sklearn示例:
import sklearn.preprocessing as pre #X 特征矩阵 pre.Normalizer().fit_transform(X)
- 具体参考http://www.cnblogs.com/charlotte77/p/5622325.html
网友评论