精华内容
下载资源
问答
  • 数据预处理的方法有哪些

    千次阅读 2020-08-12 14:02:54
    数据处理的工作时间占整个数据分析项目的70%以上,因此,数据的质量直接决定了分析模型的准确...简单来说,就是把数据里面哪些缺胳膊腿的数据问题的数据给处理掉。总的来讲,数据清洗是一项繁重的任务,需要根据...

      数据处理的工作时间占整个数据分析项目的70%以上,因此,数据的质量直接决定了分析模型的准确性。那么,数据预处理的方法是什么呢?例如数据清理、数据集成、数据规范、数据转换等,其中最常用的是数据清理和数据集成,下面中琛魔方将来详细介绍一下这2种方法。

    数据预处理的方法有哪些

     

      数据预处理的方法

     

      1、数据清洗

     

      数据清洗是通过填补缺失值,平滑或删除离群点,纠正数据的不一致来达到清洗的目的。简单来说,就是把数据里面哪些缺胳膊腿的数据、有问题的数据给处理掉。总的来讲,数据清洗是一项繁重的任务,需要根据数据的准确性、完整性、一致性、时效性、可信性和解释性来考察数据,从而得到标准的、干净的、连续的数据。

     

      (1)缺失值处理

     

      实际获取信息和数据的过程中,会存在各类的原因导致数据丢失和空缺。针对这些缺失值,会基于变量的分布特性和变量的重要性采用不同的方法。若变量的缺失率较高(大于80%),覆盖率较低,且重要性较低,可以直接将变量删除,这种方法被称为删除变量;若缺失率较低(小于95%)且重要性较低,则根据数据分布的情况用基本统计量填充(最大值、最小值、均值、中位数、众数)进行填充,这种方法被称为缺失值填充。对于缺失的数据,一般根据缺失率来决定“删”还是“补”。

     

      (2)离群点处理

     

      离群点(异常值)是数据分布的常态,处于特定分布区域或范围之外的数据通常被定义为异常或噪声。我们常用的方法是删除离群点。

     

      (3)不一致数据处理

     

      实际数据生产过程中,由于一些人为因素或者其他原因,记录的数据可能存在不一致的情况,需要对这些不一致数据在分析前进行清理。例如,数据输入时的错误可通过和原始记录对比进行更正,知识工程工具也可以用来检测违反规则的数据。

     

      2、数据集成

     

      随着大数据的出现,我们的数据源越来越多,数据分析任务多半涉及将多个数据源数据进行合并。数据集成是指将多个数据源中的数据结合、进行一致存放的数据存储,这些源可能包括多个数据库或数据文件。在数据集成的过程中,会遇到一些问题,比如表述不一致,数据冗余等,针对不同的问题,下面简单介绍一下该如何处理。

     

      (1)实体识别问题

     

      在匹配来自多个不同信息源的现实世界实体时,如果两个不同数据库中的不同字段名指向同一实体,数据分析者或计算机需要把两个字段名改为一致,避免模式集成时产生的错误。

     

      (2)冗余问题

     

      冗余是在数据集成中常见的一个问题,如果一个属性能由另一个或另一组属性“导出”,则此属性可能是冗余的。

     

      (3)数据值的冲突和处理

     

      不同数据源,在统一合并时,需要保持规范化,如果遇到有重复的,要去重。

     

      在实践中,我们得到的数据可能包含大量的缺失值、异常值等,这对数据分析是非常不利的。此时,我们需要对脏数据进行预处理,以获得标准、干净和连续的数据,这些数据可以用于数据分析、数据挖掘等。

    展开全文
  • 有哪些标准化和归一化工具和方法?在多指标评价体系中,由于各评价指标性质不同,通常具有不同量纲和数量级。当各指标间水平相差很大时,如果直接用原始指标值进行分析,就会突出数值较高指标在综合分析中...

    c73cabb913dfa63759caf26f3a7e827e.png

    详解数据标准化及归一化含义、区别、实战时常用方法及工具,哪些模型需要用到数据标准化及归一化。

    数据预处理时才发现不清楚是否需要做数据标准化及归一化?也不清楚标准化及归一化标准化及归一化区别在哪?有哪些标准化和归一化的工具和方法?

    在多指标评价体系中,由于各评价指标的性质不同,通常具有不同的量纲和数量级。当各指标间的水平相差很大时,如果直接用原始指标值进行分析,就会突出数值较高的指标在综合分析中的作用,相对削弱数值水平较低指标的作用。因此,为了保证结果的可靠性,需要对原始指标数据进行标准化处理。

    数据的标准化或归一化是将数据按比例缩放,使其缩放到相同的数据区间和范围,以减少规模、特征、分布差异等对模型的影响。除了做模型计算,标准化后的数据还具有直接计算并生成复合指标的意义,是加权指标的必要步骤。

    本文将一文搞定数据标准化和归一化。从数据标准化及归一化具体含义、区别、实战时常用方法及工具等方面具体介绍数据预处理过程中的数据标准化及归一化。

    • 基于距离度量的模型

    由于距离对特征之间不同取值范围非常敏感,若某个特征取值非常大而导致其掩盖了特征之间的距离对总距离的影响,这样距离模型便不能很好地将不同类别的特征区分开。所以基于距离读量的模型是十分有必要做数据标准化处理的,此类模型在归一化后可有可能提高精度。

    最典型基于距离度量的模型包括KNNkmeans聚类感知机SVM

    • 判别模型

    有些模型在各个维度进行不均匀伸缩后,最优解与原来不等价,例如SVM。对于这样的模型,除非本来各维数据的分布范围就比较接近,否则必须进行标准化,以免模型参数被分布范围较大或较小的数据占住主导地位。

    有些模型在各个维度进行不均匀伸缩后,最优解与原来等价,例如logistic regression。对于这样的模型,是否标准化理论上不会改变最优解。但是,由于实际求解往往使用迭代算法,如果目标函数的形状太"扁",迭代算法可能收敛得很慢甚至不收敛。所以对于具有伸缩不变性的模型, 最好也进行数据标准化。

    • 通过梯度下降求解最优解的模型

    归一化后加快了梯度下降求最优解的速度, 运用梯度下降,损失等高线是椭圆形,需要进行多次迭代才能达到最优点,如果进行归一化了,那么等高线就是圆形的,促使往原点迭代,从而导致需要迭代次数较少。因此如果机器学习模型使用梯度下降法求最优解时,归一化往往非常有必要,否则很难收敛甚至不能收敛。

    GBDT的树是在上一颗树的基础上通过梯度下降求解最优解,归一化能收敛的更快,而随机森林本来就是通过减少方差提高性能的,树之间建立关系是独立的,不需要归一化

    • 概率模型不需要归一化

    树模型是通过寻找最优分裂点构成的,样本点的数值缩放不影响分裂点的位置,对树模型的结构也不造成影响,而且树模型不能进行梯度下降,因为树模型是阶跃的,阶跃是不可导的,因此不需要归一化。

    决策树、基于决策树的BoostingBagging等集成学习模型对于特征取值大小并不敏感。因为它们不关心变量的值,而是关心变量的分布和变量之间的条件概率。

    归一化和标准化选择

    • 若对输出结果范围有要求 ---- 用归一化
    • 数据较为稳定,不存在极端的最大最小 ---- 用归一化
    • 如果数据存在异常值和较多噪音 ---- 用标准化,可以间接通过中心化避免异常值和极端值的影响

    归一化和标准化原因

    • 消除量纲或数值对计算结果的影响
    • 模型要求数据假定服从相应的分布
    • 将数据缩放到指定的区间上

    归一化、标准化方法

    Z-Score 标准化:

    一种中心化方法,基于原始数据的均值和标准差进行的标准化。标准化后数据均值为0,方差为1。会改变原有数据结构,不适合对稀疏数据的处理。

    语法:

    sklearn.preprocessing.StandardScaler(*, copy=True, with_mean=True, with_std=True)
    通过去除平均值和缩放到单位方差来标准化特征。
    样本x的标准分数计算为:
    其中u为训练样本的均值,如果
    with_mean=False为0,如果with_std=False为s为训练样本的标准差,如果with_std=False为1。
    通过计算训练集中样本的相关统计量,独立地对每个特征进行定心和缩放,然后将均值和标准差存储起来,通过变换用于后续的数据。
    数据集的标准化是许多机器学习估计器的共同需求:如果单个特征或多或少看起来不像标准正态分布数据(例如,具有0均值和单位方差的高斯分布数据),它们可能会表现得很糟糕。 例如,在学习算法的目标函数中使用的许多元素(如支持向量机的RBF核或线性模型的L1和L2正则化器)假设所有特征都以0为中心,并且具有相同顺序的方差。如果某个特性的方差比其他特性大几个数量级,那么它可能会支配目标函数,使估计器无法按照预期正确地从其他特性学习。
    该scaler也可以应用于稀疏的CSR或CSC矩阵,通过传递_mean=False来避免破坏数据的稀疏结构。
    >>> from sklearn.preprocessing import StandardScaler
    >>> data = [[0, 0], [0, 0], [1, 1], [1, 1]]
    >>> scaler = StandardScaler()
    >>> print(scaler.fit(data))
    StandardScaler()
    >>> print(scaler.mean_)
    [0.5 0.5]
    >>> print(scaler.transform(data))
    [[-1. -1.]
     [-1. -1.]
     [ 1.  1.]
     [ 1.  1.]]
    >>> print(scaler.transform([[2, 2]]))
    [[3. 3.]]

    Max-Min 归一化

    一种线性变换方法,标准化后数据完全落入[0,1]区间,能够较好的保持原有数据结构。

    sklearn.preprocessing.minmax_scale(X, feature_range=(0, 1), *, axis=0, copy=True)
    变换特征,通过缩放每个特征到一个给定的范围。
    该估计器对每个特征分别进行缩放和转换,使其在训练集中的给定范围内,例如在0到1之间。
    >>> from sklearn.preprocessing import MinMaxScaler
    >>> data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
    >>> scaler = MinMaxScaler()
    >>> print(scaler.fit(data))
    MinMaxScaler()
    >>> print(scaler.data_max_)
    [ 1. 18.]
    >>> print(scaler.transform(data))
    [[0.   0.  ]
     [0.25 0.25]
     [0.5  0.5 ]
     [1.   1.  ]]
    >>> print(scaler.transform([[2, 2]]))
    [[1.5 0. ]]

    Max-Abs 用于稀疏数据:

    最大值绝对值标准化,标准化后数据落入[-1,1]区间。

    sklearn.preprocessing.maxabs_scale(X, *, axis=0, copy=True
    
    >>> from sklearn.preprocessing import MaxAbsScaler
    >>> X = [[ 1., -1.,  2.],
    ...      [ 2.,  0.,  0.],
    ...      [ 0.,  1., -1.]]
    >>> transformer = MaxAbsScaler().fit(X)
    >>> transformer
    MaxAbsScaler()
    >>> transformer.transform(X)
    array([[ 0.5, -1. ,  1. ],
           [ 1. ,  0. ,  0. ],
           [ 0. ,  1. , -0.5]])
    按其最大绝对值缩放每个特征。
    该估计器对每个特征分别进行缩放和转换,这样训练集中每个特征的最大绝对值将为1.0。它不会移动/中心数据,因此不会破坏任何稀疏性。
    这个标量器也可以应用于稀疏CSR或CSC矩阵。

    RobustScalar 针对离群点

    *Robust* ---- This Scaler removes the median and scales the data according to the quantile range.

    Huber从稳健统计的角度系统地给出了鲁棒性3个层面的概念:

    • 模型具有较高的精度或有效性,这也是对于机器学习中所有学习模型的基本要求;
    • 对于模型假设出现的较小偏差,主要是噪声(noise),只能对算法性能产生较小的影响;
    • 对于模型假设出现的较大偏差,主要是离群点(outlier),不可对算法性能产生"灾难性"的影响。

    在机器学习,训练模型时,工程师可能会向算法内添加噪声(如对抗训练),以便测试算法的鲁棒性。可以将此处的鲁棒性理解为算法对数据变化的容忍度有多高。鲁棒性并不同于稳定性,稳定性通常意味着特性随时间不变化的能力,鲁棒性则常被用来描述可以面对复杂适应系统的能力,需要更全面的对系统进行考虑。

    异常点在普通标准化后会失去离群特征。该方法对数据中心化和数据的鲁棒性更强的参数控制。

    sklearn.preprocessing.RobustScaler(*, with_centering=True, with_scaling=True, quantile_range=(25.0, 75.0), copy=True)
    使用对异常值稳健性的统计数据来衡量特征。
    这个标量去除中值,并根据分位数范围(默认为IQR:四分位数范围)对数据进行缩放。IQR是第1个四分位数(第25分位数)和第3个四分位数(第75分位数)之间的范围。
    通过计算训练集中样本的相关统计量,独立地对每个特征进行定心和缩放。然后存储中值和四分位范围,使用变换方法对以后的数据进行处理。
    数据集的标准化是许多机器学习估计器的常见需求。这通常是通过去除平均值和缩放到单位方差来实现的。然而,异常值往往会对样本均值/方差产生负面影响。在这种情况下,中位数和四分位范围通常会给出更好的结果。
    >>> from sklearn.preprocessing import RobustScaler
    >>> X = [[ 1., -2.,  2.],
    ...      [ -2.,  1.,  3.],
    ...      [ 4.,  1., -2.]]
    >>> transformer = RobustScaler().fit(X)
    >>> transformer
    RobustScaler()
    >>> transformer.transform(X)
    array([[ 0. , -2. ,  0. ],
           [-1. ,  0. ,  0.4],
           [ 1. ,  0. , -1.6]])

    Normalizer 用于文本分类

    将输入缩放到单元规范是文本分类或聚类的常见操作。例如,两个l2-归一化后的TF-IDF向量的点积是向量的余弦相似度,是信息检索界常用的向量空间模型的基本相似度度量。

    语法:

    sklearn.preprocessing.Normalizer(norm='l2', *, copy=True)

    例:

    >>> from sklearn.preprocessing import Normalizer
    >>> X = [[4, 1, 2, 2],
    ...      [1, 3, 9, 3],
    ...      [5, 7, 5, 1]]
    >>> transformer = Normalizer().fit(X)  # fit does nothing.
    >>> transformer
    Normalizer()
    >>> transformer.transform(X)
    array([[0.8, 0.2, 0.4, 0.4],
           [0.1, 0.3, 0.9, 0.3],
           [0.5, 0.7, 0.5, 0.1]])

    log 函数转换

    通过以10为底的函数转换的方法同样可以通过

    实现归一化,但是要是需要数据一定落到[0,1]区间上,应该还要除以,
    max为样本数据最大值,并且所有的数据都要大于等于1。

    atan 函数转换

    反余切函数转换,公式如下:

    用反正切函数也可以实现数据的归一化,使用这个方法需要注意的是如果想映射的区间为[0,1],则数据都应该大于等于0,小于0的数据将被映射到[-1,0]区间上。

    更多数据预处理可参加:

    API Reference - scikit-learn 0.23.2 documentationscikit-learn.org

    实例

    各个标准化结果对比。

    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns
    from sklearn.preprocessing import StandardScaler, MinMaxScaler, MaxAbsScaler, Normalizer, RobustScaler
    plt.style.use('seaborn')
    
    def plot(data, title):
        plt.ylabel('frequency', fontdict={'fontsize':15})
        plt.xlabel('height(blue)  /  weight(green)', fontdict={'fontsize':10})
        plt.title(title, fontdict={'fontsize':15})
        sns.distplot(data[:, 0:1], color='#0080ff')
        sns.distplot(data[:, 1:2], color='#407600')
        
    np.random.seed(42)
    height = np.random.normal(loc=150, scale=5, size=5000).reshape(-1, 1)
    weight = np.random.normal(loc=75, scale=10, size=5000).reshape(-1, 1)
    original_data = np.concatenate((height, weight), axis=1)
    class_name = [Normalizer(), StandardScaler(), MinMaxScaler(), MaxAbsScaler(), RobustScaler()]
    title_name = ['Normalizer', 'StandardScaler', 'MinMaxScaler', 'MaxAbsScaler',  'RobustScaler']
    plt.figure(figsize=(16,16), dpi=100)
    for i in range(1,7):
        if i == 1:
            plt.subplot(3,2,1)
            plot(original_data, 'Original')
        else:
            plt.subplot(3,2,i)
            plot(class_name[i-2].fit_transform(original_data), title_name[i-2])
    plt.show()
    plt.savefig('Standard.png')

    你可以自己运行得到结果,也可以点击下面原文链接查看对比可视化结果。

    原文链接:

    数据预处理 | 数据归一化及标准化mp.weixin.qq.com

    推荐阅读:

    Python数据分析实战之数据获取三大招

    缺失值处理,你真的会了吗?

    Python数据分析之数据探索分析(EDA)

    扫码关注:

    2bdf2788b6b9bf0368a21fd9a13e2857.png
    展开全文
  • 数据分析一定少不了数据预处理,预处理好坏决定了后续模型效果,今天我们就来看看预处理有哪些方法呢?记录实战过程中在数据预处理环节用到的方法~主要从以下几个方面介绍:常用方法Numpy部分Pandas部分Sklearn ...

    数据分析一定少不了数据预处理,预处理的好坏决定了后续的模型效果,今天我们就来看看预处理有哪些方法呢?

    记录实战过程中在数据预处理环节用到的方法~

    主要从以下几个方面介绍:

    • 常用方法

    • Numpy部分

    • Pandas部分

    • Sklearn 部分

    • 处理文本数据

    一、常用方法

    1、生成随机数序列

    5*trainSize)

    2、计算某个值出现的次数

    titleSet = set(titleData)
    for i in titleSet:
        count = titleData.count(i)

    用文本出现的次数替换非空的地方。词袋模型 Word Count

    'title']

    3、判断值是否为NaN

    def isNaN(num):

    4、 Matplotlib在jupyter中显示图像

    %matplotlib inline

    5、处理日期

    'birth_date']

    6、计算多列数的平均值等

    'operate_able'] = trainData.iloc[ : , 

    7、数据分列(对列进行one-hot)

    "Embarked"])

    8、正则提取指定内容

    df['Name].str.extract()是提取函数,配合正则一起使用

    'Name1'] = train_test[

    9、根据数据是否缺失进行处理

    "Age"].isnull() ,

    10、按区间分割-数据离散化

    返回x所属区间的索引值,半开区间

    #将年龄划分五个阶段10以下,10-18,18-30,30-50,50以上

    二、Numpy部分

    1、where索引列表

    'acc_now_delinq']) == 

    2、permutation(x) 随机生成一个排列或返回一个range

    如果x是一个多维数组,则只会沿着它的第一个索引进行混洗。

    import numpy 

    3、numpy.argmax() 返回沿轴的最大值的`索引`

    返回沿轴的最大值的索引。

    np.argmax(some_digit_scores)
    • a : array_like;   输入数组

    • axis : int, optional;   默认情况下,索引是放在平面数组中,否则沿着指定的轴。

    • out : array, optional;    如果提供,结果将被插入到这个数组中。它应该是适当的形状和dtype。

    4、numpy.dot(a, b, out=None) 计算两个数组的点积

    3

    5、numpy.random.randn() 从标准正太分布返回样本

    42

    参数

    • d0, d1, …, dn : int, optional;返回的数组维度,应该都是正值。如果没有给出,将返回一个Python float值。

    6、numpy.linspace() 在指定区间返回间隔均匀的样本[start, stop]

    -3
    • start : scalar;序列的起始值

    • stop : scalar;序列的结束值

    • num : int, optional;要生成的样本数量,默认为50个。

    • endpoint : bool, optional;若为True则包括结束值,否则不包括结束值,即[start, stop)区间。默认为True。

    • dtype : dtype, optional;输出数组的类型,若未给出则从输入数据推断类型。

    三、Pandas部分

    1、Jupyter notebook中设置最大显示行列数

    'display.max_columns'

    2、读入数据

    'game'

    3、数据简单预览

    • ~head()
      获取前五行数据,供快速参考。

    • ~info()
      获取总行数、每个属性的类型、非空值的数量。

    • ~value_counts()
      获取每个值出现的次数

    • ~hist()
      直方图的形式展示数值型数据

    • ~describe()
      简要显示数据的数字特征;例如:总数、平均值、标准差、最大值最小值、25%/50%/75%值

    4、拷贝数据

    mthsMajorTest = fullData.copy()

    5、数据相关性

    • 计算相关性矩阵

    corrMatrix = trainData.corr()
    corrMatrix['acc_now_delinq'].sort_values(ascending=False# 降序排列
    • 相关系数矩阵图

    import numpy

    颜色越深表明二者相关性越强

    6、删除某列

    'acc_now_delinq', axis=
    # 此方法并不会从内存中释放内存

    7、列表类型转换

    termData = list(map(int, termData))

    8、替换数据

    'A',

    9、数据集合并

    allData = trainData.append(testData)
    0, ignore_index=

    10、分割

    ' ', n=

    11、~where() 相当于三目运算符( ? : )

    通过判断自身的值来修改自身对应的值,相当于三目运算符( ? : )

    "income_cat"].where(housing[
    • cond 如果为True则保持原始值,若为False则使用第二个参数other替换值。

    • other 替换的目标值

    • inplace 是否在数据上执行操作

    12、np.ceil(x, y) 限制元素范围

    • x 输入的数据

    • y float型,每个元素的上限

    "income_cat"] = np.ceil(housing[

    13、~loc[] 纯粹基于标签位置的索引器

    strat_train_set = housing.loc[train_index]
    strat_test_set = housing.loc[test_index]

    14、~dropna() 返回略去丢失数据部分后的剩余数据

    "total_bedrooms"])

    15、~fillna() 用指定的方法填充

    # 用中位数填充

    16、重置索引

    allData = subTrain.reset_index()

    四、Sklearn 部分

    1、数据标准化

    from sklearn.preprocessing 

    2、预测缺失值

    from sklearn 

    3、Lightgbm提供的特征重要性

    import lightgbm 

    对于缺失值,一般手动挑选几个重要的特征,然后进行预测

    'revol_util'

    4、用中位数填充

    'total_acc'].fillna(trainData[

    5、用均值填充

    'total_acc'].fillna(trainData[

    6、Imputer() 处理丢失值

    各属性必须是数值

    from sklearn.preprocessing 

    五、处理文本数据

    1、pandas.factorize()            将输入值编码为枚举类型或分类变量

    'ocean_proximity']
    2、参数
    • values : ndarray (1-d);序列

    • sort : boolean, default False;根据值排序

    • na_sentinel : int, default -1;给未找到赋的值

    • size_hint : hint to the hashtable sizer

    3、返回值
    • labels : the indexer to the original array

    • uniques : ndarray (1-d) or Index;当传递的值是Index或Series时,返回独特的索引。

    4、OneHotEncoder   编码整数特征为one-hot向量

    返回值为稀疏矩阵

    from sklearn.preprocessing 

    注意fit_transform()期望一个二维数组,所以这里将数据reshape了。

    5、处理文本特征示例

    'ocean_proximity']

    6、LabelEncoder  标签编码

    LabelEncoder`是一个可以用来将标签规范化的工具类,它可以将标签的编码值范围限定在[0,n_classes-1]。简单来说就是对不连续的数字或者文本进行编号。

    from sklearn 

    当然,它也可以用于非数值型标签的编码转换成数值标签(只要它们是可哈希并且可比较的):

    >>> le = preprocessing.LabelEncoder()
    >>> le.fit(["paris""paris""tokyo""amsterdam"])
    LabelEncoder()
    >>> list(le.classes_)
    ['amsterdam''paris''tokyo']
    >>> le.transform(["tokyo""tokyo""paris"])
    array([221])
    >>> list(le.inverse_transform([221]))
    ['tokyo''tokyo''paris']

    7、LabelBinarizer  标签二值化

    LabelBinarizer 是一个用来从多类别列表创建标签矩阵的工具类:

    from sklearn 

    对于多类别是实例,可以使用:class:MultiLabelBinarizer:

    >>> lb = preprocessing.MultiLabelBinarizer()
    >>> lb.fit_transform([(12), (3,)])
    array([[110],
           [001]])
    >>> lb.classes_
    array([123])

    看完可以收藏,方便以后灵活运用哦~

    转自:Python数据分析实战与AI干货;「END」声明:本号内容部分来自互联网,转载请注明原文链接和作者,如有侵权或出处有误请联系我们。

    合作请加qq:365242293  


    更多相关知识请回复:“ 月光宝盒 ”;

    数据分析(ID : ecshujufenxi )互联网科技与数据圈自己的微信,也是WeMedia自媒体联盟成员之一,WeMedia联盟覆盖5000万人群。

    707bd644f88bfb8cfdf66738dd56f2e5.png

    展开全文
  • 数据分析一定少不了数据预处理,预处理好坏决定了后续模型效果,今天我们就来看看预处理有哪些方法呢?记录实战过程中在数据预处理环节用到的方法~主要从以下几个方面介绍:常用方法Numpy...

    数据分析一定少不了数据预处理,预处理的好坏决定了后续的模型效果,今天我们就来看看预处理有哪些方法呢?

    记录实战过程中在数据预处理环节用到的方法~

    主要从以下几个方面介绍:

    • 常用方法

    • Numpy部分

    • Pandas部分

    • Sklearn 部分

    • 处理文本数据

    一、常用方法

    1、生成随机数序列

    randIndex = random.sample(range(trainSize, len(trainData_copy)), 5*trainSize)
    

    2、计算某个值出现的次数

    titleSet = set(titleData)
    for i in titleSet:
        count = titleData.count(i)
    

    用文本出现的次数替换非空的地方。词袋模型 Word Count

    titleData = allData['title']
    titleSet = set(list(titleData))
    title_counts = titleData.value_counts()
    for i in titleSet:
        if isNaN(i):
            continue
        count = title_counts[i]
        titleData.replace(i, count, axis=0, inplace=True)
    title = pd.DataFrame(titleData)
    allData['title'] = title
    

    3、判断值是否为NaN

    def isNaN(num):
        return num != num
    

    4、 Matplotlib在jupyter中显示图像

    %matplotlib inline
    

    5、处理日期

    birth = trainData['birth_date']
    birthDate = pd.to_datetime(birth)
    end = pd.datetime(2020, 3, 5)
    # 计算天数
    birthDay = end - birthDate
    birthDay.astype('timedelta64[D]')
    # timedelta64 转到 int64
    trainData['birth_date'] = birthDay.dt.days
    

    6、计算多列数的平均值等

    trainData['operate_able'] = trainData.iloc[ : , 20:53].mean(axis=1)
    trainData['local_able'] = trainData.iloc[ : , 53:64].mean(axis=1)
    

    7、数据分列(对列进行one-hot)

    train_test = pd.get_dummies(train_test,columns=["Embarked"])
    train_test = pd.get_dummies(train_test,columns = ['SibSp','Parch','SibSp_Parch']) 
    

    8、正则提取指定内容

    df['Name].str.extract()是提取函数,配合正则一起使用

    train_test['Name1'] = train_test['Name'].str.extract('.+,(.+)').str.extract( '^(.+?)\.').str.strip()
    

    9、根据数据是否缺失进行处理

    train_test.loc[train_test["Age"].isnull() ,"age_nan"] = 1
    train_test.loc[train_test["Age"].notnull() ,"age_nan"] = 0
    

    10、按区间分割-数据离散化

    返回x所属区间的索引值,半开区间

    #将年龄划分五个阶段10以下,10-18,18-30,30-50,50以上
    train_test['Age'] = pd.cut(train_test['Age'], bins=[0,10,18,30,50,100],labels=[1,2,3,4,5])
    

    二、Numpy部分

    1、where索引列表

    delLocal = np.array(np.where(np.array(trainData['acc_now_delinq']) == 1))
    

    2、permutation(x) 随机生成一个排列或返回一个range

    如果x是一个多维数组,则只会沿着它的第一个索引进行混洗。

    import numpy as np
    
    shuffle_index = np.random.permutation(60000)
    X_train, y_train = X_train[shuffle_index], y_train[shuffle_index]
    

    3、numpy.argmax() 返回沿轴的最大值的`索引`

    返回沿轴的最大值的索引。

    np.argmax(some_digit_scores)
    
    • a : array_like;   输入数组

    • axis : int, optional;   默认情况下,索引是放在平面数组中,否则沿着指定的轴。

    • out : array, optional;    如果提供,结果将被插入到这个数组中。它应该是适当的形状和dtype。

    4、numpy.dot(a, b, out=None) 计算两个数组的点积

    >>> np.dot(3, 4)
    

    5、numpy.random.randn() 从标准正太分布返回样本

    >>> np.random.seed(42) # 可设置随机数种子
    >>> theta = np.random.randn(2,1)
    array([[ 4.21509616],
           [ 2.77011339]])
    

    参数

    • d0, d1, …, dn : int, optional;返回的数组维度,应该都是正值。如果没有给出,将返回一个Python float值。

    6、numpy.linspace() 在指定区间返回间隔均匀的样本[start, stop]

    X_new=np.linspace(-3, 3, 100).reshape(100, 1)
    X_new_poly = poly_features.transform(X_new)
    y_new = lin_reg.predict(X_new_poly)
    plt.plot(X, y, "b.")
    plt.plot(X_new, y_new, "r-", linewidth=2, label="Predictions")
    plt.xlabel("$x_1$", fontsize=18)
    plt.ylabel("$y$", rotation=0, fontsize=18)
    plt.legend(loc="upper left", fontsize=14)
    plt.axis([-3, 3, 0, 10])
    save_fig("quadratic_predictions_plot")
    plt.show()
    • start : scalar;序列的起始值

    • stop : scalar;序列的结束值

    • num : int, optional;要生成的样本数量,默认为50个。

    • endpoint : bool, optional;若为True则包括结束值,否则不包括结束值,即[start, stop)区间。默认为True。

    • dtype : dtype, optional;输出数组的类型,若未给出则从输入数据推断类型。

    三、Pandas部分

    1、Jupyter notebook中设置最大显示行列数

    pd.set_option('display.max_columns', 64)
    pd.set_option('display.max_rows', 1000000)
    

    2、读入数据

    homePath = 'game'
    trainPath = os.path.join(homePath, 'train.csv')
    testPath = os.path.join(homePath, 'test.csv')
    trainData = pd.read_csv(trainPath)
    testData = pd.read_csv(testPath)
    

    3、数据简单预览

    • ~head()
      获取前五行数据,供快速参考。

    • ~info()
      获取总行数、每个属性的类型、非空值的数量。

    • ~value_counts()
      获取每个值出现的次数

    • ~hist()
      直方图的形式展示数值型数据

    • ~describe()
      简要显示数据的数字特征;例如:总数、平均值、标准差、最大值最小值、25%/50%/75%值

    4、拷贝数据

    mthsMajorTest = fullData.copy()
    

    5、数据相关性

    • 计算相关性矩阵

    corrMatrix = trainData.corr()
    corrMatrix['acc_now_delinq'].sort_values(ascending=False) # 降序排列
    
    • 相关系数矩阵图

    import numpy
    correlations = data.corr()  #计算变量之间的相关系数矩阵
    # plot correlation matrix
    fig = plt.figure() #调用figure创建一个绘图对象
    ax = fig.add_subplot(111)
    cax = ax.matshow(correlations, vmin=-1, vmax=1)  #绘制热力图,从-1到1
    fig.colorbar(cax)  #将matshow生成热力图设置为颜色渐变条
    ticks = numpy.arange(0,9,1) #生成0-9,步长为1
    ax.set_xticks(ticks)  #生成刻度
    ax.set_yticks(ticks)
    ax.set_xticklabels(names) #生成x轴标签
    ax.set_yticklabels(names)
    plt.show()
    

    颜色越深表明二者相关性越强

    6、删除某列

    trainData.drop('acc_now_delinq', axis=1, inplace=True)
    
    # 此方法并不会从内存中释放内存
    del fullData['member_id']
    

    7、列表类型转换

    termData = list(map(int, termData))
    

    8、替换数据

    gradeData.replace(['A','B','C','D','E','F','G'], [7,6,5,4,3,2,1],inplace=True)
    

    9、数据集合并

    allData = trainData.append(testData)
    
    allData = pd.concat([trainData, testData], axis=0, ignore_index=True)
    

    10、分割

    termData = termData.str.split(' ', n=2, expand=True)[1]
    

    11、~where() 相当于三目运算符( ? : )

    通过判断自身的值来修改自身对应的值,相当于三目运算符( ? : )

    housing["income_cat"].where(housing["income_cat"] < 5, 5.0, inplace=True)
    
    • cond 如果为True则保持原始值,若为False则使用第二个参数other替换值。

    • other 替换的目标值

    • inplace 是否在数据上执行操作

    12、np.ceil(x, y) 限制元素范围

    • x 输入的数据

    • y float型,每个元素的上限

    housing["income_cat"] = np.ceil(housing["median_income"] / 1.5)     # 每个元素都除1.5
    

    13、~loc[] 纯粹基于标签位置的索引器

    strat_train_set = housing.loc[train_index]
    strat_test_set = housing.loc[test_index]
    

    14、~dropna() 返回略去丢失数据部分后的剩余数据

    sample_incomplete_rows.dropna(subset=["total_bedrooms"])
    

    15、~fillna() 用指定的方法填充

    # 用中位数填充
    median = housing["total_bedrooms"].median()
    sample_incomplete_rows["total_bedrooms"].fillna(median, inplace=True)
    

    16、重置索引

    allData = subTrain.reset_index()
    

    四、Sklearn 部分

    1、数据标准化

    from sklearn.preprocessing import StandardScaler
    ss = StandardScaler()
    ss.fit(mthsMajorTrain)
    mthsMajorTrain_d = ss.transform(mthsMajorTrain)
    mthsMajorTest_d = ss.transform(mthsMajorTest)
    

    2、预测缺失值

    from sklearn import linear_model
    lin = linear_model.BayesianRidge()
    lin.fit(mthsMajorTrain_d, mthsMajorTrainLabel)
    trainData.loc[(trainData['mths_since_last_major_derog'].isnull()), 'mths_since_last_major_derog'] = lin.predict(mthsMajorTest_d)
    

    3、Lightgbm提供的特征重要性

    import lightgbm as lgb
    
    params = {
        'task': 'train',
        'boosting_type': 'gbdt',
        'objective': 'regression',
        'metric': {'l2', 'auc'},
        'num_leaves': 31,
        'learning_rate': 0.05,
        'feature_fraction': 0.9,
        'bagging_fraction': 0.8,
        'bagging_freq': 5,
        'verbose': 0
    }
    
    lgb_train = lgb.Dataset(totTrain[:400000], totLabel[:400000])
    lgb_eval = lgb.Dataset(totTrain[400000:], totLabel[400000:])
    gbm = lgb.train(params,
                    lgb_train,
                    num_boost_round=20,
                    valid_sets=lgb_eval,
                    early_stopping_rounds=5)
    lgb.plot_importance(gbm, figsize=(10,10))
    

    对于缺失值,一般手动挑选几个重要的特征,然后进行预测

    upFeatures = ['revol_util', 'revol_bal', 'annual_inc']  # 通过上一步挑选出的特征
    totTrain = totTrain[upFeatures]
    totTest = trainData.loc[(trainData['total_rev_hi_lim'].isnull())][upFeatures]
    totTest['annual_inc'].fillna(-9999, inplace=True)
    
    from sklearn.preprocessing import StandardScaler
    ss = StandardScaler()
    ss.fit(totTrain)
    train_d = ss.transform(totTrain)
    test_d = ss.transform(totTest)
    
    from sklearn import linear_model
    lin = linear_model.BayesianRidge()
    lin.fit(train_d, totLabel)
    trainData.loc[(trainData['total_rev_hi_lim'].isnull()), 'total_rev_hi_lim'] = lin.predict(test_d)
    

    4、用中位数填充

    trainData['total_acc'].fillna(trainData['total_acc'].median(), inplace=True)
    

    5、用均值填充

    trainData['total_acc'].fillna(trainData['total_acc'].mean(), inplace=True)
    

    6、Imputer() 处理丢失值

    各属性必须是数值

    from sklearn.preprocessing import Imputer
    # 指定用何值替换丢失的值,此处为中位数
    imputer = Imputer(strategy="median")
    
    # 使实例适应数据
    imputer.fit(housing_num)
    
    # 结果在statistics_ 变量中
    imputer.statistics_
    
    # 替换
    X = imputer.transform(housing_num)
    housing_tr = pd.DataFrame(X, columns=housing_num.columns,
                              index = list(housing.index.values))
    
    # 预览
    housing_tr.loc[sample_incomplete_rows.index.values]
    

    五、处理文本数据

    1、pandas.factorize()            将输入值编码为枚举类型或分类变量

    housing_cat = housing['ocean_proximity']
    housing_cat.head(10)
    # 输出
    # 17606     <1H OCEAN
    # 18632     <1H OCEAN
    # 14650    NEAR OCEAN
    # 3230         INLAND
    # 3555      <1H OCEAN
    # 19480        INLAND
    # 8879      <1H OCEAN
    # 13685        INLAND
    # 4937      <1H OCEAN
    # 4861      <1H OCEAN
    # Name: ocean_proximity, dtype: object
    
    housing_cat_encoded, housing_categories = housing_cat.factorize()
    housing_cat_encoded[:10]
    # 输出
    # array([0, 0, 1, 2, 0, 2, 0, 2, 0, 0], dtype=int64)
    
    2、参数
    • values : ndarray (1-d);序列

    • sort : boolean, default False;根据值排序

    • na_sentinel : int, default -1;给未找到赋的值

    • size_hint : hint to the hashtable sizer

    3、返回值
    • labels : the indexer to the original array

    • uniques : ndarray (1-d) or Index;当传递的值是Index或Series时,返回独特的索引。

    4、OneHotEncoder   编码整数特征为one-hot向量

    返回值为稀疏矩阵

    from sklearn.preprocessing import OneHotEncoder
    
    encoder = OneHotEncoder()
    housing_cat_1hot = encoder.fit_transform(housing_cat_encoded.reshape(-1,1))
    housing_cat_1hot
    

    注意fit_transform()期望一个二维数组,所以这里将数据reshape了。

    5、处理文本特征示例

    housing_cat = housing['ocean_proximity']
    housing_cat.head(10)
    # 17606     <1H OCEAN
    # 18632     <1H OCEAN
    # 14650    NEAR OCEAN
    # 3230         INLAND
    # 3555      <1H OCEAN
    # 19480        INLAND
    # 8879      <1H OCEAN
    # 13685        INLAND
    # 4937      <1H OCEAN
    # 4861      <1H OCEAN
    # Name: ocean_proximity, dtype: object
    
    housing_cat_encoded, housing_categories = housing_cat.factorize()
    housing_cat_encoded[:10]
    # array([0, 0, 1, 2, 0, 2, 0, 2, 0, 0], dtype=int64)
    
    housing_categories
    # Index(['<1H OCEAN', 'NEAR OCEAN', 'INLAND', 'NEAR BAY', 'ISLAND'], dtype='object')
    
    from sklearn.preprocessing import OneHotEncoder
    
    encoder = OneHotEncoder()
    print(housing_cat_encoded.reshape(-1,1))
    housing_cat_1hot = encoder.fit_transform(housing_cat_encoded.reshape(-1,1))
    housing_cat_1hot
    # [[0]
    #  [0]
    #  [1]
    #  ..., 
    #  [2]
    #  [0]
    #  [3]]
    # <16512x5 sparse matrix of type '<class 'numpy.float64'>'
    #     with 16512 stored elements in Compressed Sparse Row format>
    

    6、LabelEncoder  标签编码

    LabelEncoder`是一个可以用来将标签规范化的工具类,它可以将标签的编码值范围限定在[0,n_classes-1]。简单来说就是对不连续的数字或者文本进行编号。

    >>> from sklearn import preprocessing
    >>> le = preprocessing.LabelEncoder()
    >>> le.fit([1, 2, 2, 6])
    LabelEncoder()
    >>> le.classes_
    array([1, 2, 6])
    >>> le.transform([1, 1, 2, 6])
    array([0, 0, 1, 2])
    >>> le.inverse_transform([0, 0, 1, 2])
    array([1, 1, 2, 6])
    

    当然,它也可以用于非数值型标签的编码转换成数值标签(只要它们是可哈希并且可比较的):

    >>> le = preprocessing.LabelEncoder()
    >>> le.fit(["paris", "paris", "tokyo", "amsterdam"])
    LabelEncoder()
    >>> list(le.classes_)
    ['amsterdam', 'paris', 'tokyo']
    >>> le.transform(["tokyo", "tokyo", "paris"])
    array([2, 2, 1])
    >>> list(le.inverse_transform([2, 2, 1]))
    ['tokyo', 'tokyo', 'paris']
    

    7、LabelBinarizer  标签二值化

    LabelBinarizer 是一个用来从多类别列表创建标签矩阵的工具类:

    >>> from sklearn import preprocessing
    >>> lb = preprocessing.LabelBinarizer()
    >>> lb.fit([1, 2, 6, 4, 2])
    LabelBinarizer(neg_label=0, pos_label=1, sparse_output=False)
    >>> lb.classes_
    array([1, 2, 4, 6])
    >>> lb.transform([1, 6])
    array([[1, 0, 0, 0],
           [0, 0, 0, 1]])
    

    对于多类别是实例,可以使用:class:MultiLabelBinarizer:

    >>> lb = preprocessing.MultiLabelBinarizer()
    >>> lb.fit_transform([(1, 2), (3,)])
    array([[1, 1, 0],
           [0, 0, 1]])
    >>> lb.classes_
    array([1, 2, 3])
    

    看完可以收藏,方便以后灵活运用哦~

    展开全文
  • 数据分析一定少不了数据预处理,预处理好坏决定了后续模型效果,今天我们就来看看预处理有哪些方法呢?记录实战过程中在数据预处理环节用到的方法~主要从以下几个方面介绍:常用方法Numpy部...
  • 在sklearn之数据分析中总结了数据分析常用方法,接下来对数据预处理进行总结 当我们拿到数据集后一般需要进行以下步骤: (1)明确数据集多少特征,哪些是连续哪些是类别 (2)检查没有缺失值,对缺失...
  • 数据采集与预处理

    2020-03-18 15:19:25
    目录 1.采用哪些方式可以获取大数据?...6.简述数据预处理的原理。 7.数据清洗有哪些方法? 8.数据集成需要重点考虑问题有哪些? 9.数据变换主要涉及哪些内容? 10.分别简述常用ETL工具...
  • 数据变换就是把数据变为合适形式,常见方式: 规范化 连续属性离散化 特征二值化 1. 数据规范化 解决哪些影响? 量纲不同 数值范围差异大 规范化的常用方法: 最大-最小规范化 z-score规范化 小数定标...
  • 怎样用Python进行数据转换和归一化1、概述​ 实际的...本文让我们来看一下数据预处理常用的数据转换和归一化方法有哪些。2、数据转换(Data Transfer)​ 对于字符型特征的处理:转换为字符型。​ 数据转换其实...
  • 数据清洗的方法要考虑你的数据的最终使用目的,不同的特征根据具体含义需要采用不同的策略。根据题主的问题,猜测主要关注缺失与异常值处理。缺失值的处理:1)删除。删除缺失占比较高的特征或样本。需要根据你最终的...
  • 数据分析基础套路与实战 ...2、数据分析的常用业务框架有哪些 数据采集 1、如何在明晰业务需求基础上,提炼重点采集对象 2、数据采集的常用渠道与方法 数据清洗 1、总览概况 2、清洗无效数据 数据预处理 1、处理缺失
  • 数据挖掘期末考试

    万次阅读 2019-01-27 11:33:46
    1理解概念 1.1数据挖掘 1.2关联规则 1.3数据预处理 1.4置信度 1.5聚类 1.6KNN 1.7SVM 2 分类器设计三个过程 3 分类时常将样本怎样划分? 4 评估分类器性能的常用...9 数据可视化分类方法有哪些? 10 数据...
  • 机器学习中,有哪些特征选择工程方法? - bonelee - 博客园​www.cnblogs.com使用第三方库imblearn处理样本不均衡问题​blog.csdn.net特征工程是数据分析中最耗时间和精力一部分工作,它不像算法和模型那样是...
  • 1. 数据预处理方法有哪些常用的有白化,去均值,归一化和PCA。 可参考这里。 2.数据的归一化方法有哪些? 常用的归一化方法:线性归一化和0均值标准化 线性归一化将数据转换到[0,1]之间: Xnorm=X−...
  • 本文让我们来看一下数据预处理常用的数据转换和归一化方法有哪些。二、数据转换(Data Transfer)对于字符型特征的处理:转换为字符型。数据转换其实就是把一些字符型数据转换为计算机可以识别的数值型数据的...
  • 本文让我们来看一下数据预处理常用的数据转换和归一化方法有哪些。二、数据转换(Data Transfer)对于字符型特征的处理:转换为字符型。数据转换其实就是把一些字符型数据转换为计算机可以识别的数值型数据的...
  • 原标题:怎样用Python进行数据转换和...本文让我们来看一下数据预处理常用的数据转换和归一化方法有哪些。二、数据转换(Data Transfer)对于字符型特征的处理:转换为字符型。数据转换其实就是把一些字符型数据转...
  • 原标题:怎样用Python进行数据转换和归一化怎样用Python进行数据转换和归一化1...本文让我们来看一下数据预处理常用的数据转换和归一化方法有哪些。2、数据转换(Data Transfer)对于字符型特征的处理:转换为字符...
  • 怎样用Python进行数据转换和归一化 1、概述...本文让我们来看一下数据预处理常用的数据转换和归一化方法有哪些。 2、数据转换(Data Transfer) 对于字符型特征的处理:转换为字符型。 数据转换其实就是把一些字符...
  • 原标题:怎样用Python进行数据转换和归一...本文让我们来看一下数据预处理常用的数据转换和归一化方法有哪些。## 2、数据转换(Data Transfer)对于字符型特征的处理:转换为字符型。数据转换其实就是把一些字符型...
  • 在实际业务场景中,我们要根据具体业务逻辑来判别哪些样本是离群点,下面我总结几个比较常用,通用异常值检测方法。可视化的方法画出样本集某一个特征而言,可以直接画出这个样本集在这个特征上值
  • 大数据概念与应用

    2020-03-18 15:01:39
    目录 ...7.大数据预处理方法有哪些? 8.大数据的挖掘方法有哪些? 9.大数据应用场景 1.新摩尔定律的含义是?  Jim Gray提著名的“新摩尔定律”,即人类有史以来的数据总量,每过18个月翻一番...
  • 计算机视觉的研究进展1、图像分类1.1 什么是图像分类任务,它有哪些应用场合1.2 图像分类任务有哪些难点?1.3 基于规则的方法是否可行?1.4 什么是数据驱动的图像分类范式1.5 常用的分类任务的评价指标是什么?2、...
  • ASP只是一个一般的引擎,具有支持多种语言的能力,不过默认的并且是最常用的还是VBScript。 mod_perl与Perl一样强大,只是更快一些。 二、PHP入门 PHP站点的在线教程已经很棒了。在那里还有一些其他教程的链接。...
  • Road 2 AI-可视化视图

    2021-04-24 15:06:48
    其中在数据预处理和结果后处理阶段需要我们对数据和结果做可视化处理,而对于不同的数据,需要不同的可视化方法: 比较:展示事物的排列顺序,比如条形图 联系:查看两个变量之间的关系,比如气泡图 构成:每个部分...

空空如也

空空如也

1 2 3 4
收藏数 63
精华内容 25
关键字:

常用的数据预处理方法有哪些