【Python】4000字归纳总结 Pandas+Sklearn 带你做数据预处理

机器学习初学者

共 4828字,需浏览 10分钟

 ·

2021-11-09 20:30

就在前天的一篇原创文章中,
7000字 23张图,Pandas一键生成炫酷的动态交互式图表
有粉丝问道,是不是写一篇关于数据预处理的文章,小编立马就答应了他的请求,那么今天我们就来讲讲数据预处理过程当中的一些要点与难点。我们大致会提到数据预处理中的
  • 加载数据
  • 处理缺失值如何处理
  • 处理离散型数据该如何处理
  • 数据的标准化
  • 将数据集划分成训练集与测试集
  • 去掉重复值

加载数据

我们导入必要的库并且加载数据

import pandas as pd
df = pd.read_csv("data.csv")

在进行数据分析前,可以查看一下数据的总体情况,从宏观上了解数据

data.head() #显示前五行数据
data.tail() #显示末尾五行数据
data.info() #查看各字段的信息
data.shape #查看数据集有几行几列,data.shape[0]是行数,data.shape[1]是列数
data.describe() #查看数据的大体情况,均值,最值,分位数值...
data.columns.tolist()   #得到列名的list

处理缺失值

缺失值一直都是数据预处理当中比较常见的一个问题,而在处理类似的问题的时候,方式方法也是多种多样的,我们一一来介绍,
data = [['小明',25,55],['小红',28,60],['小王',26]]
df = pd.DataFrame(data=data,columns=['Name','Age','Weight'])

output

  Name  Age  Weight
0   小明   25    55.0
1   小红   28    60.0
2   小王   26     NaN

针对上面的数据集,我们通过pandas中的方法看一下缺失值的情况

df.isnull()

output

    Name    Age  Weight
0  False  False   False
1  False  False   False
2  False  False    True

另外我们也可以这么来做,检测每一列空值的数量

df.isnull().sum()

output

Name      0
Age       0
Weight    1
dtype: int64

而在面对缺失值的时候,我们一方面可以将其去除

df.dropna()

output

  Name  Age  Weight
0   小明   25    55.0
1   小红   28    60.0

当然我们也可以对缺失值进行填充,例如用平均值来填充

df.fillna(df.mean())

output

  Name  Age  Weight
0   小明   25    55.0
1   小红   28    60.0
2   小王   26    57.5

除了pandas当中的方法之外,我们也可以使用sklearn库当中的一些函数方法,例如

from sklearn.impute import SimpleImputer
imputer = SimpleImputer(missing_values=np.nan, strategy='mean')
imputer = imputer.fit(df[['Weight']])
df['Weight'] = imputer.transform(df[['Weight']])
最后返回的结果也和上面的fillna()方法返回的结果一致,我们用平均值来代码空值,那么同样道理我们也可以用中位数众数等统计值来进行替换,这里就不做多说

处理离散型数据

另外当数据集当中出现离散型数据的时候,我们也要进行相应的处理,毕竟在后面的建模过程当中,机器学习的模型需要的是连续型的数据。
离散型数据也分为两种,一种是有序的离散变量,就比方说是衣服的尺码,有M码的、也有L码的、也还有与之更大的尺码,另外一种则是无序的,例如衣服的颜色,颜色之间没有大小之分,因此在编码的时候也应该另外处理。
df_cat = pd.DataFrame(data = 
                     [['green','M',10.1,'class1'],
                      ['blue','L',20.1,'class2'],
                      ['white','M',30.1,'class1']], )
df_cat.columns = ['color','size','price','classlabel']

output

   color size  price classlabel
0  green    M   10.1     class1
1   blue    L   20.1     class2
2  white    M   30.1     class1

对于有序的离散型变量,我们可以使用map()函数

size_mapping = {'M':1,'L':2}
df_cat['size'] = df_cat['size'].map(size_mapping)
df_cat['size']

output

0    1
1    2
2    1
Name: size, dtype: int64

另外我们也可以使用sklearn库中的LabelEncoder()方法来处理

from sklearn.preprocessing import LabelEncoder
class_le = LabelEncoder()
df_cat['size'] = class_le.fit_transform(df_cat['size'].values)
而对于无序的离散型变量,我们可以采用独热编码,例如对color这一列进行编码过之后会有color_greencolor_blue以及color_white三个特征,特征值为0或者1
pd.get_dummies(df_cat['color'], prefix = "color")

output

   color_blue  color_green  color_white
0           0            1            0
1           1            0            0
2           0            0            1

然后我们将此并入到源数据当中去

df_cat[["size""price"]].join(dummies)

output

   size  price  color_blue  color_green  color_white
0     1   10.1           0            1            0
1     2   20.1           1            0            0
2     1   30.1           0            0            1
但是考虑到后面搭建模型的时候,变量与变量之间应该保持独立,而不应该是存在依赖的关系,对于color这一列中存在三种颜色,分别是bluegreen以及white,当前两类取值都为0的时候,color只可能是white

所以将get_dummies()方法中的drop_first默认值为False改为True

dummies = pd.get_dummies(df_cat['color'], prefix = "color", drop_first=True)
df_cat[["size""price"]].join(dummies)

数据的标准化

由于不同的变量,它们往往存在不同的单位以及不同的取值范围,有时候取值范围的差异较大会对机器学习的模型带来很多不必要的麻烦。因此为了最后预测结果的可靠性,我们需要对数据进行标准化,对数据按比例进行缩放,使之落入一个小的特定区间。而标准化算法有
  • z-score 标准化
这种方法根据原始数据的均值和标准差进行数据的标准化,经过处理的数据符合正态分布,即均值为0,标准差为1,计算公式为: = ,当然sklearn库当中的代码则是
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)
  • 线性归一化

它的计算公式为: = 当然sklearn库当中也有相对应的代码

from sklearn.preprocessing import MinMaxScaler()
min_max_scaler = MinMaxScaler()
X_train_minmax = min_max_scaler.fit_transform(X_train)
print(X_train_minmax)

训练集中的数据经过转化,取值范围都集中在[0,1]之间

  • MaxAbsScaler()方法
MaxAbsScaler()方法和上述的线性归一化效果相类似,训练集中的数据经过转化,取值范围在[-1,1]之间
max_abs_scaler = preprocessing.MaxAbsScaler()
X_train_maxabs = max_abs_scaler.fit_transform(X_train)
X_test_maxabs = max_abs_scaler.transform(X_test)
  • RobustScaler()方法
要是当数据集当中存在很多的极值的时候,利用平均值和标准差来进行数据的标准化效果可能并不理想,毕竟极值会影响到平均值和标准差的计算,这个时候我们就需要用到RobustScaler()方法,
from sklearn.preprocessing import RobustScaler
transformer = RobustScaler().fit(X)
transformer.transform(X)

将数据集划分成训练集和测试集

在建模之前,我们需要将数据集分成训练集和测试集,我们在训练集上面建立模型,训练与优化模型,然后再将模型放到测试集上面,评估一下模型的性能以及优化的效果,在sklearn库中也有相对应的方法
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2,random_state= 1)

上面的变量y具体指的是被预测的因变量,而x则是在预测中使用的自变量

去除重复值

pandas当中也有对应的方法来去除掉重复值

df.drop_duplicates()

另外小编之前也写过一篇数据预处理的文章,大家有兴趣的可以去看一下

干货分享 | 推荐一个更高效的数据清洗方法,建议收藏

往期精彩回顾




站qq群554839127,加入微信群请扫码:
浏览 24
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报