python机器学习之数据的预处理(五种方式数据处理案例详解)
① Python所有方向的学习路线图,清楚各个方向要学什么东西② 600多节Python课程视频,涵盖必备基础、爬虫和数据分析③ 100多个Python实战案例,含50个超大型项目详解,学习不再是只会理论④ 20款主流手游迫解 爬虫手游逆行迫解教程包⑤ 爬虫与反爬虫攻防教程包,含15个大型网站迫解⑥ 爬虫APP逆向实战教程包,含45项绝密技术详解⑦ 超300本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)
进行归一化处理
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() #查看转换后分的箱,变成了哑变量
如果大家对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面试真题,复习时非常方便
👉Python学习路线汇总👈
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取哈)
👉Python必备开发工具👈
温馨提示:篇幅有限,已打包文件夹,获取方式在:文末
👉Python学习视频600合集👈
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
👉实战案例👈
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
👉100道Python练习题👈
检查学习结果。
👉面试刷题👈
资料领取
这份完整版的Python全套学习资料已经上传网盘,朋友们如果需要可以点击下方微信卡片免费领取 ↓↓↓【保证100%免费】
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)