查看原文
其他

长文详解Python数据预处理,快收藏!

数据应用学院 大数据应用 2023-08-17

今日份知识你摄入了么?

在本文中,我们将学习一些重要的数据预处理方法。对数据进行可视化处理,并把数据转换为合适的格式,是非常重要的一步,这样估算器(算法)才能够很好到拟合,从而达到良好的准确度。

数据预处理方法图



本文会涉及到的主题有:


  1. 标准化(Standardization)

  2. 稀疏数据(sparse data)和离群值(outliers)的Scaling

  3. 数据标准化(Normalization)

  4. 分类编码(Categorical Encoding)

  5. 缺失值处理(Imputation)


标准化(Standardization)


标准化是处理数据点的平均值和标准差的过程。作为原始数据,值可能从非常低到非常高的都有。因此,为了避免模型中的性能低下,我们选择使用标准化。这表示,平均值会变为零,而标准差会变为一个单位。

标准化的公式如下所示:


z = (feature_value — mean)/standard deviation


典型均匀分布图的示例


当我们使用一个算法来配合我们的数据时,它会假定数据都居中,并且所有特征的方差顺序是相同的,否则估算器将无法做到正确预测。


Sklearn 这个library里,有一个在预处理类时用StandardScaler来标准化数据集的方法。

我们要用到import指令在python中使用此功能。


#Before modeling our estimator we should always some preprocessing scaling.在对估算器建模之前,我们应始终做一些Scaling的预处理。# Feature Scalingfrom sklearn.preprocessing import StandardScalersc = StandardScaler()X_train = sc.fit_transform(X_train)X_test = sc.transform(X_test)


稀疏数据(sparse data)和离群值(outliers)的Scaling


稀疏数据的Scaling:


数据Scaling是把特征值转换到“ 0” 到 “ 1”的某个范围内的一种方法。有两种方法可以做到这一点,它们是MinMaxScaler和MaxAbsScaler。


import numpy as npX_train = np.array([[ 1., 0.,  2.], [ 2.,  0.,  -1.], [ 0.,  2.,                                                             -1.]])from sklearn.preprocessing import MinMaxScalermin_max_scaler = MinMaxScaler() X_train_minmax = min_max_scaler.fit_transform(X_train) print(X_train_minmax) #output:array([[0.5, 0. , 1. ],       [1. , 0. , 0. ],       [0. , 1. , 0. ]])

python示例


你可以看到,输入值会保持在“ 0” 到 “ 1”之间。


对稀疏数据中心做Scaling可能不是一个好方法,因为它可能会更改数据的结构。因此,最好对在不同比例上都有值的原始数据进行Scaling。


离群值的Scaling:


当原始数据中有很多离群值时,用平均值和方差做Scaling就不能很好地处理这些数据。因此,由于离群值受到平均值和方差的影响,我们必须使用更稳健的方法,如四分位距法(IQR)。IQR的范围落在25%到75%之间,其中除去了中位数,并在分位数范围做Scaling。


RobustScaler需要一些参数来执行Scaling。


  • 第一个参数是with_centering,如果为true,它会在Scaling前将数据居中。

  • 第二个参数with_scaling,如果为true,它会在分位数范围内Scale数据。


from sklearn.preprocessing import RobustScalerX = [[ 1., 0.,  2.], [ 2.,  0.,  -1.], [ 0.,  2., -1.]]transformer = RobustScaler().fit(X)
transformer.transform(X)
#output:array([[ 0.,  0.,  2.],       [ 1.,  0.,  0.],       [-1.,  2.,  0.]])

python示例


数据标准化(Normalization)


Scaling过程,是将数据值规范化为一个单位标准。MinMaxScaler是标准化的一个例子。当我们成对地处理二次形式时,这个过程很有用,它可以基于内核(kernel-based)或者基于向量点积(dot product-based)


基于向量空间模型vector space model(即与文本数据样本相关的向量)来简化数据过滤也很有用。


有两种类型的标准化,如下所示:


  • 标准化:它将输入的向量scale为一个单位标准。标准参数用来规范化所有的非零值。它使用三个参数:L1,L2和max,其中L2是默认标准。

  • 标准器:它也执行和上述相同的操作,但是在此过程中,配合数据的方法是可选的。


from sklearn.preprocessing import normalizeX = [[ 1., 0., 2.], [ 2., 0., -1.], [ 0., 2., -1.]]X_normalized = normalize(X, norm=’l2')
print(X_normalized)
#output:array([[ 0.4472136 ,  0.        ,  0.89442719],       [ 0.89442719,  0.        , -0.4472136 ],       [ 0.        ,  0.89442719, -0.4472136 ]])

python示例


from sklearn.preprocessing import NormalizerX = [[ 1., 0., 2.], [ 2., 0., -1.], [ 0., 2., -1.]] normalizer = preprocessing.Normalizer().fit(X) normalizer.transform(X) #output:array([[ 0.4472136 ,  0.        ,  0.89442719],       [ 0.89442719,  0.        , -0.4472136 ],       [ 0.        ,  0.89442719, -0.4472136 ]])

标准器示例


标准器在初始阶段时,在数据处理的管道中很有用。


当我们使用稀疏输入(sparse input)时,请一定把它转换为非CSR格式,来避免它复制多个内存,这一点很重要。CSR是压缩的稀疏行位(Sparse Rows),这个功能在scipy.sparse.csr_matrix中。


分类编码(Categorical Encoding)


我们得到一些原始数据时,可能会遇到某些列是不连续的,而是类别的二进制或存在多个类别的情况。因此,为了使它们转为整数,我们要使用到编码的方法。以下是一些编码方法:


  • 虚拟变量(get dummies):这个方法是用来得到一个区间在0和1之间的新的功能列,在pandas’library的帮助下对类别进行了编码。

  • 标签编码器(Label Encoder):在sklearn库中,将二进制类别编码为数值。

  • 独热编码(One Hot Encoder):sklearn库提供了另一种功能,可以将类别转换为数值区间为0和1的新功能列。

  • 散列(Hashing):在高维情况下,它比独热编码更有用。当功能中的基数较高时,使用这个方法。


还有许多其他编码方法,例如平均数编码(mean encoding)Helmert编码(Helmert encoding)序数编码(ordinal encoding)概率比编码(probability ratio encoding)等等。


df1=pd.get_dummies(df['State'],drop_first=True)

python示例


虚拟变量编码


缺失值处理(Imputation)


当原始数据存在一些缺失值时,把缺失值转换为数字值的这个过程,被称为Imputation。


创建一个随机的数据结构:


# import the pandas libraryimport pandas as pdimport numpy as np
df = pd.DataFrame(np.random.randn(4, 3), index=['a', 'c', 'e','h'],columns=['First', 'Second', 'Three'])
df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print (df)

含有缺失值的数据结构


现在,用0来代替缺失值:

print ("NaN replaced with '0':")print (df.fillna(0))

被0代替的缺失值


用平均值来代替缺失值:

from sklearn.impute import SimpleImputerimp = SimpleImputer(missing_values=np.nan, strategy='mean')


sklearn提供了简单的缺失处理器来查找到NAN值,并用平均值替代。


我们可以在管道中使用缺失处理器,来使估算器达到更好的效果。


总结


数据的预处理是我们需要执行的重要步骤,这可以让我的算法对数据进行预估时更加可靠。


希望你喜欢这篇文章。

原文作者:Amit Chauhan

翻译作者:Jiawei Tong

美工编辑:过儿

校对审稿:Dongdong

原文链接:https://pub.towardsai.net/data-preprocessing-concepts-with-python-b93c63f14bb6 


本周公开课预告

往期精彩回顾

用合成数据创建机器学习欺诈模型

8种防止过拟合的技术

什么是特征选择?为什么它很重要?

数据团队入职培训白皮书

大部分数据科学课程没有教给你的内容





点「在看」的人都变好看了哦

点击“阅读原文”查看数据应用学院核心课程

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存