python机器学习之数据的预处理(五种方式数据处理案例详解) 您所在的位置:网站首页 数据预处理定义 python机器学习之数据的预处理(五种方式数据处理案例详解)

python机器学习之数据的预处理(五种方式数据处理案例详解)

2024-02-17 23:42| 来源: 网络整理| 查看: 265

数据的预处理

数据下载地址——>点这里下载

到入文件时可以直接复制地址然后用r" "包裹起来。 例如:data = pd.read_cav(r"C:\work\data.csv") 或者也可以以直接将\换成//也可以导入。

1.归一化

在sklearn当中,我们使用preprocessing.MinMaxScaler来实现这个功能。MinMaxScaler有一个重要参数,feature_range,控制我们希望把数据压缩到的范围,默认是[0,1]。 在这里插入图片描述

导入库和数据

from sklearn.preprocessing import MinMaxScaler data = [[-1,2],[-0.5,6],[0,10],[1,18]] import pandas as pd pd.DataFrame(data)

在这里插入图片描述 进行归一化处理

scaler = MinMaxScaler()#实例化 scaler = scaler.fit(data)#fit.在这里是生成min(x)和max(x) result = scaler.transform(data)#通过接口 导出结果 result

在这里插入图片描述 也可以一步达成训练和导出结果

result_ =scaler.transform(data)#训练和导出结果一步达成 result_x

在这里插入图片描述 将归一化的数据逆转为原数据

scaler.inverse_transform(result)#将归一化后的结果逆转

在这里插入图片描述 将范围设置为[0,5]

data = [[-1,2],[-0.5,6],[0,10],[1,18]] scaler = MinMaxScaler(feature_range=[5,10])#实例化带范围5-10 result = scaler.fit_transform(data)#一步导出结果 result

在这里插入图片描述 当数据量多于大时,使用:

# scaler = scaler.partial_fit(data) #大数据使用

使用numpy处理数据归一化

import numpy as np X= np.array([[-1, 2], [-0.5, 6], [0, 10], [1, 18]]) #归一化 X_nor= (X - X.min(axis=0)) /(X.max(axis=0) - X.min(axis=0)) X_nor

在这里插入图片描述 逆转归一化:

#逆转归一化 X_returned= X_nor *(X.max(axis=0) - X.min(axis=0)) + X.min(axis=0) X_returned

在这里插入图片描述

2.标准化

当数据(x)按均值(μ)中心化后,再按标准差(σ)缩放,数据就会服从为均值为0,方差为1的正态分布(即标准正态分布),而这个过程,就叫做数据标准化(Standardization,又称Z-score normalization)在这里插入图片描述 导入库和定义数据

from sklearn.preprocessing import StandardScaler data = [[-1,2],[-0.5,6],[0,10],[1,18]]

进行数据标准化

scaler = StandardScaler()#实例化 scaler.fit(data) #fit,本质是生成均值和方差 scaler.mean_#查看均值的属性 scaler.var_#查看方差的属性 x_std = scaler.transform(data)#通过接口导出结果 x_std

在这里插入图片描述 查看均值和方差

x_std.mean()#导出的结果是一个数组,用mean()查看均值 x_std.std()#查看方差

一步实现标准化

scaler = StandardScaler()#实例化 scaler.fit_transform(data)#一步达成结果

在这里插入图片描述 逆转标准化

scaler.inverse_transform(x_std)#逆转标准化

在这里插入图片描述

标准化与归一化比较

大多数机器学习算法中,会选择StandardScaler来进行特征缩放,因为MinMaxScaler对异常值非常敏感。在PCA,聚类,逻辑回归,支持向量机,神经网络这些算法中StandardScaler往往是最好的选择。

MinMaxScaler在不涉及距离度量、梯度、协方差计算以及数据需要被压缩到特定区间时使用广泛,比如数字图像处理中量化像素强度时,都会使用MinMaxScaler将数据压缩于[0,1]区间之中。

建议先试试看StandardScaler,效果不好换MinMaxScaler。 在这里插入图片描述

3.缺失值填充

机器学习和数据挖掘中所使用的数据,永远不可能是完美的。很多特征,对于分析和建模来说意义非凡,但对于实际收集数据的人却不是如此,因此数据挖掘之中,常常会有重要的字段缺失值很多,但又不能舍弃字段的情况。因此,数据预处理中非常重要的一项就是处理缺失值。

导入数据

import pandas as pd data = pd.read_csv("../数据/Narrativedata.csv",index_col=0) #将第0列作为索引index_col=0 data.head()#查看数据前五行

在这里插入图片描述 查看数据情况:

data.info()

在这里插入图片描述 发现Age列右200多缺失值,Embarked列有两个缺失值。

填补age列

将数据装成二维

Age = data.loc[:,"Age"].values.reshape(-1,1)#sklearn种特征矩阵必须是二维 Age.shape#查看维度 Age[:20]#查看前二十行

在这里插入图片描述 使用,均值、中位数、0对数据进行填充 实例化

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)#使用ift_trankform一步完成调取结果 imp_median = imp_median.fit_transform(Age) imp_0 = imp_0.fit_transform(Age)

查看填充好的数据:

imp_mean[1:20,:]#查看用均值填充的前二十行 imp_0[1:20,:]#查看用0填充的前二十行 imp_median[1:20,:]#查看用中位数填充的前二十行

在这里插入图片描述 在这里使用中位数对原数据进行填充

data.loc[:,"Age"] = imp_median #用中位数对元数据填充 data.info()#查看数据情况

在这里插入图片描述 对Embarked列进行众数填充

Embarked = data.loc[:,"Embarked"].values.reshape(-1,1)#转换成二维 imp_mode = SimpleImputer(strategy="most_frequent")#使用众数实例化 data.loc[:,"Embarked"] = imp_mode.fit_transform(Embarked)#进行填补并赋值给元数据 data.info()#查看原数据

在这里插入图片描述 用Pandas和Numpy进行填补,效果也是一样的

导入数据:

import pandas as pd data1 = pd.read_csv("../数据/Narrativedata.csv",index_col=0) data1.head()

填补:

data1.loc[:,"Age"] = data1.loc[:,"Age"].fillna(data1.loc[:,"Age"].median()) #.fillna 在DataFrame里面直接进行填补

删除:

data1.dropna(axis=0,inplace=True) #.dropna(axis=0)删除所有有缺失值的行,.dropna(axis=1)删除所有有缺失值的列 #参数inplace,为True表示在原数据集上进行修改,为False表示生成一个复制对象,不修改原数据,默认False

在这里插入图片描述

4.处理分类型特征:编码与哑变量

在机器学习中,大多数算法,譬如逻辑回归,支持向量机SVM,k近邻算法等都只能够处理数值型数据,不能处理文字,在sklearn当中,除了专用来处理文字的算法,其他算法在fit的时候全部要求输入数组或矩阵,也不能够导入文字型数据(其实手写决策树和普斯贝叶斯可以处理文字,但sklearn中规定必须导入数值型)。然而在现实中,许多标签和特征在数据收集完毕的时候,都不是以数字来表现的。比如说,学历的取值可以是[“小学”,“初中”,“高中”,“大学”],付费方式可能包含[“支付宝”,“现金”,“微信”]等等。在这种情况下,为了让数据适应算法和库,我们必须将数据进行编码,即是说,将文字型数据转换为数值型。

标签专用,能够将分类转换为分类数值

导入库

from sklearn.preprocessing import LabelEncoder

导入数据

import pandas as pd data2 = pd.read_csv("../数据/Narrativedata.csv",index_col=0) data2.head()

在这里插入图片描述 提取数据,实例化

y = data2.iloc[:,-1] #要输入的是标签,不是特征矩阵,所以允许一维 le = LabelEncoder() #实例化 le = le.fit(y)#导入数据 label = le.transform(y)#接口调取结果 le.classes_ #查看标签种到底有多少类别 label

在这里插入图片描述 已经将[‘No’, ‘Unknown’, ‘Yes’]转换成了0,1,2.

也可以一步到位:

le.fit_transform(y) #也可以直接一步到位

逆转为原数据

le.inverse_transform(label)#逆转

在这里插入图片描述 将运行结果赋值到原数据

data2.iloc[:,-1] = label #让标签等于运行的结果 data2.head()

在这里插入图片描述 简单,快捷的方式:运行分类转换:

#下面这两行代码即可实现,分类转换 from sklearn.preprocessing import LabelEncoder data2.iloc[:,-1] = LabelEncoder().fit_transform(data.iloc[:,-1]) 特征专用,能够将分类特征转换为分类数值

导入库

from sklearn.preprocessing import OrdinalEncoder

获取数据

data3 = data.copy()#复制一份数据 data3.head()

在这里插入图片描述 查看列种包含的名称

OrdinalEncoder().fit(data3.iloc[:,1:-1]).categories_#查看中间列的名称,和classes_,功能一样

在这里插入图片描述 实例化,对数据直接进行转换

data3.iloc[:,1:-1] = OrdinalEncoder().fit_transform(data3.iloc[:,1:-1]) data3.head()

在这里插入图片描述 发现已经将”Sex“,” Embarked“两个列种的[‘female’, ‘male’]和[‘C’, ‘Q’, ‘S’]转换成了0,1和0,1,2

独热编码,创建哑变量

类别OrdinalEncoder可以用来处理有序变量,但对于名义变量,我们只有使用哑变量的方式来处理,才能够尽量 向算法传达最准确的信息: 在这里插入图片描述 这样的变化,让算法能够彻底领悟,原来三个取值是没有可计算性质的,是“有你就没有我”的不等概念。在我们的 数据中,性别和舱门,都是这样的名义变量。因此我们需要使用独热编码,将两个特征都转换为哑变量。

导入库和数据提取

from sklearn.preprocessing import OneHotEncoder x = data.iloc[:,1:-1]

实例化后转换数据,数组展示

OneHotEncoder(categories="auto").fit_transform(x).toarray()#装换成数组,可以显示结果

在这里插入图片描述 逆转数据

pd.DataFrame(enc.inverse_transform(result))#还原回原数据

在这里插入图片描述 查看返回 的稀疏矩阵名称

enc.get_feature_names()#返回稀疏矩阵名称,便于判别

在这里插入图片描述

合并数据

newdata = pd.concat([data,pd.DataFrame(result)],axis=1)#合并数据 newdata.head()

在这里插入图片描述 删除[“Sex”,“Embarked”]列,改变列名称

newdata.drop(["Sex","Embarked"],axis=1,inplace=True)#删除这两列 newdata.columns = ["Age","Survived",'x0_female','x0_male','x1_C','x1_Q','x1_S']#改变列名称 newdata.head()

在这里插入图片描述 相关引用库:

在这里插入图片描述

5.处理连续型特征:二值化与分段 二值化

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

将年龄二值化

获取数据

data4 = data.copy()

导入库

from sklearn.preprocessing import Binarizer

将年龄为30以下的化为0,30以上的化为1

x = data4.iloc[:,0].values.reshape(-1,1) #类为特征专用,所以不能使用一维数组 transformer = Binarizer(threshold=30).fit_transform(x)#将30以上的化为1,30以下的化为0 transformer

在这里插入图片描述 保存数据

data4.iloc[:,0] = transformer#将数据保存的原数据种 data4.head()

在这里插入图片描述

分箱

preprocessing.KBinsDiscretizer这是将连续型变量划分为分类变量的类,能够将连续型变量排序后按顺序分箱后编码。总共包含三个重要参数: 在这里插入图片描述 导入库,数据

from sklearn.preprocessing import KBinsDiscretizer x = data.iloc[:,0].values.reshape(-1,1)

采用ordinal方式编码

est = KBinsDiscretizer(n_bins=3,encode="ordinal",strategy="uniform") est.fit_transform(x)

查看转换后分的箱

set(est.fit_transform(x).ravel()) #查看转换后分的箱:变成了一列种的三箱 #ravel()降维函数

在这里插入图片描述

采用onehot方式编码分箱

est = KBinsDiscretizer(n_bins=3,encode = "onehot",strategy="uniform") est.fit_transform(x).toarray() #查看转换后分的箱,变成了哑变量

在这里插入图片描述



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有