特征归一化

特征工程

俗话说“巧妇难为无米之炊”,在机器学习中,数据和特征便是“米”,模型和算法则是“巧妇”。没有充足的数据、合适的特征,再强大的模型结构也无法得到满意的输出。正如一句业界经典的话所说,“Garbage in, garbage out”。对于一个机器学习问题,数据和特征往往决定结果的上限,而模型、算法的选择及优化则是在逐步接近这个上限。

【特征工程】:对原始数据进行一系列工程处理,将其提炼为特征,作为输入供算法和模型使用。

  • 从本质上来讲,特征工程是一个表示和展现数据的过程。
  • 在实际工作中,特征工程旨在去除原始数据中的杂质和冗余,设计更高效的特征以刻画求解的问题与预测模型之间的关系。

Feature engineering is the process of using domain knowledge of the data to create features that make machine learning algorithms work. —— Wikipedia

特征工程就是通过数据领域的相关知识来设计特征,保证机器学习算法能够达到最优的性能。

【常用的数据类型】:

  • 结构化数据:可以看作关系型数据库的一张表,每列都有清晰的定义,包含了数值型、类别型两种基本类型;每一行数据表示一个样本的信息。
  • 非结构化数据:主要包括文本、图像、音频、视频数据,其包含的信息无法用一个简单的数值表示,也没有清晰的类别定义,并且每条数据的大小各不相同。

特征归一化

消除数据特征之间的量纲影响,可以将所有的特征都统一到一个大致相同的数值区间内,使得不同指标之间具有可比性。例如,分析一个人的身高和年龄对健康的影响,通常身高用 cm 作为单位,而年龄用岁作为单位,那么身高特征会大致在 160~180 cm 的数值范围内,年龄特征会在 1~100 岁的范围内,分析的结果显然会倾向于数值差别比较大的身高特征。想要得到更为准确的结果,就需要对数据进行特征归一化(Normalization)处理,使各指标处于同一数值量级,以便进行分析。特征归一化有时被称为特征缩放或特征规范化。

【量纲(dimension)】:物理量固有的、可度量的物理属性。例如,人的身高、体重和年龄等。

【问答 QA】:

  • 问:为什么对拥有不同数值量级特征的数据集进行分析,其结果会倾向于数值差别较大的特征?
  • 答:具体内容可以参考这篇博文 K-近邻算法 问题 QA 中的“为什么要做数据归一化”。

通常对于需要计算数据集特征距离的模型,我们都需要提前对数据集做特征归一化,尤其是数值型的数据。

【常用的方法】:

  • 线性函数归一化(Min-Max Scaling):又称为 min-max 缩放,是对原始数据进行线性变换,将结果映射到 [0, 1] 范围内,实现对原始数据的等比缩放。
    x n o r m = x − x m i n x m a x − x m i n x_{norm} = \frac{x - x_{min}}{x_{max} - x_{min}} xnorm=xmaxxminxxmin
  • 零均值归一化(Z-Score Normalization):又称为标准化或方差缩放,将原始数据映射到均值为 0、标准差为 1 的分布上。
    z = x − μ σ z = \frac{x-\mu}{\sigma} z=σxμ

【代码实现】:

import numpy as np


def min_max_scaling(dataset):
    dataset_min, dataset_max = np.min(dataset2, axis=0), np.max(dataset2, axis=0)
    dataset_range = dataset_max - dataset_min
    return (dataset - dataset_min) / dataset_range
    
def standard_scaling(dataset):
    dataset_mean = np.mean(dataset, axis=0)
    dataset_var = np.sum((dataset2 - np.mean(dataset2, axis=0))**2 / len(dataset), axis=0)**0.5
    return (dataset - dataset_mean) / dataset_var

以上两种方法,在 scikit-learn 的 preprocessing 包中都有实现,分别为 MinMaxScaler(feature_range=(0, 1)) 和 StandardScaler()。

import numpy as np
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import StandardScaler


dataset = np.array([
    [2, 1], [3, 2], [1, 4], [5, 3], [3, 5]
])
min_max_scaler = MinMaxScaler(feature_range=(0, 1))
min_max_scaler.fit_transform(dataset)
standard_scaler = StandardScaler()
standard_scaler.fit_transform(dataset)

那些关于输入是平滑函数的模型, 如线性回归、逻辑回归或任何涉及矩阵的东西, 都受输入的数值范围影响。另一方面, 基于树的模型不太在意这个。如果你的模型对输入特征的数值范围敏感, 则特征缩放可能会有所帮助。

min-max 缩放和标准化都是从原始特征值中减去一个数量。对于 min-max 缩放,移动量是当前特征的所有值中最小的;对于标准化,移动量是当前特征的平均值。如果移动量不是零,则这两种转换可以将稀疏特征的向量转换为一个稠密的向量,这反而会给分类器带来巨大的计算负担,所以需谨慎对稀疏特征执行 min-max 缩放和标准化操作。

此外,对数值型特征做归一化可以加快梯度下降算法找到最优解。

加快梯度下降算法找到最优解

【应用】:通过梯度下降法求解的模型通常是需要归一化的,包括线性回归、逻辑回归、支持向量机、神经网络等模型。

【参考】:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值