当前位置:   article > 正文

python机器学习之数据的预处理(五种方式数据处理案例详解)_机器学习对数据集进行分析和预处理

机器学习对数据集进行分析和预处理

数据的预处理

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

到入文件时可以直接复制地址然后用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)


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

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


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

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


  • 1
  • 2
  • 3
  • 4

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

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


  • 1
  • 2
  • 3

在这里插入图片描述
将范围设置为[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


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

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


  • 1
  • 2
  • 3

使用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


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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

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


  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

2.标准化

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

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


  • 1
  • 2
  • 3
  • 4

进行数据标准化

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


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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

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


  • 1
  • 2
  • 3
  • 4

一步实现标准化

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



  • 1
  • 2
  • 3
  • 4
  • 5

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

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


  • 1
  • 2
  • 3

在这里插入图片描述

标准化与归一化比较

大多数机器学习算法中,会选择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()#查看数据前五行


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

data.info()


  • 1
  • 2
  • 3

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

填补age列

将数据装成二维

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


  • 1
  • 2
  • 3
  • 4
  • 5

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

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


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

得到结果

imp_mean =imp_mean.fit_transform(Age)#使用ift_trankform一步完成调取结果
imp_median = imp_median.fit_transform(Age)
imp_0 = imp_0.fit_transform(Age)


  • 1
  • 2
  • 3
  • 4
  • 5

查看填充好的数据:

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


  • 1
  • 2
  • 3
  • 4
  • 5

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

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


  • 1
  • 2
  • 3
  • 4

在这里插入图片描述
对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()#查看原数据


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

导入数据:

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

data1.head()


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

填补:


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



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

删除:

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


  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

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

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

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

导入库

from sklearn.preprocessing import LabelEncoder


  • 1
  • 2
  • 3

导入数据

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

data2.head()


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

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



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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

也可以一步到位:

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


  • 1
  • 2
  • 3

逆转为原数据

le.inverse_transform(label)#逆转


  • 1
  • 2
  • 3

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

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


  • 1
  • 2
  • 3
  • 4

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

#下面这两行代码即可实现,分类转换
from sklearn.preprocessing import LabelEncoder
data2.iloc[:,-1] = LabelEncoder().fit_transform(data.iloc[:,-1])


  • 1
  • 2
  • 3
  • 4
  • 5
特征专用,能够将分类特征转换为分类数值

导入库

from sklearn.preprocessing import OrdinalEncoder


  • 1
  • 2
  • 3

获取数据

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


  • 1
  • 2
  • 3
  • 4

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

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


  • 1
  • 2
  • 3

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

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


  • 1
  • 2
  • 3
  • 4

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

独热编码,创建哑变量

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

导入库和数据提取

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


  • 1
  • 2
  • 3
  • 4

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

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


  • 1
  • 2
  • 3

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

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


  • 1
  • 2
  • 3

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

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


  • 1
  • 2
  • 3

在这里插入图片描述

合并数据

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

newdata.head()


  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述
删除[“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()


  • 1
  • 2
  • 3
  • 4
  • 5

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

在这里插入图片描述

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

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

将年龄二值化

获取数据

data4 = data.copy()


  • 1
  • 2
  • 3

导入库

from sklearn.preprocessing import Binarizer


  • 1
  • 2
  • 3

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

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


  • 1
  • 2
  • 3
  • 4
  • 5

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

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


  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

分箱

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

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


  • 1
  • 2
  • 3
  • 4

采用ordinal方式编码

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


  • 1
  • 2
  • 3
  • 4

查看转换后分的箱

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


  • 1
  • 2
  • 3

在这里插入图片描述

采用onehot方式编码分箱

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


  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

如果大家对Python感兴趣,这套python学习资料一定对你有用

对于0基础小白入门:

如果你是零基础小白,想快速入门Python是可以考虑的。

一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、机器学习、Python量化交易等习教程。带你从零基础系统性的学好Python!

零基础Python学习资源介绍

① Python所有方向的学习路线图,清楚各个方向要学什么东西

② 600多节Python课程视频,涵盖必备基础、爬虫和数据分析

③ 100多个Python实战案例,含50个超大型项目详解,学习不再是只会理论

④ 20款主流手游迫解 爬虫手游逆行迫解教程包

⑤ 爬虫与反爬虫攻防教程包,含15个大型网站迫解

⑥ 爬虫APP逆向实战教程包,含45项绝密技术详解

⑦ 超300本Python电子好书,从入门到高阶应有尽有

⑧ 华为出品独家Python漫画教程,手机也能学习

⑨ 历年互联网企业Python面试真题,复习时非常方便

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/798162

推荐阅读
相关标签