敞开成长之旅!这是我参加「日新计划 2 月更文挑战」的第 9 天,点击检查活动详情
前言
当咱们开端预备数据建模、构建机器学习模型的时候,第一时间考虑的不该该是就考虑到挑选模型的品种和办法。而是首要拿到特征数据和标签数据进行研究,挖掘特征数据包括的信息以及思考怎么更好的处理这些特征数据。那么数据类型本身代表的意义就需求咱们进行思考,究竟是定量核算仍是进行定类剖析更好呢?这便是这篇文章将要详解的一个问题。
一、特征类型判别
特征类型判别以及处理是前期特征工程重要的一环,也是决定特征质量好坏和权衡信息丢掉最重要的一环。其间涉及到的数据有数值类型的数据,例如:年龄、体重、身高这类特征数据。也有字符类型特征数据,例如性别、社会阶层、血型、国家归属等数据。
依照数据存储的数据格式能够概括为两类:
依照特征数据意义又可分为:
-
离散型随机变量:取值只能是可取范围内的指定数值类型的随机变量,比方年龄、车流量此类数据。
-
接连随机变量:依照测量或者核算办法得到,在某个范围内连取n个值,此类数据可化为定类数据。
-
二分类数据:此类数据仅只要两类:例如是与否、成功与失败。
-
多分类数据:此类数据有多类:例如天气出太阳、下雨、阴天。
-
周期型数据:此类数据存在一个周期循环:例如周数月数。
二、定量数据特征处理
拿到获取的原始特征,有必要对每一特征别离进行归一化,比方,特征A的取值范围是[-1000,1000],特征B的取值范围是[-1,1].假如运用logistic回归,w1x1+w2x2,因为x1的取值太大了,所以x2基本起不了效果。所以,有必要进行特征的归一化,每个特征都独自进行归一化。
关于处理定量数据我已经在:数据预处理归一化具体解释这篇文章里边叙述的很具体了,这儿进行前后相关,共有min-max规范化、Z-score规范化、Sigmoid函数规范化三种办法:
根据特征数据意义类型来挑选处理办法:
- 离散型随机变量处理办法:min-max规范化、Z-score规范化、Sigmoid函数规范
- 接连随机变量处理:Z-score规范化,Sigmoid函数规范
三.定类数据特征处理
我的上篇文章[数据预处理归一化具体解释]并没有介绍关于定类数据咱们怎么去处理,在本篇文章具体介绍一些常用的处理办法:
1.LabelEncoding
直接替换办法适用于原始数据会集只存在少量数据需求人工进行调整的状况。假如需求调整的数据量非常大且数据格式不统一,直接替换的办法也能够完成咱们的意图,但是这种办法需求的工作量会非常大。因此, 咱们需求能够快速对整列变量的一切取值进行编码的办法。
LabelEncoding,即标签编码,效果是为变量的 n 个唯一取值分配一个[0, n-1]之间的编码,将该变量转换成接连的数值型变量。
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
le.fit(['拥堵','缓行','畅行'])
le.transform(['拥堵','拥堵','畅行','缓行'])
array([0, 0, 1, 2])
2.OneHotcoding
对于处理定类数据咱们很简单想到将该类别的数据悉数替换为数值:比方车辆拥堵状况,咱们把拥堵标为1,缓行为2,畅行为3.那么这样是完成了标签编码的,但一起也给这些无量纲的数据转为了有量纲数据,咱们原意是没有将它们比较之意的。机器可能会学习到“拥堵<缓行<畅行”,所以采用这个标签编码是不行的,需求进一步转换。因为有三种区间,所以有三个比特,即拥堵编码为100,缓行为010,畅行为001.如此一来每两个向量之间的间隔都是根号2,在向量空间间隔都持平,所以这样不会出现偏序性,基本不会影响根据向量空间衡量算法的效果。
自然状况码为:000,001,010,011,100,101
独热编码为:000001,000010,000100,001000,010000,100000
咱们能够运用sklearn的onehotencoder来完成:
from sklearn import preprocessing
enc = preprocessing.OneHotEncoder()
enc.fit([[0, 0, 1], [0, 1, 0], [1, 0, 0]]) # fit来学习编码
enc.transform([[0, 0, 1]]).toarray() # 进行编码
array([[1., 0., 1., 0., 0., 1.]])
数据矩阵是3*3的,那么原理是怎么来的呢?咱们仔细观察:
第一列的第一个特征维度有两种取值0/1,所以对应的编码方式为10、01.
第二列的第二个特征也是相同的,类比第三列的第三个特征。固001的独热编码便是101001了。
因为大部分算法是根据向量空间中的衡量来进行核算的,为了使非偏序联系的变量取值不具有偏序性,而且到圆点是等距的。运用one-hot编码,将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点。将离散型特征运用one-hot编码,会让特征之间的间隔核算愈加合理。离散特征进行one-hot编码后,编码后的特征,其实每一维度的特征都能够看做是接连的特征。就能够跟对接连型特征的归一化办法相同,对每一维特征进行归一化。比方归一化到[-1,1]或归一化到均值为0,方差为1。
将离散特征经过one-hot编码映射到欧式空间,是因为,在回归,分类,聚类等机器学习算法中,特征之间间隔的核算或类似度的核算是非常重要的,而咱们常用的间隔或类似度的核算都是在欧式空间的类似度核算,核算余弦类似性,根据的便是欧式空间。
优点:
独热编码处理了分类器欠好处理属性数据的问题,在一定程度上也起到了扩充特征的效果。它的值只要0和1,不同的类型存储在垂直的空间。
缺点:
当类别的数量很多时,特征空间会变得非常大。在这种状况下,一般能够用PCA来减少维度。而且one hot encoding+PCA这种组合在实际中也非常有用。
运用场景:
独热编码用来处理类别型数据的离散值问题。
无用场景:
将离散型特征进行one-hot编码的效果,是为了让间隔核算更合理,但假如特征是离散的,而且不用one-hot编码就能够很合理的核算出间隔,那么就没必要进行one-hot编码。有些根据树的算法在处理变量时,并不是根据向量空间衡量,数值只是个类别符号,即没有偏序联系,所以不用进行独热编码。Tree Model不太需求one-hot编码: 对于决策树来说,one-hot的本质是添加树的深度。
代码完成
办法一: 完成one-hot编码有两种办法:sklearn库中的 OneHotEncoder() 办法只能处理数值型变量假如是字符型数据,需求先对其运用 LabelEncoder() 转换为数值数据,再运用 OneHotEncoder() 进行独热编码处理,而且需求自行在原数据会集删去进行独热编码处理的原变量。
import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
lE = LabelEncoder()
df=pd.DataFrame({'路况':['拥堵','畅行','畅行','拥堵','畅行','缓行','缓行','拥堵','缓行','拥堵','拥堵','拥堵']})
df['路况']=lE.fit_transform(df['路况'])
OHE = OneHotEncoder()
X = OHE.fit_transform(df).toarray()
df = pd.concat([df, pd.DataFrame(X, columns=['拥堵', '缓行','畅行'])],axis=1)
df
办法二:
pandas自带get_dummies()办法
get_dummies() 办法能够对数值数据和字符数据进行处理,直接在原数据集上运用该办法即可。该办法发生一个新的Dataframe,列名由原变量延伸而成。将其合并入原数据集时,需求自行在原数据会集删去进行虚拟变量处理的原变量。
import pandas as pd
df=pd.DataFrame({'路况':['拥堵','畅行','畅行','拥堵','畅行','缓行','缓行','拥堵','缓行','拥堵','拥堵','拥堵']})
pd.get_dummies(df,drop_first=False)
点关注,防走丢,如有疏忽之处,请留言指导,非常感谢
以上便是本期悉数内容。我是fanstuck ,有问题大家随时留言评论 ,咱们下期见。