Press "Enter" to skip to content

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

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

 

 

文末含代码下载链接

 

有粉丝问道,是不是写一篇关于数据预处理的文章,小编立马就答应了他的请求,那幺今天我们就来讲讲数据预处理过程当中的一些要点与难点。
我们大致会提到数据预处理中的

 

加载数据

 

处理缺失值如何处理

 

处理离散型数据该如何处理

 

数据的标准化

 

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

 

去掉重复值

 

加载数据

 

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

 

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_green
color_blue
color_white

 

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
blue
green
white
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()

 

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

 

代码下载

 

https://github.com/hidadeng/DaDengAndHisPython/blob/master/4000字归纳总结PandasSklearn数据预处理.ipynb

 

 

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注