[550]sklearn-preprocessing使用

2023-11-19

标准化(Z-Score)

公式为:(X-mean)/std  计算时对每个属性/每列分别进行。

将数据按期属性(按列进行)减去其均值,并处以其方差。得到的结果是,对于每个属性/每列来说所有数据都聚集在0附近,方差为1。

使用sklearn.preprocessing.scale()函数,可以直接将给定数据进行标准化。

from sklearn import preprocessing
import numpy as np

# 创建一组特征数据,每一行表示一个样本,每一列表示一个特征
x = np.array([[1., -1., 2.],
              [2., 0., 0.],
              [0., 1., -1.]])

# 将每一列特征标准化为标准正太分布,注意,标准化是针对每一列而言的
x_scale = preprocessing.scale(x)

print(x_scale)
'''
array([[ 0.        , -1.22474487,  1.33630621],
       [ 1.22474487,  0.        , -0.26726124],
       [-1.22474487,  1.22474487, -1.06904497]])
'''
# 可以查看标准化后的数据的均值与方差,已经变成0,1了
x_scale.mean(axis=0)
'''
array([ 0.,  0.,  0.])
'''
# axis=1表示对每一行去做这个操作,axis=0表示对每一列做相同的这个操作
x_scale.mean(axis=1)
'''
array([ 0.03718711,  0.31916121, -0.35634832])
'''

# 同理,看一下标准差 or 方差
x_scale.std(axis=0)
'''
array([ 1.,  1.,  1.])
'''

使用sklearn.preprocessing.StandardScaler类,使用该类的好处在于可以保存训练集中的参数(均值、方差)直接使用其对象转换测试集数据。

## 调用fit方法,根据已有的训练数据创建一个标准化的转换器
>>> scaler = preprocessing.StandardScaler().fit(X)
>>> scaler
StandardScaler(copy=True, with_mean=True, with_std=True)
 
>>> scaler.mean_                                     
array([ 1. ...,  0. ...,  0.33...])
 
>>> scaler.std_                                      
array([ 0.81...,  0.81...,  1.24...])
 
# 使用上面这个转换器去转换训练数据x,调用transform方法
>>> scaler.transform(X)                              
array([[ 0.  ..., -1.22...,  1.33...],
       [ 1.22...,  0.  ..., -0.26...],
       [-1.22...,  1.22..., -1.06...]])
 
>>>#可以直接使用训练集对测试集数据进行转换
>>> scaler.transform([[-1.,  1., 0.]])               
array([[-2.44...,  1.22..., -0.26...]])

另外,StandardScaler()中可以传入两个参数:with_mean,with_std.这两个都是布尔型的参数,默认情况下都是true,但也可以自定义成false.即不要均值中心化或者不要方差规模化为1.

规模化特征到一定的范围内

也就是使得特征的分布是在一个给定最小值和最大值的范围内的。一般情况下是在[0,1]之间,或者是特征中绝对值最大的那个数为1,其他数以此维标准分布在[[-1,1]之间

以上两者分别可以通过MinMaxScaler 或者 MaxAbsScaler方法来实现。

之所以需要将特征规模化到一定的[0,1]范围内,是为了对付那些标准差相当小的特征并且保留下稀疏数据中的0值。

MinMaxScaler

在MinMaxScaler中是给定了一个明确的最大值与最小值。它的计算公式如下:

X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))

X_scaled = X_std / (max - min) + min

以下这个例子是将数据规与[0,1]之间,每个特征中的最小值变成了0,最大值变成了1,请看:

min_max_scaler = preprocessing.MinMaxScaler((0,1))
x_minmax = min_max_scaler.fit_transform(x)
x_minmax
'''
array([[ 0.5       ,  0.        ,  1.        ],
       [ 1.        ,  0.5       ,  0.33333333],
       [ 0.        ,  1.        ,  0.        ]])
'''

同样的,如果有新的测试数据进来,也想做同样的转换咋办呢?请看:

x_test = np.array([[-3., -1., 4.]])
x_test_minmax = min_max_scaler.transform(x_test)
x_test_minmax
'''
array([[-1.5       ,  0.        ,  1.66666667]])
'''
MaxAbsScaler

原理与上面的很像,只是数据会被规模化到[-1,1]之间。也就是特征中,所有数据都会除以最大值。这个方法对那些已经中心化均值维0或者稀疏的数据有意义。

来个小例子感受一下:

max_abs_scaler = preprocessing.MaxAbsScaler()
x_train_maxsbs = max_abs_scaler.fit_transform(x)
x_train_maxsbs
'''
array([[ 0.5, -1. ,  1. ],
       [ 1. ,  0. ,  0. ],
       [ 0. ,  1. , -0.5]])
'''

# 同理,也可以对新的数据集进行同样的转换
x_test = np.array([[-3., -1., 4.]])
x_test_maxabs = max_abs_scaler.transform(x_test)
x_test_maxabs
'''
array([[-1.5, -1. ,  2. ]])
'''
规模化稀疏数据

如果对稀疏数据进行去均值的中心化就会破坏稀疏的数据结构。虽然如此,我们也可以找到方法去对稀疏的输入数据进行转换,特别是那些特征之间的数据规模不一样的数据。

MaxAbsScaler 和 maxabs_scale这两个方法是专门为稀疏数据的规模化所设计的。

规模化有异常值的数据

如果你的数据有许多异常值,那么使用数据的均值与方差去做标准化就不行了。

在这里,你可以使用robust_scale 和 RobustScaler这两个方法。它会根据中位数或者四分位数去中心化数据。

正则化Normalization

正则化是将样本在向量空间模型上的一个转换,经常被使用在分类与聚类中。

Normalization对于每个样本缩放到单位范数(每个样本的范数为1),主要有L1-normalization(L1范数)、L2-normalization(L2范数)等

Normalization主要思想是对每个样本计算其p-范数,然后对该样本中每个元素除以该范数,这样处理的结果是使得每个处理后样本的p-范数(比如l1-norm,l2-norm)等于1。

p-范数的计算公式:

∥X∥p=((|x1|)p+(|x2|)p+…+(|xn|)p)1p

该方法主要应用于文本分类和聚类中。例如,对于两个TF-IDF向量的l2-norm进行点积,就可以得到这两个向量的余弦相似性。

函数normalize 提供了一个快速有简单的方式在一个单向量上来实现这正则化的功能。正则化有l1,l2等,这些都可以用上:

x_normalized = preprocessing.normalize(x, norm='l2')

print x
print x_normalized
'''
[[ 1. -1.  2.]
 [ 2.  0.  0.]
 [ 0.  1. -1.]]
[[ 0.40824829 -0.40824829  0.81649658]
 [ 1.          0.          0.        ]
 [ 0.          0.70710678 -0.70710678]]
'''

preprocessing这个模块还提供了一个实用类Normalizer,实用transform方法同样也可以对新的数据进行同样的转换

# 根据训练数据创建一个正则器
normalizer = preprocessing.Normalizer().fit(x)
normalizer
'''
Normalizer(copy=True, norm='l2')
'''
# 对训练数据进行正则
normalizer.transform(x)
'''
array([[ 0.40824829, -0.40824829,  0.81649658],
       [ 1.        ,  0.        ,  0.        ],
       [ 0.        ,  0.70710678, -0.70710678]])
'''
# 对新的测试数据进行正则
normalizer.transform([[-1., 1., 0.]])
'''
array([[-0.70710678,  0.70710678,  0.        ]])
'''

normalize和Normalizer都既可以用在密集数组也可以用在稀疏矩阵(scipy.sparse)中

对于稀疏的输入数据,它会被转变成维亚索的稀疏行表征(具体请见scipy.sparse.csr_matrix)

二值化–特征的二值化

特征的二值化是指将数值型的特征数据转换成布尔类型的值。可以使用实用类Binarizer。

from sklearn import preprocessing
import numpy as np

# 创建一组特征数据,每一行表示一个样本,每一列表示一个特征
x = np.array([[1., -1., 2.],
              [2., 0., 0.],
              [0., 1., -1.]])

binarizer = preprocessing.Binarizer().fit(x)
binarizer.transform(x)
'''
array([[ 1.,  0.,  1.],
       [ 1.,  0.,  0.],
       [ 0.,  1.,  0.]])
'''

默认是根据0来二值化,大于0的都标记为1,小于等于0的都标记为0。

当然也可以自己设置这个阀值,只需传出参数threshold即可。

binarizer = preprocessing.Binarizer(threshold=1.5)
binarizer.transform(x)
'''
array([[ 0.,  0.,  1.],
       [ 1.,  0.,  0.],
       [ 0.,  0.,  0.]])
'''

binarize and Binarizer都可以用在密集向量和稀疏矩阵上。

为类别特征编码

我们知道特征可能是连续型的也可能是类别型的变量,比如说:

[“male”, “female”], [“from Europe”, “from US”, “from Asia”], [“uses Firefox”, “uses Chrome”, “uses Safari”, “uses Internet Explorer”].

这些类别特征无法直接进入模型,它们需要被转换成整数来表征,比如:

[“male”, “from US”, “uses Internet Explorer”] could be expressed as [0, 1, 3] while [“female”, “from Asia”, “uses Chrome”] would be [1, 2, 1].

然而上面这种表征的方式仍然不能直接为scikit-learn的模型所用,因为模型会把它们当成序列型的连续变量。

要想使得类别型的变量能最终被模型直接使用,可以使用one-of-k编码或者one-hot编码。这些都可以通过OneHotEncoder实现,它可以将有n种值的一个特征变成n个二元的特征。

enc = preprocessing.OneHotEncoder()
enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])
enc.transform([[0,1,3]]).toarray()
'''
array([[ 1.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  1.]])
'''

特征1中有(0,1)两个值,特征2中有(0,1,2)3个值,特征3中有(0,1,2,3)4个值,所以编码之后总共有9个二元特征。

但是呢,也会存在这样的情况,某些特征中可能对一些值有缺失,比如明明有男女两个性别,样本数据中都是男性,这样就会默认被判别为我只有一类值。这个时候我们可以向OneHotEncoder传如参数n_values,用来指明每个特征中的值的总个数。如下:

enc = preprocessing.OneHotEncoder(n_values=[2,3,4])
enc.fit([[1, 2, 3], [0, 2, 0]])
enc.transform([[1,0,0]]).toarray()
'''
array([[ 0.,  1.,  1.,  0.,  0.,  1.,  0.,  0.,  0.]])
'''

弥补缺失数据

在scikit-learn的模型中都是假设输入的数据是数值型的,并且都是有意义的,如果有缺失数据是通过NAN,或者空值表示的话,就无法识别与计算了。

要弥补缺失值,可以使用均值,中位数,众数等等。Imputer这个类可以实现。请看:

import numpy as np
from sklearn.preprocessing import Imputer

imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
imp.fit([[1, 2], [np.nan, 3], [7, 6]])

x = [[np.nan, 2], [6, np.nan], [7, 6]]
imp.transform(x)
'''
array([[ 4.        ,  2.        ],
       [ 6.        ,  3.66666667],
       [ 7.        ,  6.        ]])
'''

Imputer类同样也可以支持稀疏矩阵,以下例子将0作为了缺失值,为其补上均值

import scipy.sparse as sp

# 创建一个稀疏矩阵
x = sp.csc_matrix([[1, 2], [0, 3], [7, 6]])

imp = Imputer(missing_values=0, strategy='mean', verbose=0)
imp.fit(x)

x_test = sp.csc_matrix([[0, 2], [6, 0], [7, 6]])
imp.transform(x_test)
'''
array([[ 4.        ,  2.        ],
       [ 6.        ,  3.66666667],
       [ 7.        ,  6.        ]])
'''

创建多项式特征

有的时候线性的特征并不能做出美的模型,于是我们会去尝试非线性。非线性是建立在将特征进行多项式地展开上的。

比如将两个特征 (X_1, X_2),它的平方展开式便转换成5个特征(1, X_1, X_2, X_1^2, X_1X_2, X_2^2). 代码案例如下:

import numpy as np
from sklearn.preprocessing import PolynomialFeatures

# 自建一组3*2的样本
x = np.arange(6).reshape(3, 2)

# 创建2次方的多项式
poly = PolynomialFeatures(2)

poly.fit_transform(x)
'''
array([[  1.,   0.,   1.,   0.,   0.,   1.],
       [  1.,   2.,   3.,   4.,   6.,   9.],
       [  1.,   4.,   5.,  16.,  20.,  25.]])
'''

看,变成了3*6的特征矩阵,里面有5个特征,加上第一列的是Bias.

也可以自定义选择只要保留特征相乘的项。
即将 (X_1, X_2, X_3) 转换成 (1, X_1, X_2, X_3, X_1X_2, X_1X_3, X_2X_3, X_1X_2X_3).

x = np.arange(9).reshape(3, 3)

poly = PolynomialFeatures(degree=3, interaction_only=True)
poly.fit_transform(x)
'''
array([[   1.,    0.,    1.,    2.,    0.,    0.,    2.,    0.],
       [   1.,    3.,    4.,    5.,   12.,   15.,   20.,   60.],
       [   1.,    6.,    7.,    8.,   42.,   48.,   56.,  336.]])
'''

自定义特征的转换函数

通俗的讲,就是把原始的特征放进一个函数中做转换,这个函数出来的值作为新的特征。

比如说将特征数据做log转换,做倒数转换等等。

FunctionTransformer 可以实现这个功能

import numpy as np
from sklearn.preprocessing import FunctionTransformer

transformer = FunctionTransformer(np.log1p)

x = np.array([[0, 1], [2, 3]])

transformer.transform(x)
'''
array([[ 0.        ,  0.69314718],
       [ 1.09861229,  1.38629436]])
'''

当我们拿到一批原始的数据

1、首先要明确有多少特征,哪些是连续的,哪些是类别的。
2、检查有没有缺失值,对确实的特征选择恰当方式进行弥补,使数据完整。
3、对连续的数值型特征进行标准化,使得均值为0,方差为1。
4、对类别型的特征进行one-hot编码。
5、将需要转换成类别型数据的连续型数据进行二值化。
6、为防止过拟合或者其他原因,选择是否要将数据进行正则化。
7、在对数据进行初探之后发现效果不佳,可以尝试使用多项式方法,寻找非线性的关系。
8、根据实际问题分析是否需要对特征进行相应的函数转换。

官方文档链接http://scikit-learn.org/stable/modules/preprocessing.html#preprocessing

参考:https://blog.csdn.net/dengdengma520/article/details/79629186
https://blog.csdn.net/sinat_33761963/article/details/53433799

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[550]sklearn-preprocessing使用 的相关文章

  • Http协议详解

    引入 超文本传输协议 HTTP HyperText Transfer Protocol 是互联网上应用最为广泛的一种网络协议 所有的WWW文件都必须遵守这个标准 设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法 1960年美

随机推荐

  • 日赚4.12亿,腾讯最新员工薪酬公布:均薪破100万!!!

    近日 腾讯发布2023年第二季度财报 有一项数据冲上热搜 引起热议 据计算 腾讯人均年薪破100万 网友直呼 酸了酸了 这是认真的吗 跟随播妞一起来看看吧 腾讯员工平均年薪达100万 从大厂财报看互联网行业回暖之势 近日 腾讯发布截至6月3
  • [Python]保姆级win11环境安装Python

    1 下载安装包 https www python org downloads 选择自己的系统对应的安装包 我的是Windows系统 我就直接选择它了 选择64位安装包 根据自己系统对应的安装包 2 开始安装 去下载路径下 双击源文件 开始安
  • LeetCode第321场周赛题解

    这周周赛没有什么过多难的 也是可以自己写完的 芜湖 第一道题 6245 找出中枢整数 给你一个正整数 n 找出满足下述条件的 中枢整数 x 1 和 x 之间的所有元素之和等于 x 和 n 之间所有元素之和 返回中枢整数 x 如果不存在中枢整
  • Android之RecyclerView多布局

    做一个项目的主页面的时候 想要它呈现出来的效果 不单一 更丰富那就要使用多布局来展现出来 那么就要思考一个问题 他呈现的是多个布局 怎么才能展现出来不同的布局 逻辑很简单 通过设置几个flag 来表示这些布局当前显示的是哪个布局 接下来 和
  • 使用python对光谱数据进行lorentz峰值拟合(bounds限定拟合参数范围)

    1 lorentz峰值拟合 发光光谱是一种用于表征二维半导体材料光学性质的重要技术 它可以反映出材料中的载流子密度 缺陷态 激子束缚能等信息 由于二维半导体材料的厚度极其薄 其发光信号往往很弱 且受到基底 环境和测量设备等因素的干扰 因此需
  • MySQL怎么实现行转列SQL

    问题 关于Mysql 的分级输出问题 情景 学校里面记录成绩 每个人的选课不一样 而且以后会添加课程 所以不需要把所有课程当作列 数据表里面数据如下图 使用姓名 课程作为联合主键 有些需求可能不需要联合主键 本文以MySQL为基础 其他数据
  • 在JSP中弹出信息框

    下面我以登录界面的代码为例子 在LoginServlet中 判断验证码是否正确 忽略大小写 if attribute equalsIgnoreCase user getCheckCode User login new UserDao log
  • python元组

    第026讲 元组 小甲鱼python第26讲 课堂笔记 rhyme 1 2 3 4 5 上山打老虎 rhyme 1 2 3 4 5 上山打老虎 rhyme 1 2 3 4 5 上山打老虎 rhyme 1 2 3 4 5 上山打老虎 rhym
  • 今天一次性给你讲清楚:File、Blob、FileReader、ArrayBuffer、Base64

    Blob Blob 全称为 binary large object 即二进制大对象 blob对象本质上是js中的一个对象 里面可以储存大量的二进制编码格式的数据 Blob 对象一个不可修改 从Blob中读取内容的唯一方法是使用 FileRe
  • 如何搭建Python开发环境

    目录 一 要求及注意 可选 二 安装Anaconda 三 设置环境变量 四 Pycharm的安装及配置及conda虚拟环境的创建 一 要求及注意 1 要求 操作为 Windows 10 及以上 推荐 64 位 2 注意 系统登录名 非显示名
  • 交通部809协议服务器代码,部标平台检测(三).交通部部标809协议测试和运行测试

    本身交通部在制定jt t 809协议文档时 过度设计 采用双链路的复杂的通信架构 文档中文字抽象 而且歧义是很多的 开发者很容易疑惑 产生各种不确定和疑惑 又没有人答疑 全靠摸索 在加上交通部部表809的测试相对比较困难 因为你在开发的时候
  • Python字符串替换方法replace

    字符串替换方法replace str1 replace old str new str count 字符串的替换 将str1中的 old str 替换成new str old str 将要被替换的字符串 new str 新的字符串 替换成的
  • 认识shell

    Shell俗称 壳 他提供了用户和内核进行交互操作的一种接口 它接收用户输入的命令并把它送入到内核中去执行 Shell实际上是一个命令解释器 它通过解释用户输入的命令并把它传输到系统内核中去执行 Shell有自己的编程语言用于对命令的编辑
  • 贪心算法解汽车加油问题——算法解题报告

    一辆汽车加满油后可行驶n公里 旅途中有若干个加油站 设计一个有效算法 指出应在哪些加油站停靠加油 使沿途加油次数最少 对于给定的n n lt 5000 和k k lt 1000 个加油站位置 编程计算最少加油次数 并证明算法能产生一个最优解
  • 多线程(六):多线程案例

    多线程最最经典案例就是上一章的单例设计模式 当然除了单例设计模式 还有其他的案例 本章就 一一 来介绍 阻塞队列 这里是第一次提到阻塞队列这个东西 简单介绍一下 什么是阻塞队列 阻塞队列 BlockingQueue 是一个支持两个附加操作的
  • 连续和离散傅立叶变换总结及推导

    连续时间复指数信号 e j w 0 t e jw 0t ejw0 t 是否为周期信号 x t x t T x t x t T x t x t T 现假设 x t e j w 0 t x t e jw 0t x t ejw0 t e j w
  • C++反汇编 利用反汇编分析常见C/C++语句的底层实现(硬核)

    文章目录 赋值操作 if条件判断 指针和引用的实质 跳转函数 两个数字的交换操作 数组的赋值及 858993460数字的由来 总结 本节我们利用反汇编技术来对我们最常见的C语言语句进行解析 C 反汇编技术可以让你更好的理解C C语言的底层含
  • sam初识+sam详解

    SAM是什么 也许大家在网上看了许多的关于sam的传奇的故事吧 那么今天就让我 偏执狂带你们进入sam的所有吧 第一节 初级认识sam 微软做了两个不同的系统骨架 一个叫Win32 我们用的Win9x Me系统就附在它上面 另一个叫NT N
  • IM通讯设计

    1 系统架构 2 网络架构 3 发送消息的过程
  • [550]sklearn-preprocessing使用

    标准化 Z Score 公式为 X mean std 计算时对每个属性 每列分别进行 将数据按期属性 按列进行 减去其均值 并处以其方差 得到的结果是 对于每个属性 每列来说所有数据都聚集在0附近 方差为1 使用sklearn prepro