数据预处理、特征工程(1)

数据预处理、特征工程

一、数据预处理

数据预处理是从数据中检测,纠正或者删除损坏,不准确或不适用于模型的记录的过程。可能面临的问题有:数据类型不同(文字、数字,时间序列,连续性变量,离散型变量)数据质量不行(有噪声、异常缺失、数据出错、量纲不一,重复)
数据预处理的目的:让数据适应模型,匹配模型的需求。

1 . 数据归一化(Normalization 又成Min-Max Scaling)

       当数据x按照最小值中心化后,再按极差(最大值=最小值)缩放,数据移动了最小值个单位,并且会被收敛到【0,1】之间,这个过程叫做数据归一化。

  • x* = ((x)-min(x) )/ (max(x) - min(x))

说明:Normalization是归一化,不是正则化,正则化是Regularization,不是数据预处理的一种手段,归一化后的数据服从正态分布。
       在sklearn中,使用preprocessing.MinMaxScale来实现的,有一个参数,feature_rang控制我们希望把数据压缩的范围,默认是[0,1]。
在这里插入图片描述
在这里插入图片描述

2. 数据标准化(Standardization)

       当数据x按均值μ中心化后,再按标准差α缩放,数据就会服从均值为0,方差为1的正太分布,这过程就是数据标准化(standardization)公式如下:

  • x*=(x-μ)/ α

在这里插入图片描述
对于标准化和归一化来说,空值会被当做缺失值。所以数据标准化和归一化我们选哪个?

       这个需要看具体情况的。大多数机器学习会选择标准化 ,在PCA,聚类,LR,SVM 和神经网络中,标准化是最好的选择。
       归一化在不涉及距离度量,梯度,方差计算以及数据需要被压缩到指定区间时使用广泛。处理中量化像素强度时,都会使用归一化将数据压缩到[0,1]之间。
建议先使用标准化,效果不好换归一化。除了这两个以外,sklearn中也提供了各种其他缩放处理方法

3. 缺失值

import pandas as pd
data = pd.read_csv(r"位置",index_col=0) #index_col=0 意思是请把第0列作为索引。
data.head() #表示显示前多好行数据,()可以指定

data.info() #可以查看数据的信息,多少条信息,每个属性怎么样

       使用的一个例子是,有单个特征,一直数值型,两个字符型,标签也是字符型。(泰坦尼克号数据,以下都是使用该数据)
在这里插入图片描述

处理缺失值的类 impute.SimpleImputer
class sklearn.impute.SimpuleImputer (missing_values=nan,strategy=“mean”,filll_value=None,copy=True)
每个参数的取值及其意义

(1)missing_values 告诉SimpleImputer,数据中的缺失值长什么样,默认值是空值。
(2) strange 填补缺失值的策略,默认是均值

  • 输入“mean”用均值填补,(仅对数值型特征可用)
  • 输入“median”用中值填补(仅对数值型特诊可用)
  • 输入“most_frequent”用众数填补(数值型和字符型特征都可用)
  • 输入“constant”表示请参考参数“fill_value”中的值,(对数值型和字符型特征可用)

( 3)fill_value 当参数startegy为constant的时候可用,可输入字符串或数字表示要填充的值,常用为0
(4) copy 默认为True将创建的特征矩阵的副本,反之将会将缺失值填补到原本的特征矩阵中去。

开始填充Age

#用均值填补Age
Age = data.loc[:,"Age"].values.reshape(-1,1) #从data中提取age特征,然后变成二维数据

from sklearn.impute import SimpleImputer
imp_mean = SimpleImputer() #实例化,默认均值填补
imp_median = SimpleImputer(strategy="median") #用中位数填补
imp_0 = SimpleImputer(strategy="constant",fill_value=0) #用0填充

#实例化
imp_mean  = imp_mean.fit_transform(Age)
imp_median  = imp_median.fit_transform(Age)
imp_0  = imp_0.fit_transform(Age)

#用众数填补Embarked
Embarked = data.loc[:,"Embarked "].values.reshape(-1,1)
imp_mode = SimpleImputer(strategy = "most_frequent")
data.loc[:,"Embarked "] = imp_mode.fit_transform(Embarked )

一点小经验,对于缺失值较少的,比如就缺了几条数据,十几条数据,就可以直接删除掉了,如果缺的数据较多就要进行填补了。在这里插入图片描述

4. 处理分类型数据

处理分类型特征:编码与哑变量
       在ML中,大多数算法,包括LR,SVM,KNN等都只能处理数值型数据,不能处理文字。手写决策树和NB是可以处理文字,但是sklearn中必须导入数值型数据。

       为了将数据更适合算法和库,需要对数据进行编码,也就是将文字型数据转换为数值型。在泰塔尼克号中性别等都是文字型数据。

A . preprocessing.LabelEncoder:标签专用,能够将分类转换为分类数值。

from sklearn.preprocessing import LabelEncode
y = data.iloc[:,-1] #要输入的是标签,不是特征矩阵,所以允许一维

le = LabelEncoder() #实例化
le = le.fit(y) #导入数据
label = le.transform(y) #transform接口调取结果

le.classes_  #属性.classes_ 查看便签中究竟有多少列表
laber #查看获取的结果label

le.fit_transform(y) #也可以直接fit_transform一步到位
le.inverse_transform(label) #使用inverse_transform可以逆转

data.iloc[:,-1] = label #让标签等于我们运行出来的结果,将编码好的标签放到数据中

data.head()

更简便的写法

from sklearn.preprocessing import LabelEncoder
data.iloc[:,-1] = LabelEncoder().fit_transform(data.iloc[:,-1])

B. preprocessing.OrdinalEncoder:特征专用,能够将分类特征转换为分类数值。
区别是不能导入一维数组

from sklearn.preprocessing import OrdinalEncoder
#接口categories_对应LabelEncoder的接口class_,一模一样的功能

data_ = data.copy() #拷贝原本的数据,保护它避免被覆盖
data_.head()

OrdinalEncoder().fit(data_.iloc[:,1:-1]).categories_
data_.iloc[:,1:-1] = OrdinalEncoder().fit_transform(data_.iloc[:,1:-1])
data_.head()

C. preprocessing.OneHotEncoder:独热编码,创建哑变量
接下来我们考虑三种不同性质的分类数据:

  • 名义变量

    舱门(S,C,Q)三种取值是相互独立的,彼此之间完全没有任何联系,表达的是S不等于C不等于Q的概念。

  • 有序变量
    学历(小学,初中,高中)三种取值是不完全独立的,在性质上有高中>初中>小学,学历有高低,但是学历取值之间却不是可计算的。

  • 有距变量
    体重(>45kg,>90kg,>135kg),各个取值之间有联系,且是可以计算的,比如120kg-45kg
    = 90kg,分类之间可以通过数学计算互相转换。

       然而在对特诊改进型编码的是偶,这三种分类都=数据都会转换成[0,1,2],这三个数字在算法看来,是连续的课计算的,这三个数字互不相等,有大小,并且有着可以相乘或者相加的联系。所以算法会把舱门,学历这中分类特征都误会成是体重这样的分类特征。
也就是说,在分类转换成数字的时候,忽略了数字汇总自带的数学属性,所以给算法传达了一些不准确的信息,从而影响了我们的建模。

=============================================================

       类别OrdinalEncoder可以用来处理有序变量,但对于名义变量,只有使用哑变量的方式来处理,才能向算法传达最准确的信息:

"S" [0,             "S" [ [1,0,0],
"Q" 1,    ===>      "Q" [0,1,0],
"C" 2]              "C"  [0,0,1]]

       这样的变化,才能让算法彻底领悟,原来三个取值是没有可计算性质的,是“有你就没有我”的不等概念。
       因此在该数据中农,性别和舱门,都是这样的名义变量,需要使用独热编码,将两个特征都转换为哑变量。

data.head()

from sklearn.preprocessing import OneHotEncoder
x = data.iloc[:,1:-1] #是从第一列提取到-1列,也就是中间两列

enc = OneHotEncoder(categories="auto").fit(x)
result = enc.transform(x).toarray() #将前面的结果转换成数组
reult
#依然可以一步到位
enc = OneHotEncoder(categories="auto").fit_transform(x).toarray()

#合并原始data和编码后的data
#axis=1 表示跨域进行合并,也就是将两个表左右相连,如果axis=0,就是将两个表上下相连
newdata = pd.concat([data,pd.DataFrame(result)],axis=1)

代码执行后的结果:
在这里插入图片描述

newdata.head()
newdata.drop(["Sex","Embarked"],axis=1,inplace=True) #删除掉sex,embarked两列
newdata.columns = ["Age","Survived","Femal","Male","Embarked_C","Embarked_Q","Embarked_S"]
#修改列表
newdata.head()

修改和删除后的结果:
在这里插入图片描述

5. 处理连续型数据

处理连续性特征:二值化与分段

  • sklearn.preprocessing.Binarizer

       根据阈值将数据二值化(将特征值设置为0或1),用于处理连续型变量,大于阈值的值映射为1,小于或等于阈值的值映射为0,默认阈值为0时,特征中的所有正值都映射为1,负值都映射为0。
       二值化是对文本计数数据的常见的操作,分析人员可以决定仅考虑某种现象的存在与否,还可以用于考虑布尔随机变量的估计器的预处理步骤。

将年龄二值化

data_2 = data.copy()
from sklearn.preprocessing import Binarizer

x = data_2.iloc[:,0].values.reshape(-1,1) #取出年龄,类为特征专用,所以不能使用一维数组。所有用来处理特征的类,不接受一维数组
transformer = Binarizer(threshold=30).fit_transform(x)

data_2.iloc[:,0]=transformer #把处理后的数据替换到data_2的数据中。
transfomer
  • sklearn.preprocessing.KBinsDiscretizer

这是将连续型变量划分为分类变量的类 ,能够将连续型变量排序后按照顺序分箱后编码,包含三个重要的参数:

参数含义&输入
n_bins每个特征中分箱的个数,默认为5,一次会被运用到所有导入的特征
encode编码的方式,默认为“onehot” 。
onehot做哑变量,之后返回一个稀疏矩阵,每一列是一个特征中的一个类别,含有该类别的样本表示为1,不含的表示为0。
“ordinal”:每个特征的每个箱都被编码为一个整数,返回每一列是一个特征,每个特征下含有不同整数编码的箱的矩阵。
“onhoe-dense”:做哑变量,之后返回一个密集数组。
strategy用来定义箱宽的方式,默认“quantile”
“uniform” :表示等宽分箱,即每个特征中的每个箱的最大值之间的差为(特征.max(x)-特征.min())/ (n_bins)
"quantile" : 表示等位分箱,即每个特征中的每个箱内的样本数量都相同。
“kmeans“: 表示按聚类分箱,每个箱中的值到最后的一维k均值聚类的簇心得距离都相同
from sklearn.preprocessing inport KBinsDiscretizer
X = data.iloc[:0].values.reshape(-1,1)

est = KBinsDiscretizer(n_bins=3, encode='ordinal',strategy='uniform')
est.fit_transform(X)

#查看分箱转换后分的箱:变成了一列中的三箱
set(est.fit_transform(X).ravel())

est = KBinsDiscretizer(n_bins=3, encode='onehot',strategy='uniform')
#查看转换后的分的箱,变成了哑变量
est.fit_transform(X).toarray()
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值