数据挖掘算法原理与实践:数据预处理

news2024/11/14 2:59:06

目录

第1关:标准化

相关知识

为什么要进行标准化

Z-score 标准化

Min-max 标准化

MaxAbs 标准化

代码文件

第2关:非线性转换

相关知识

为什么要非线性转换

映射到均匀分布

映射到高斯分布

Yeo-Johnson 映射

Box-Cox 映射

代码文件

第3关:归一化

相关知识

为什么使用归一化

L1 范式归一化

L2范式归一化

代码文件

第4关:离散值编码

相关知识

LabelEncoder

OneHotEncoder

代码文件

第5关:生成多项式特征

相关知识

为什么需要多项式特征

PolynomialFeatures

代码文件

第6关:估算缺失值

相关知识

为什么要估算缺失值

Imputer

代码文件


第1关:标准化

相关知识

为什么要进行标准化

对于大多数数据挖掘算法来说,数据集的标准化是基本要求。这是因为,如果特征不服从或者近似服从标准正态分布(即,零均值、单位标准差的正态分布)的话,算法的表现会大打折扣。实际上,我们经常忽略数据的分布形状,而仅仅做零均值、单位标准差的处理在一个机器学习算法的目标函数里的很多元素所有特征都近似零均值,方差具有相同的阶。如果某个特征的方差的数量级大于其它的特征,那么,这个特征可能在目标函数中占主导地位,这使得模型不能从其它特征有效地学习

Z-score 标准化

  • 这种方法基于原始数据的均值 mean 和标准差 standard deviation 进行数据的标准化。将特征A的原始值x使用 z-score 标准化到 x
  • z-score 标准化方法适用于特征 A 的最大值和最小值未知的情况或有超出取值范围的离群数据的情况
  • 将数据按其特征(按列进行)减去其均值,然后除以其方差。最后得到的结果是,对每个特征/每列来说所有数据都聚集在 0 附近,方差值为 1。数学公式如下:

dafebb3753e04a1bb486c6df0ea822ee.png

函数 scale 为数组形状的数据集的标准化提供了一个快捷实现:

  1. from sklearn import preprocessing
  2. import numpy as np
  3. X_train = np.array([[ 1., -1., 2.],
  4. [ 2., 0., 0.],
  5. [ 0., 1., -1.]])
  6. X_scaled = preprocessing.scale(X_train)
  7. >>>X_scaled
  8. array([[ 0. ..., -1.22..., 1.33...],
  9. [ 1.22..., 0. ..., -0.26...],
  10. [-1.22..., 1.22..., -1.06...]])

经过缩放后的数据具有零均值以及标准方差:

  1. >>> X_scaled.mean(axis=0)
  2. array([ 0., 0., 0.])
  3. >>> X_scaled.std(axis=0)
  4. array([ 1., 1., 1.])

Min-max 标准化

Min-max 标准化方法是对原始数据进行线性变换。设 minAmaxA 分别为特征 A 的最小值和最大值,A 的一个原始值 x 通过 min-max 标准化映射成在区间 [0,1] 中的值 x',公式:

215e4c53fb8e4a4db255be956b91fb0d.png

可以使用 MinMaxScaler 实现,以下是一个将简单的数据矩阵缩放到 [0, 1] 的例子:

  1. X_train = np.array([[ 1., -1., 2.],
  2. [ 2., 0., 0.],
  3. [ 0., 1., -1.]])
  4. min_max_scaler = preprocessing.MinMaxScaler()
  5. X_train_minmax = min_max_scaler.fit_transform(X_train)
  6. >>> X_train_minmax
  7. array([[ 0.5 , 0. , 1. ],
  8. [ 1. , 0.5 , 0.33333333],
  9. [ 0. , 1. , 0. ]])

MaxAbs 标准化

MaxAbs 的工作原理与 Min-max 非常相似,但是它只通过除以每个特征的最大值将训练数据特征缩放至 [-1, 1] 范围内,这就意味着,训练数据应该是已经零中心化或者是稀疏数据。公式如下:

ac54457db8e74d4eb0fd5877ed1cddd8.png

可以使用 MaxAbsScale 实现,以下是使用上例中数据运用这个缩放器的例子:

  1. X_train = np.array([[ 1., -1., 2.],
  2. [ 2., 0., 0.],
  3. [ 0., 1., -1.]])
  4. max_abs_scaler = preprocessing.MaxAbsScaler()
  5. X_train_maxabs = max_abs_scaler.fit_transform(X_train)
  6. >>> X_train_maxabs
  7. array([[ 0.5, -1. , 1. ],
  8. [ 1. , 0. , 0. ],
  9. [ 0. , 1. , -0.5]])

代码文件

# -*- coding: utf-8 -*-

from sklearn.preprocessing import scale,MaxAbsScaler,MinMaxScaler

#实现数据预处理方法
def Preprocessing(x,y):
    '''
    x(ndarray):处理 数据
    y(str):y等于'z_score'使用z_score方法
           y等于'minmax'使用MinMaxScaler方法
           y等于'maxabs'使用MaxAbsScaler方法
    '''
    #********* Begin *********#
    if y=='z_score':
       x = scale(x)
       return x
    elif y=='minmax':
       min_max_scaler = MinMaxScaler()
       x = min_max_scaler.fit_transform(x)
       return x
    elif y=='maxabs':
       max_abs_scaler = MaxAbsScaler()
       x = max_abs_scaler.fit_transform(x)
       return x
    #********* End *********#

第2关:非线性转换

相关知识

为什么要非线性转换

在上一关中已经提到,对于大多数数据挖掘算法来说,如果特征不服从或者近似服从标准正态分布(即,零均值、单位标准差的正态分布)的话,算法的表现会大打折扣。非线性转换就是将我们的特征映射到均匀分布或者高斯分布(即正态分布)

映射到均匀分布

相比线性缩放,该方法不受异常值影响,它将数据映射到了零到一的均匀分布上将最大的数映射为1,最小的数映射为 0其它的数按从小到大的顺序均匀分布在01之间如有相同的数则取平均值

如数据为np.array([[1],[2],[3],[4],[5]])则经过转换为:np.array([[0],[0.25],[0.5],[0.75],[1]]);

数据为np.array([[1],[2],[9],[10],[2]])则经过转换为:np.array([[0],[0.375],[0.75],[1.0],[0.375]])。第二个例子具体过程如下图:

9170df9e5dd5b4a7a09c2b0bf42b3864.png

sklearn 中使用 QuantileTransformer 方法实现,用法如下:

  1. from sklearn.preprocessing import QuantileTransformer
  2. import numpy as np
  3. data = np.array([[1],[2],[3],[4],[5]])
  4. quantile_transformer = QuantileTransformer(random_state=666)
  5. data = quantile_transformer.fit_transform(data)
  6. >>>data
  7. array([[0. ],
  8. [0.25],
  9. [0.5 ],
  10. [0.75],
  11. [1. ]])

映射到高斯分布

映射到高斯分布是为了稳定方差,并最小化偏差。在最新版 sklearn 0.20.xPowerTransformer 现在有两种映射方法。

Yeo-Johnson 映射

3acd81d1db27495b85d289bb1c9adcf3.png

Box-Cox 映射

b6b4346b922c43fe972dd9d9db42a38f.png

sklearn 0.20.x 中使用 PowerTransformer 方法实现,用法如下:

  1. from sklearn.preprocessing import PowerTransformer
  2. import numpy as np
  3. data = np.array([[1],[2],[3],[4],[5]])
  4. pt = PowerTransformer(method='box-cox', standardize=False)
  5. data = pt.fit_transform(data)

学习平台使用的是 sklearn 0.19.x通过对 QuantileTransformer 设置参数output_distribution='normal' 实现映射高斯分布,用法如下:

  1. from sklearn.preprocessing import QuantileTransformer
  2. import numpy as np
  3. data = np.array([[1],[2],[3],[4],[5]])
  4. quantile_transformer = QuantileTransformer(output_distribution='normal',random_state=666)
  5. data = quantile_transformer.fit_transform(data)
  6. data = np.around(data,decimals=3)
  7. >>>data
  8. array([[-5.199],
  9. [-0.674],
  10. [ 0. ],
  11. [ 0.674],
  12. [ 5.199]])

代码文件

# -*- coding: utf-8 -*-
from sklearn.preprocessing import QuantileTransformer

#实现非线性转换方法
def non_linear_transformation(x,y):
    '''
    x(ndarray):待处理数据
    y(int):y等于0映射到均匀分布
           y等于1映射到高斯分布
    '''
    #********* Begin *********#
    if y==0:
       quantile_transformer = QuantileTransformer(random_state=666)
       x =quantile_transformer.fit_transform(x)
       return x
    elif y==1:
       quantile_transformer = QuantileTransformer(output_distribution='normal',random_state=666)
       x = quantile_transformer.fit_transform(x)
       return x
    #********* End *********#

第3关:归一化

相关知识

为什么使用归一化

归一化是缩放单个样本具有单位范数的过程。归一化实质是一种线性变换,线性变换有很多良好的性质,这些性质决定了对数据改变后不会造成“失效”,反而能提高数据的表现,这些性质是归一化的前提。归一化能够加快模型训练速度统一特征量纲避免数值太大。值得注意的是,归一化是对每一个样本做转换,所以是对数据的每一行进行变换。而之前我们讲过的方法是对数据的每一列做变换。

L1 范式归一化

L1范式定义如下:

2788246c5c0f4bb9b9fb56a9362952aa.png

表示向量 x 中每个元素的绝对值之和L1 范式归一化就是将样本中每个特征除以特征的L1 范式

sklearn 中使用 normalize 方法实现,用法如下:

  1. from sklearn.preprocessing import normalize
  2. data = np.array([[-1,0,1],
  3. [1,0,1],
  4. [1,2,3]])
  5. data = normalize(data,'l1')
  6. >>>data
  7. array([[-0.5 , 0. , 0.5 ],
  8. [ 0.5 , 0. , 0.5 ],
  9. [ 0.167, 0.333, 0.5 ]])

L2范式归一化

L2 范式定义如下:

2eb0b21e5ecf43768985a04aa5d45166.png

表示向量元素的平方和再开平方根L2 范式归一化就是将样本中每个特征除以特征的L2 范式

sklearn 中使用 normalize 方法实现,用法如下:

  1. from sklearn.preprocessing import normalize
  2. data = np.array([[-1,0,1],
  3. [1,0,1],
  4. [1,2,3]])
  5. data = normalize(data,'l2')
  6. >>>data
  7. array([[-0.707, 0. , 0.707],
  8. [ 0.707, 0. , 0.707],
  9. [ 0.267, 0.535, 0.802]])

代码文件

# -*- coding: utf-8 -*-

from sklearn.preprocessing import normalize

#实现数据归一化方法
def normalization(x,y):
    '''
    x(ndarray):待处理数据
    y(int):y等于1则使用"l1"归一化
           y等于2则使用"l2"归一化
    '''
    #********* Begin *********#
    if y == 1:
       x = normalize(x,'l1')
       return x
    elif y == 2:
       x = normalize(x,'l2')
       return x
    #********* End *********#

第4关:离散值编码

相关知识

LabelEncoder

  • 在数据挖掘中,特征经常不是数值型的而是分类型的
  • 举个例子,一个人可能有["male", "female"]["from Europe", "from US", "from Asia"]["uses Firefox", "uses Chrome", "uses Safari", "uses Internet Explorer"]等分类的特征。这些特征能够被有效地编码成整数,比如["male", "from US", "uses Internet Explorer"]可以被表示为[0, 1, 3]["female", "from Asia", "uses Chrome"]表示为[1, 2, 1]

sklearn 中,通过 LabelEncoder 来实现:

  1. from sklearn.preprocessing import LabelEncoder
  2. label = ['male','female']
  3. int_label = LabelEncoder()
  4. label = int_label.fit_transform(label)
  5. >>>label
  6. array([1, 0])

OneHotEncoder

这种整数特征表示并不能在 sklearn 的估计器中直接使用,因为这样的连续输入,估计器会认为类别之间是有序的,但实际却是无序的。如将 male,female,转换为 1,010 要大,机器就会把这个关系考虑进去,而 male,female 之间是没有这样的关系的。所以我们需要使用另外一种编码方式,OneHot 编码。

sklearn 中通过 OneHotEncoder 来实现,使用方法如下:

  1. import numpy as np
  2. from sklearn.preprocessing import OneHotEncoder
  3. label = np.array([1,0])
  4. label = np.array(label).reshape(len(label),1)#先将X组织成(sample,feature)的格式
  5. onehot_label = OneHotEncoder()
  6. label = onehot_label.fit_transform(label).toarray()
  7. >>>label
  8. array([[0., 1.],
  9. [1., 0.]])

代码文件

# -*- coding: utf-8 -*-
import numpy as np
from sklearn.preprocessing import LabelEncoder,OneHotEncoder

def onehot_label(label):
    '''
    input:label(list):待处理标签
    output:lable(ndarray):onehot处理后的标签
    '''
    #********* Begin *********#
    int_label = LabelEncoder()
    label = int_label.fit_transform(label)
    label = np.array(label).reshape(len(label),1)
    onehot_label = OneHotEncoder()
    label = onehot_label.fit_transform(label).toarray()
    return label
    #********* End *********#

第5关:生成多项式特征

相关知识

为什么需要多项式特征

在数据挖掘中,获取数据的代价经常是非常高昂的。所以有时就需要人为的制造一些特征,并且有的特征之间是有关联的。生成多项式特征可以轻松的为我们获取更多的数据,并获得特征的更高维度和互相间关系的项且引入了特征之间的非线性关系,可以有效的增加模型的复杂度。

PolynomialFeatures

sklearn 中通过 PolynomialFeatures 方法来生成多项式特征,使用方法如下:

  1. import numpy as np
  2. from sklearn.preprocessing import PolynomialFeatures
  3. data = np.arange(6).reshape(3, 2)
  4. poly = PolynomialFeatures(2)#生成二项式特征
  5. data = poly.fit_transform(data)
  6. >>>data
  7. array([[ 1., 0., 1., 0., 0., 1.],
  8. [ 1., 2., 3., 4., 6., 9.],
  9. [ 1., 4., 5., 16., 20., 25.]])

特征转换情况如下:

1e68f67974050bb0c9134cc823a2dbcc.png

在一些情况下,只需要特征间的交互项,这可以通过设置 interaction_only=True来得到:

  1. import numpy as np
  2. from sklearn.preprocessing import PolynomialFeatures
  3. data = np.arange(6).reshape(3, 2)
  4. poly = PolynomialFeatures(degree=2, interaction_only=True)#degree=n表示生成n项式特征,只需要特征之间交互
  5. data = poly.fit_transform(data)
  6. >>>data
  7. array([[ 1., 0., 1., 0.],
  8. [ 1., 2., 3., 6.],
  9. [ 1., 4., 5., 20.]])

特征转换情况如下:

62e7aa5389820f4d86cdec7e48cfeb8d.png

代码文件

# -*- coding: utf-8 -*-
from sklearn.preprocessing import PolynomialFeatures
def polyfeaturs(x,y):
    '''
    x(ndarray):待处理特征
    y(int):y等于0生成二项式特征
           y等于1生成二项式特征,只需要特征之间交互
    '''
    #********* Begin *********#
    if y == 0:
       poly = PolynomialFeatures(2)
       x = poly.fit_transform(x)
       return x
    elif y == 1:
       poly = PolynomialFeatures(degree=2, interaction_only=True)
       x = poly.fit_transform(x)
       return x
    #********* End *********#

第6关:估算缺失值

相关知识

为什么要估算缺失值

由于各种原因,真实世界中的许多数据集都包含缺失数据,这类数据经常被编码成空格、NaNs,或者是其他的占位符。但是这样的数据集并不能被 sklearn 学习算法兼容,因为大多的学习算法都默认假设数组中的元素都是数值,因而所有的元素都有自己的意义。 使用不完整的数据集的一个基本策略就是舍弃掉整行或整列包含缺失值的数据。但是这样就付出了舍弃可能有价值数据(即使是不完整的 )的代价。 处理缺失数值的一个更好的策略就是从已有的数据推断出缺失的数值

Imputer

sklearn 中使用 Imputer 方法估算缺失值,使用方法如下:

  1. from sklearn.preprocessing import Imputer
  2. data = [[np.nan, 2], [6, np.nan], [7, 4],[np.nan,4]]
  3. imp = Imputer(missing_values='NaN', strategy='mean', axis=0)#缺失值为nan,沿着每一列,使用平均值来代替缺失值
  4. data = imp.fit_transform(data)
  5. >>>data
  6. array([[6.5 , 2. ],
  7. [6. , 3.33333333],
  8. [7. , 4. ],
  9. [6.5 , 4. ]])

其中 strategy 参数用来选择代替缺失值方法

  1. `mean`表示使用平均值代替缺失值
  2. `median`表示使用中位数代替缺失值
  3. `most_frequent`表示使用出现频率最多的值代替缺失值

missing_values 参数表示何为缺失值

  1. `NaN`表示`np.nan`为缺失值
  2. `0`表示`0`为缺失值

代码文件

# -*- coding: utf-8 -*-
from sklearn.preprocessing import Imputer

def imp(x,y):
    '''
    x(ndarray):待处理数据
    y(str):y为'mean'则用取平均方式补充缺失值
           y为'meian'则用取中位数方式补充缺失值
           y为'most_frequent'则用出现频率最多的值代替缺失值        
    '''
    #********* Begin *********#
    if y == 'mean':
       imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
       x = imp.fit_transform(x)
       return x
    elif y == 'meian':
       imp = Imputer(missing_values='NaN', strategy='meian', axis=0)
       x = imp.fit_transform(x)
       return x
    elif y == 'most_frequent':
       imp = Imputer(missing_values='NaN', strategy='most_frequent', axis=0)
       x = imp.fit_transform(x)
       return x 
    #********* End *********#

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1131759.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux设置命令开机自动执行

~/.bash_profile完整的命令占用一行,开机自动执行

少儿编程C++之001-dev c++安装与配置

环境: mac book pro, arm64, m1 前提: xcode-select --install 先安装homebrew 再用brew安装相关必须工具: brew install gcc brew install clang 检查: gcc --version clang --version 使用JetBrain出品的CLine-IDE&…

百度文心一言4.0抢先体验教程!

🍁 展望:关注我, AI学习之旅上,我与您一同成长! 一、 引言 想快速体验文心一言4.0,但又觉得技术难度太高?别担心,我来手把手教你! 🚀 10月17日,文心一言4.0…

【数据结构】— —邻接矩阵和邻接表存储图结构

🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL&#xff1a…

第四章 文件管理 四、文件的物理结构(文件分配方式)

目录 一、文件块,磁盘块 二、连续分配 1、定义: 2、计算方式: 3、注意: 4、优点: 5、缺点: 6、总结 三、链接分配----隐式链接 1、定义: 2、如何实现逻辑块号转物理块号 3、优点&…

深入浅出排序算法之直接插入排序(拓展:折半插入排序)

目录 1. 图示解析 2. 原理解析 3. 代码实现 4. 性能分析 5. 折半插入排序(拓展) 直接插入排序和选择排序的第一趟就是第一个关键字 ! 1. 图示解析 2. 原理解析 整个区间被分为:① 有序区间;② 无序区间 每次选…

ES(elasticsearch) - 三种姿势进行分页查询

1. from size 浅分页 "浅"分页可以理解为简单意义上的分页。它的原理很简单,就是查询前20条数据,然后截断前10条,只返回10-20的数据。这样其实白白浪费了前10条的查询。 GET test_dev/_search {"query": {"bool&…

大模型训练框架

一文搞定分布式训练:dataparallel、distirbuted、deepspeed、accelerate、transformers、horovod - 知乎代码地址:taishan1994/pytorch-distributed-NLP: pytorch分布式训练 (github.com)pytorch-distributed-NLPpytorch单机多卡分布式训练-中文文本分类…

【HarmonyOS】元服务卡片展示动态数据,并定点更新卡片数据

【关键字】 元服务卡片、卡片展示动态数据、更新卡片数据 【写在前面】 本篇文章主要介绍开发元服务卡片时,如何实现卡片中动态显示数据功能,并实现定时数据刷新。本篇文章通过实现定时刷新卡片中日期数据为例,讲述展示动态数据与更新数据功…

SLAM从入门到精通(基于ros的反光柱定位)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 我们看论文或者看书的时候,讲的最多的一般就是基于自然环境的定位。不管是激光雷达,还是视觉,其实本身还有很多…

公司电脑屏幕录制软件有什么功能

电脑屏幕录制软件有很多,今天简单说说说它的基础功能和附属功能: 基础功能: 1、屏幕录像 支持对所选电脑的屏幕进行录制,并且支持调整截屏频度、画面质量、单个视频时长等。 2、实时屏幕 可以对对方电脑进行实时屏幕查看&…

哥斯拉Godzilla使用中基于PHP的加密流量分析

转载于:https://blog.csdn.net/zlloveyouforever/article/details/129189396 哥斯拉Godzilla简介 据说是护网期间,各大厂商的waf不断在静态查杀、流量通信等方面对webshell进行拦截,众红队急需一款优秀的权限管理工具 , 虽说冰蝎3.0也不错 , …

MessagePassing分析与说明

1 Motivation 在图神经网络中,如何像在欧式空间一样进行卷积操作,其重要的问题在于如何更新当前位置的信息。 其每个位置(或者叫节点node)的更新方式如下所示。 这一个式子既可以表达GCN,也可以表达Edge Conv。 2 函…

wangeditor 富文本编辑器使用

使用环境vue3 ts &#xff0c;添加了字数限制 尝试了两种&#xff0c;使用方法类似&#xff08;参考文档&#xff09;&#xff0c;工具栏图标有不同&#xff0c;最后选用了第一种。 一、wangeditor 安装 npm i wangeditor --save 使用 这里封装了个简单组件 <templat…

浅谈AcrelEMS-GYM文体建筑能效管理解决方案-安科瑞 蒋静

1 概述 AcrelEMS-CA 文体建筑能效管理聚焦建筑的能量和信息的流向搭建平台解决方案。该系统解决方案集变电站综合自动化、电力监控、电能质量分析及治理、电气安全、能耗分析、照明控制、设备运维于一体。打破子系统孤立&#xff0c;配置方便&#xff0c;运维便捷&#xff1b;…

vue3.0运行npm run dev 报错Cannot find module node:url

vue3.0运行npm run dev 报错Cannot find module 问题背景 近期用vue3.0写项目&#xff0c;npm init vuelatest —> npm install 都正常,npm run dev的时候报错如下&#xff1a; failed to load config from F:\code\testVue\vue-demo\vite.config.js error when starting…

golang搭建http服务

golang环境搭建好之后,搭建htto服务 1.创建目录 创建main文件 创建成功,里面改成package main 终端执行操作创建好go.mod go mod init golang package golangimport ("fmt""net/http" )func sayHello(w http.ResponseWriter, r *http.Request) {_, _ fm…

TP4057替代DP4057 500mA线性锂离子电池充电器芯片

描述 DP4057是一款完整的单节锂离子电池带电池正负极反接保护采用恒定电流/恒定电压线性充电器。其SOT封装与较少的外部元件数目使得DP4057成为便携式应用的理想选择。DP4057 可以适合USB电源和适配器电源工作。 由于采用了内部PMOSFET架构&#xff0c;加.上防倒充电路&#xf…

基于机器视觉的12306验证码识别 计算机竞赛

文章目录 0 简介1 数据收集2 识别过程3 网络构建4 数据读取5 模型训练6 加入Dropout层7 数据增强8 迁移学习9 结果9 最后 0 简介 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于机器视觉的12306验证码识别 该项目较为新颖&#xff0c;适合作为竞赛课题方向…

ES6之Set集合(通俗易懂,含实践)

Set是什么&#xff1f;它的方法有哪些&#xff1f;它在实例开发中有什么作用&#xff1f; 让我为大家介绍一下吧&#xff01; ES6提供了新的数据结构 Set(集合) 。它类似于数组&#xff0c;但成员的值是唯一的。 创建方法&#xff1a; let s new Set()console.log(s)它属于什…