赞
踩
目录
无论是在数据挖掘还是机器学习当中,数据的好坏很大程度决定了最后训练出来的模型的预测和泛化能力的好坏。为了训练出质量更高的模型,通常我们都需要在训练之前对我们的数据集进行预处理。在文本领域主要使用pandas、numpy对数据进行预处理,在图像领域则使用opencv、numpy来处理,图像的预处理可以详见我之前的博客,今天我们将使用pandas来对文本数据进行预处理。
首先我们需要先安装pandas库、sklearn库和一些依赖包(xlrd依赖包读取excel表时要用,这里需要安装1.2版本):
因为使用pip命令安装软件包有时候会失败,所以建议小白按照下面方法安装
以安装pandas为例,用快捷键ctrl+alt+s打开pycharm的设置,在项目中打开编辑器,如下图
然后在点击+键,搜索pandas进行安装
安装完成后可以在编辑器的包中看到软件包的名字和版本:
结束
然后我们需要一个数据用来实践,由于pandas主要是做文本数据的处理,所以,我用excel表做了一个数据组,如下图所示:
需要说明的是,一般将数据中缺失值称为‘NaN’(Not a Number)
如上图中空缺的值即为该数据中的NaN,下面我们将会通过一些实践操作来对pandas中做数据预处理的一些函数进行学习。
1.缺失值的查找
可用的pandas函数:
方法 | 作用 |
data.info() | 查看数据每一行缺失情况 |
data.isnull() | 缺失处值为true |
data.notnull() | 缺失处值为false |
实例代码1(查看所有数据信息):
- import pandas as pd
- # 读取数据
- data=pd.read_excel("./data/example1.xlsx")
- # 查看数据信息
- data.info()
代码运行结果:
实例代码2(查看缺失值位置):
- import pandas as pd
- # 读取数据
- data=pd.read_excel("./data/example1.xlsx")
- # 查看缺失值位置
- print(data.isnull())
运行结果:
(true的位置即为缺失值位置)
2.缺失值的删除
pandas可用函数
方法 | 作用 |
DataFrame.dropna() | 删除含有缺失值的行或列 |
实例代码1(不填参数,默认删除含有缺失值的整行):
- import pandas as pd
- # 读取数据
- data=pd.read_excel("./data/example1.xlsx")
- # 查看数据信息
- print("原数据:")
- print(data)
- print("处理后数据:")
- print(data.dropna())
运行结果:
实例代码2(只删除性别一列中含有缺失值数据所在的行):
- import pandas as pd
- # 读取数据
- data=pd.read_excel("./data/example1.xlsx")
- # 查看数据信息
- print("原数据:")
- print(data)
- print("处理后数据:")
- print(data.dropna(subset=['性别']))
代码运行结果:
实例3(删除数据中的空白行):
这里我们需要先在原来的数据中加入一行空白行:
代码:
- data=pd.read_excel("./data/example1.xlsx")
- # 查看数据信息
- print("原数据:")
- print(data)
- print("处理后数据:")
- print(data.dropna(how='all'))
运行结果:
实例代码4(删除列/行):
dropna中的参数axis可用于决定删除维度,‘0’为删除行,‘1’为删除列
以下代码用于删除存在空缺值的列:
- import pandas as pd
- # 读取数据
- data=pd.read_excel("./data/example1.xlsx")
- # 查看数据信息
- print("原数据:")
- print(data)
- print("处理后数据:")
- print(data.dropna(axis=1))
运行结果:
3.缺失值的填充
方法 | 作用 |
DataFrame.fillna() | 用于缺失值的填充(只需在参数中写需要填充的值即可) |
需要说明的是,填充方法有定值填充、统计量填充、插值法填充、模型填充。需要根据模型训练需要以及数据集的实际情况进行选择。(eg.如果是做冬日天气的数据处理,如果温度属性缺失值填充值为-1,则无辨识度,可能与收集的实际数据混淆,导致模型质量降低。)
实例代码1(将缺失值用“1”填充):
- import pandas as pd
- # 读取数据
- data=pd.read_excel("./data/example1.xlsx")
- # 查看数据信息
- print("原数据:")
- print(data)
- print("处理后数据:")
- print(data.fillna(1))
运行结果:
实例代码2(按照不同的列填充不同的值):
- import pandas as pd
- # 读取数据
- data=pd.read_excel("./data/example1.xlsx")
- # 查看数据信息
- print("原数据:")
- print(data)
- print("处理后数据:")
- print(data.fillna({'性别':'男','年龄':'18'}))
运行结果:
对异常值的处理有:
1.直接丢弃
2.通过标记是否为异常值作为数据的一个新特征(eg.在宫颈癌筛查的AI模型中将病变异常值标记为新的癌变特征)
3.对有异常值的特征进行转换,降低异常值的影像
实例代码1(直接舍弃异常值):
- import pandas as pd
- # 创建数据
- house=pd.DataFrame()
- house['price']=[5334433,392333,293222,43220302]
- house['bedroom']=[2,3.5,2,116]
- house['Square_feet']=[1500,2500,1500,48000]
- print("原房屋数据:")
- print(house)
- # 筛选观察值,去掉异常值(将属性为‘bedroom’中小于20的数据直接丢弃)
- print("舍弃异常值后房屋数据:")
- print(house[house['bedroom']<20])
运行结果:
实例代码2(用布尔类型来标注异常值):
(这里需要用到numpy库)
- import pandas as pd
- import numpy as np
- # 创建数据
- house=pd.DataFrame()
- house['price']=[5334433,392333,293222,43220302]
- house['bedroom']=[2,3.5,2,116]
- house['Square_feet']=[1500,2500,1500,48000]
- print("原房屋数据:")
- print(house)
- # 筛选观察值,去掉异常值(将属性为‘bedroom’中小于20的数据直接丢弃)
- print("用布尔类型标记异常值后房屋数据:")
- house['Outlier']=np.where(house['bedroom']<20,0,1)
- print(house)
运行结果:(将卧室平方大于20的数据用布尔类型标记为异常值)
实例代码3(对有异常值的特征进行转换):
- import pandas as pd
- import numpy as np
- # 创建数据
- house=pd.DataFrame()
- house['price']=[5334433,392333,293222,43220302]
- house['bedroom']=[2,3.5,2,116]
- house['Square_feet']=[1500,2500,1500,48000]
- print("原房屋数据:")
- print(house)
- # 筛选观察值,去掉异常值(将属性为‘bedroom’中小于20的数据直接丢弃)
- print("对有异常值的特征进行转换后房屋数据:")
- house['Log_of_Square_feet']=[np.log(x) for x in house['Square_feet']]
- print(house)
运行结果:
(可以看到在处理后,我们将原本的平方英尺数用np.log()方法转换为平方英尺对数)
1.Z-score标准化
数据标准化最常用的方法是将数据按照属性减去其均值,并除以该属性的标准差,该方法称为Z-score标准化。
需要用到sklearn库中preprocessing模块下的scale函数,如下为该函数的参数使用方法:
参数名称 | 使用方法 |
X | {array-like,sparse,matrix},需要进行变换的数据矩阵 |
axis=0 | 指定分别按照列(0)还是整个样本(1)计算均数、标准差并进行计算 |
with_mean=True | 是否中心化数据(移除均数) |
with_std=True | 是否归一化标准差(除以标准差) |
copy=True | 是否生成副本而不是替换原数据 |
实例代码1(将矩阵转换为多维数组):
- from sklearn.preprocessing import scale
- import numpy as np
- # 创建矩阵
- X=np.array([[1.,-1.,2.],[2.,0.,0.],[0.,1.,-1.]])
- print("原矩阵:")
- print(X)
- # 将矩阵转换为多维数组
- X_scaled=scale(X)
- print("转换后的多维数组:")
- print(X_scaled)
运行结果:
实例代码2(波士顿房价数据处理):
波士顿房价数据是sklearn库中自带的数据集,只需要从sklearn中引入就可用。
- from sklearn.preprocessing import scale
- import pandas as pd
- # 从sklearn库中导入波士顿房价数据集
- from sklearn import datasets
- boston=datasets.load_boston()
- # 将数据集转换为数据框格式
- bostondf=pd.DataFrame(boston.data,columns=boston.feature_names)
- print("波士顿房价数据集(前5行):")
- print(bostondf.head())
- # 对数据进行标准化处理
- bostondf_scale=scale(bostondf)
- print("标准化后的波士顿房价数据集(前5行):")
- print(bostondf_scale)
运行结果:
2.将特征变量缩放到指定范围
特征缩放也是数据标准化的一种方法,可以用sklearn库中的preprocessing模块下的MinMaxScaler函数来实现。
min-max缩放利用特征x的最小值和最大值,将所有的数据都缩放到范围[0,1]中。
实例代码(特征缩放):
- from sklearn import preprocessing
- import numpy as np
- # 创建数据
- x=np.array([[-1000.2,100.2],[-200.2,150.2],[500.4,100.2],[700.2,80.2]])
- # 设置缩放范围feature_range为0~1
- minmax_scale=preprocessing.MinMaxScaler(feature_range=(0,1))
- # 设置缩放特征的值
- scaled_feature=minmax_scale.fit_transform(x)
- # 查看缩放后的特征变量
- print("缩放后的特征变量:")
- print(scaled_feature)
运行结果:
3.考虑异常值的标准化
上面的数据标准化处理,默认数据无异常值或者服从正态分布,但实际获得的数据大多具有异常值,这种情况下我们使用中位数或四分位数间距进行缩放会更加有效。
使用sklearn中的提供的RobustScaler方法就可以是实现这种考虑异常值的缩放。
实例代码(考虑含有异常值的标准化):
- from sklearn import preprocessing
- import numpy as np
- # 创建数据
- x=np.array([[1000],[200.4],[145.5],[314.7],[234.4]])
- # 创建缩放器
- robust_scaler=preprocessing.RobustScaler()
- # 转换特征
- robust_scaler.fit_transform(x)
- # 查看转换后的特征变量
- print("原特征变量:")
- print(x)
- print("缩放后的特征变量:")
- print(robust_scaler.fit_transform(x))
运行结果:
正则化主要用于避免后期训练后的模型过拟合的产生,减少误差。正则化其实也是一种缩放,但不同于前面标准化中的缩放(即将数据缩放到一定范围),正则化的缩放是对每一个特征进行缩放,使其具有一致性的范数(总长度为1)
使用sklearn.preprocessing中的Normalizer函数,可以对数据进行正则化(Normalizer提供的范数选项,默认是欧几里得范数,即L2范数)
实例代码(分别使用L1和L2范数对数据进行正则化):
- from sklearn.preprocessing import Normalizer
- import numpy as np
- # 创建数据
- x=np.array([[0.5,0.5],[1.1,3.4],[1.63,31.4],[10.9,3.4]])
- print("原特征变量:")
- print(x)
- # 创建L1范数归一化器
- normalizer1=Normalizer(norm='l1')
- # 创建L2范数归一化器
- normalizer2=Normalizer(norm='l2')
- # 转换特征值
- print("L1范数正则化后的数据:")
- print(normalizer1.fit_transform(x))
- print("L2范数正则化后的数据:")
- print(normalizer2.fit_transform(x))
运行结果:
数据预处理是机器学习和数据挖掘中非常重要的一个步骤,对原始数据进行相应的处理,可以为后续挖掘建模提供良好的数据基础。在后续的数据挖掘的学习中,我将会使用这些数据预处理的技术对具体的数据集进行处理,最后进行训练。
创作不易,如果这篇博客对您有帮助,希望各位大佬能给我个赞,感谢(泪崩)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。