「Python」sklearn第二弹-归一化和离散值编码

简介: 本文主要讲解sklearn里面的归一化,其中包括-L1范式和L2范式。 还讲解了关于离散值编码,主要涉及到的编码方式有LabelEncoder和OneHotEncoder。

「Python」sklearn第二弹-归一化和离散值编码


本文主要讲解sklearn里面的归一化,其中包括-L1范式和L2范式。 还讲解了关于离散值编码,主要涉及到的编码方式有LabelEncoder和OneHotEncoder。


先介绍一下归一化:


归一化


why? --- 加快训练速度 归一化是缩放单个样本以具有单位范数的过程。

归一化实质是一种线性变换,线性变换有很多良好的性质,这些性质决定了对数据改变后不会造成“失效”,反而能提高数据的表现,这些性质是归一化的前提。

归一化能够加快模型训练速度统一特征量纲避免数值太大。值得注意的是,

归一化是对每一个样本做转换,所以是对数据的每一行进行变换。而之前我们讲过的方法是对数据的每一列做变换。


L1范式


调用L1范式:


from sklearn.preprocessing import normalize

x = normalize(x,'l1')


L1范式定义

向量x中每个元素的绝对值之和


公式表示:

∥x∥1=∑i=1n∣xi∣\begin{Vmatrix}x \end{Vmatrix}_1 = \sum_{i=1}^n |x_i| x1=i=1nxi


L1范式归一化就是将样本中每个特征除以特征的L1范式。


通过normalize实现:

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

L2范式


x = normalize(x,'l2')


L2范式定义


向量元素的平方和再开平方根


公式:

image.png

L2范式归一化就是将样本中每个特征除以特征的L2范式

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

离散值编码


离散值特征变量可以分为有序类和无序类。

无序类:价值相等且可区分,各变量相互独立。如:性别(男/女)、颜色(红橙黄绿青蓝紫)

有序类:各变量有级别大小等逻辑关系。如:学历(高/中/低)、尺码(S/M/L/XL..)


为什么需要编码?

无序类:不能直接对特征进行赋值,比如male-1, female-0。


这是不科学的,因为这样一来就存在了大小关系,在算法学习时就会利用其大小关系来训练和预测。任何两个数值如1和0,都无法表示出male与female的价值相等且可区分的平行独立的关系.


但改成这样就可以了:male-[0,1],female-[1,0]


有序类


比如学历变量是博士、硕士、本科,分别用3-2-1来表示。

那么问题来了:为何可以用3-2-1来表示而不能用30-20-10来表示?如果1000-900-800呢?

但事实却是任何数字的排序都无法表达出变量的差异性。


何时不需要编码?


编码的作用本来就是让特征之间的距离计算更加合理,但是如果特征是离散的,并且不用one-hot编码就可以很合理的计算出距离,那么就没有必要进行one-hot编码。(如Titanic中的age特征)


有些基于树的算法在处理变量时,并不是基于向量空间度量,数值只是个类别符号,即没有偏序关系,所以不用进行独热编码。如:  Tree Model不太需要one-hot编码, 对于决策树来说,one-hot的本质是增加树的深度


编码的方式大致有三种:


  • LebelEncoder:适合处理字符型数据或者label类,一般先用此方法将字符型数据转化为数值型,然后再用get_dummies或OneHot编码。


  • get_dummies:pandas方法,多适用于DataFrame数据


  • OneHotEncoder:普遍的额编码方法


这里只简单的介绍一下第一种和第三种编码方式,请往下看:


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来实现:

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

OneHotEncoder


上面那种整数特征表示并不能在sklearn的估计器中直接使用,因为这样的连续输入,估计器会认为类别之间是有序的,但实际却是无序的。


如将male,female,转换为1,0。1比0要大,机器就会把这个关系考虑进去,而male,female之间是没有这样的关系的。

所以我们需要使用另外一种编码方式,OneHot编码。 在sklearn中通过OneHotEncoder来实现,使用方法如下:

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

在回归,分类,聚类等机器学习算法中,特征之间距离的计算相似度的计算是非常重要的,而我们常用的距离或相似度的计算都是在欧式空间的相似度计算,计算余弦相似性,基于的就是欧式空间.


对离散型特征进行one-hot编码是为了让距离的计算显得更加合理


编码后的特征扩维(如性别编码后变成male-[0,1],female-[1,0]),这样数据会变得稀疏


稀疏对算法来说是有好处的:

1.当某的元素时就意味着可以去除这个特征,则学习的难度、计算和存储开销都会降低


2.即便每个样本中有很多零元素,但是都不不是以整列或整行存在的,这样依旧有好处。 比如支持向量机之所以能在文本数据上有很好的性能,就是由于数据有高度的稀疏性,使得大多数问题可以变得线性可分,而且稀疏矩阵有高效的存储方法,节约存储空间。

相关文章
|
3天前
|
算法 Python
请解释Python中的关联规则挖掘以及如何使用Sklearn库实现它。
使用Python的mlxtend库,可以通过Apriori算法进行关联规则挖掘。首先导入TransactionEncoder和apriori等模块,然后准备数据集(如购买行为列表)。对数据集编码并转换后,应用Apriori算法找到频繁项集(设置最小支持度)。最后,生成关联规则并计算置信度(设定最小置信度阈值)。通过调整这些参数可以优化结果。
51 9
|
3天前
|
Python
请解释Python中的主成分分析(PCA)以及如何使用Sklearn库实现它。
PCA是数据降维工具,Python中可通过Sklearn的PCA类实现。以下是一个简例:导入numpy、PCA和数据集;加载鸢尾花数据,标准化;创建PCA对象,指定降维数(如2);应用PCA转换;最后输出降维结果。此示例展示了如何将数据从高维降至二维。
22 4
|
3天前
|
机器学习/深度学习 数据采集 算法
Python中的支持向量机(SVM)以及如何使用Sklearn库实现它
SVM是监督学习算法,用于分类和回归,Python中可通过Scikit-learn实现。步骤包括数据预处理、选择SVM模型(如线性或非线性,配合核函数)、训练模型找到最优超平面、模型评估、参数调整和新数据预测。Scikit-learn简化了这一流程,便于数据分析任务。
34 3
|
3天前
|
Python
python编码和解码
【5月更文挑战第8天】
10 4
|
3天前
|
Python
Python字符串和字节使用正确的编码/解码
【5月更文挑战第6天】Python字符串和字节使用正确的编码/解码
7 2
|
3天前
|
Python
Python明确指定编码
【5月更文挑战第5天】
11 3
|
3天前
|
自然语言处理 Python
Python的编码问题
【5月更文挑战第4天】Python的编码问题
12 3
|
3天前
|
数据采集 机器学习/深度学习 Python
python怎么对数据集进行归一化处理
python怎么对数据集进行归一化处理
17 1
|
3天前
|
机器学习/深度学习 数据采集 算法
【Python机器学习专栏】使用Scikit-learn进行数据编码
【4月更文挑战第30天】本文介绍了Python Scikit-learn库在机器学习数据预处理中的作用,尤其是数据编码。数据编码将原始数据转化为算法可理解的格式,包括标签编码(适用于有序分类变量)、独热编码(适用于无序分类变量)和文本编码(如词袋模型、TF-IDF)。Scikit-learn提供LabelEncoder和OneHotEncoder类实现这些编码。示例展示了如何对数据进行标签编码和独热编码,强调了正确选择编码方法的重要性。
|
3天前
|
机器学习/深度学习 数据采集 算法
【Python机器学习专栏】数据标准化与归一化技术
【4月更文挑战第30天】在机器学习中,数据预处理的两大关键步骤是标准化和归一化,旨在调整数据范围以优化算法性能。标准化将数据缩放到特定区间,如[-1, 1]或[0, 1],适合基于距离的算法,如KNN、SVM。归一化则将数据线性变换到[0, 1],保持相对关系。Python中可使用`sklearn.preprocessing`的`MinMaxScaler`和`StandardScaler`实现这两种操作。选择哪种方法取决于数据分布和算法需求。预处理能提升模型理解和性能,增强预测准确性和可靠性。