目录
特征预处理
1、简述
2、内容
3、归一化
3.1、鲁棒性
3.2、存在的问题
4、标准化
⭐所属专栏:人工智能
文中提到的代码如有需要可以私信我发给你
什么是特征预处理:scikit-learn的解释:
provides several common utility functions and transformer classes to change raw feature vectors into a representation that is more suitable for the downstream estimators.
翻译过来:通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程
详述:
特征预处理是机器学习和数据分析中的一个重要步骤,它旨在将原始数据转换为适合机器学习算法的形式,以提高模型的性能和稳定性。特征预处理涵盖了一系列数据转换和处理操作,用于清洗、归一化、缩放、编码等,以确保输入特征的质量和一致性。以下是特征预处理的一些常见操作和方法:
特征预处理的目标是使数据更适合机器学习模型,提高模型的性能和稳定性,并且能够更好地捕捉数据的特征和模式。正确的特征预处理可以显著影响机器学习模型的结果和效果。不同的数据类型和问题可能需要不同的特征预处理方法,因此在进行特征预处理时需要根据具体情况进行选择和调整。
包含内容:数值型数据的无量纲化:归一化、标准化 (二者放在后面详述)
什么是无量纲化:
无量纲化(Dimensionality Reduction)是特征工程的一部分,指的是将数据特征转换为合适的尺度或形式,以便更好地适应机器学习算法的要求。无量纲化的目的是减少特征的维度,同时保留数据中的重要信息,从而降低计算成本、避免维度灾难,并提高模型的性能和泛化能力。
无量纲化可以分为两种常见的方法:
①特征缩放(Feature Scaling):特征缩放是将特征的数值范围调整到相似的尺度,以便机器学习算法更好地工作。特征缩放的常见方法包括归一化和标准化。
归一化(Min-Max Scaling):将特征缩放到一个特定的范围,通常是[0, 1]。
标准化(Z-score Scaling):将特征缩放为均值为0,标准差为1的分布。
②降维(Dimensionality Reduction):降维是将高维特征空间映射到低维空间,以减少特征数量并去除冗余信息,从而提高计算效率和模型性能。常见的降维方法包括主成分分析(PCA)和线性判别分析(LDA)等。
主成分分析(PCA):通过线性变换将原始特征投影到新的坐标轴上,使得投影后的数据具有最大的方差。这些新坐标轴称为主成分,可以按照方差的大小选择保留的主成分数量,从而降低数据的维度。
线性判别分析(LDA):在降维的同时,尽可能地保留类别之间的区分性信息,适用于分类问题。
无量纲化可以帮助解决特征维度不一致、尺度不同等问题,使得机器学习算法能够更准确地学习数据的模式和结构。选择适当的无量纲化方法取决于数据的特点、问题的要求以及模型的性能。
特征预处理使用的API:sklearn.preprocessing
为什么我们要进行归一化/标准化?
特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级,容易影响(支配)目标结果,使得一些算法无法学习到其它的特征
定义:通过对原始数据进行变换把数据映射到(默认为[0,1])之间
公式:
API:
sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… )
MinMaxScalar.fit_transform(X)
X:numpy array格式的数据[n_samples,n_features]
返回值:转换后的形状相同的array
下面分析会用到一组数据,名为dating.txt。展现如下:
实现:
关键代码解读:
transfer = MinMaxScaler(feature_range=(2, 3)):
实例化一个MinMaxScaler转换器对象,其中feature_range=(2, 3)表示将数据缩放到范围为[2, 3]之间。
data = transfer.fit_transform(data[['milage', 'Liters', 'Consumtime']]):
使用fit_transform方法将选定的特征('milage', 'Liters', 'Consumtime')进行最小-最大归一化处理。
fit_transform方法首先计算出特征的最小值和最大值,然后将数据进行线性缩放,使其在指定的范围内。
# -*- coding: utf-8 -*-
# @Author:︶ㄣ释然
# @Time: 2023/8/15 21:52
import pandas as pd
from sklearn.preprocessing import MinMaxScaler # 最大最小值归一化转换器
'''
归一化处理。
关键代码解读:
transfer = MinMaxScaler(feature_range=(2, 3)):
实例化一个MinMaxScaler转换器对象,其中feature_range=(2, 3)表示将数据缩放到范围为[2, 3]之间。
data = transfer.fit_transform(data[['milage', 'Liters', 'Consumtime']]):
使用fit_transform方法将选定的特征('milage', 'Liters', 'Consumtime')进行最小-最大归一化处理。
fit_transform方法首先计算出特征的最小值和最大值,然后将数据进行线性缩放,使其在指定的范围内。
'''
def min_max_demo():
"""
归一化演示
"""
data = pd.read_csv("data/dating.txt",delimiter="\t")
print(data)
# 1、实例化一个转换器类
transfer = MinMaxScaler(feature_range=(2, 3))
# 2、调用fit_transform
data = transfer.fit_transform(data[['milage', 'Liters', 'Consumtime']])
print("最小值最大值归一化处理的结果:\n", data)
if __name__ == '__main__':
min_max_demo()
打印结果:
手动计算(取前9行数据):
计算坐标为(0,0)的元素,总的计算流程为:[(40920-14488)/(75136-14488)] * (3-2)+2 = 2.435826408≈2.43582641
该结果与程序吻合!!
鲁棒性(Robustness)是指在面对异常值、噪声和其他不完美情况时,系统能够继续正常工作并保持良好性能的能力。在数据分析、统计学和机器学习中,鲁棒性是一个重要的概念,指的是算法或方法对异常值和数据扰动的敏感程度。一个鲁棒性强的方法在存在异常值或数据变动时能够保持稳定的性能,而鲁棒性较差的方法可能会对异常值产生过度敏感的响应。
在数据处理和分析中,鲁棒性的重要性体现在以下几个方面:
一些常见的鲁棒性方法包括:
总之,鲁棒性是数据分析和机器学习中一个重要的考虑因素,能够保证在现实世界中面对多样性和不确定性时,方法和模型仍能保持有效性和稳定性。
使用归一化处理,如果数据中异常点较多,会有什么影响?
在数据中存在较多异常点的情况下,使用归一化处理可能会受到一些影响。归一化是将数据缩放到特定范围内的操作,但异常点的存在可能会导致以下影响:
为了应对异常点对归一化处理的影响,可以考虑以下策略:
总之,处理异常点是特征预处理的重要步骤,需要根据数据的特点和问题的需求来选择适当的策略。
这里使用标准化解决这个问题
定义:通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内
公式:
标准差:
所以实际上标准化的公式为:
参数如下:
x为当前值
mean为平均值
N 表示数据的总个数
xi 表示第 i 个数据点
μ 表示数据的均值
归一化的异常点:
标准化的异常点:
对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变
对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。
API:
sklearn.preprocessing.StandardScaler( )
处理之后每列来说所有数据都聚集在均值0附近标准差差为1
StandardScaler.fit_transform(X)
X:numpy array格式的数据[n_samples,n_features]
返回值:转换后的形状相同的array
import pandas as pd
from sklearn.preprocessing import StandardScaler # 标准化
'''
sklearn.preprocessing.StandardScaler( )
处理之后每列来说所有数据都聚集在均值0附近标准差差为1
StandardScaler.fit_transform(X)
X:numpy array格式的数据[n_samples,n_features]
返回值:转换后的形状相同的array
'''
def stand_demo():
"""
标准化演示
:return: None
"""
data = pd.read_csv("data/dating.txt", delimiter="\t")
print(data)
# 1、实例化一个转换器类
transfer = StandardScaler()
# 2、调用fit_transform
data = transfer.fit_transform(data[['milage', 'Liters', 'Consumtime']])
print("标准化的结果:\n", data)
print("每一列特征的平均值:\n", transfer.mean_)
print("每一列特征的方差:\n", transfer.var_)
if __name__ == '__main__':
stand_demo()
输出结果:
手动计算验证(取前8行数据),公式回顾如下:
手动计算坐标为(0,0)的数据的标准化数据:
40920-43318.375=-2398.375
N=8,μ=43318.375 -> (40920-43318.375)^2+(14488-43318.375)^2+(26052-43318.375)^2+(75136-43318.375)^2+(38344-43318.375)^2+(72993-43318.375)^2+(35948-43318.375)^2+(42666-43318.375)^2=3107507487.875
3107507487.875 / 8 = 388438435.984375
根号下388438435.984375 = 19708.84156880802
最终:
x-mean=-2398.375
标准差=19708.84156880802
最后标准化后的数据结果为:-2398.375 / 19708.84156880802 = 0.121690307957813291 ≈ 0.12169031
与程序结果完全吻合!
标准化总结:在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。