数据预处理-上

数据挖掘


数据预处理是对原始数据进行处理,消除噪声和缺失值,建立数据仓库的过程即是数据预处理的过程。数据的重要性在大多数情况下都超过了算法的重要性,质量欠佳的数据很难得到有用的分析结果,因此数据预处理是数据分析过程中至关重要的环节。数据预处理的完整工作应当包括数据清洗、数据集成、数据变换和数据归约处理。在数据挖掘的整个运作过程中,数据预处理是最重要的一个步骤,通常分析人员会花费60%-80%的经历在数据预处理上。数据预处理是否得当,对后续数据挖掘过程是否有效和质量的好坏有重要的影响,只有高质量的数据,才能有高质量的探勘结果。数据预处理包括: 字段选择、数据清洗、数据变换、数据归约以及衍生指标的加工等。

1. 字段选择

无效的字段包含不相关(Irrelevant)及多余(Redundant)的字段。多余的字段无法透过统计的检验来加以排除。统计检验可以排除不相关字段。数值型字段,不可用卡方检验来检验输入字段与目标字段的相关性。可用AVOVA检验来检验数值型字段与类别型目标字段的相关性。
字段选择包括数据整合(DataIntegration)和数据过滤两个方面(DataFiltering)。数据整合是将不同来源的数据整合在一个数据库中的过程。因为数据的来源不同,数据可能会出现不一致的情况,包括数据结构不一致、属性名不一致和属性值不一致;数据过滤的过程主要是建立区隔化模型的过程。有些单一变量虽对整体客群有鉴别力,但不一定对特定客群亦具有鉴别力。

2数据清洗
数据清洗就是发现、改正、移除不准确或不精确的数据,在数据分析领域,常用的数据清洗包括以下几种:

  • 缺失值处理,遵从规则如下规则:
  • 对于连续型变量,采用均值来代替缺失值。
  • 对于序数型分类变量,采用中位数来代替缺失值。
  • 对于分类型变量,采用众数来代替缺失值(有监督学习方法中可以采用贡献率来进行填充)。
    补充:缺失值的占比超过50%以上时,此字段通常会舍弃不用,不做任何填补。但另一种可能的处理的方式为将此字段的值根据是否缺失,生成指示变量,将原字段舍弃,并仅使用此指示变量作为输入变量。数据的缺失隐含着与某些行为有关联性时,使用此方法通常会有不错的分析成效。
    代码如下:
## python 处理缺失值
## 把原始数据的分类变量和类别变量进行分离
def findprotos(data):
    m, n = data.shape
    O = []
    C = []
    for i in range(n):
        try:
            if isinstance(data.iloc[0, i], int) or isinstance(data.iloc[0, i], float)  or isinstance(data.iloc[0, i], np.float64):
                O.append(i)
            elif isinstance(data.iloc[0, i], str):
                C.append(i)
            else:
                raise ValueError("the %d column of data is not a number or a string column" % i)
        except TypeError as e:
            print(e)
    O_data = data.iloc[:, O]
    C_data = data.iloc[:, C]
    return O, C, O_data, C_data
## 输入参数df_data:待处理的数据集
## 返回参数df_data:处理好的数据集
def dataDealNan(df_data):
   # col_lst1 = df_data.columns.tolist()
    O_col_cnt ,  C_col_cnt, O_data, C_data = findprotos(df_data)
    C_names = C_data.columns.tolist()
    O_names = O_data.columns.tolist()
    for col_name in C_names:
        ## 需要注意的是分类变量的mode()取值为pandas.core.series.Series类型,需要提取才可以使用
        df_data[col_name] = df_data[col_name].fillna(df_data[col_name].mode()[0])
    for col_name in O_names:
        df_data[col_name] = df_data[col_name].fillna(df_data[col_name].mean())
    return df_data
  • 越界值处理
    少数的越界值会被当作离群值来处理;大量的越界值需要通过业务知识来判断。具体操作方法有:
  • 对于连续变量
    越界值侦测方法:
  • 离群值为过大或过小的值,对数据排序即可发现。
  • 即平均值法,在平均值±3×标准偏差之内的值可视为正常值。
  • 四分位法,IQR=Q3–Q1,Q3代表第75%的值,Q1代表第25%的值。正常值的范围为Q1–1.5×IQR~Q3+1.5×IQR。四分位法的优点在于适用于小数据,故较常用。
    找到离群值后离群值的处理方法有:
  • 将离群值视为空值。
  • 天花板/地板法,即如数据小于正常范围最小值,则改为正常范围最小值,可称为地板函数,如数据大于正常范围最大值,则改为正常范围最大值。可称为天花板。优点在于还是保持最大最小值不变。
  • 函数校正法,即将离群值做log10(离群值)处理,即压缩数据。
## 异常值处理方法-盖帽法
def OutliersDeal(df_data):
    colnames = df_data.columns.tolist()
    for col_name in colnames:
        u_75 = df_data[col_name].quantile(q = 0.75)
        u_25 = df_data[col_name].quantile(q = 0.25)
        IQR = u_75 - u_25 
        df_data.loc[df_data[col_name] > u_75 + 1.5×IQR, col_name] = u_75
        df_data.loc[df_data[col_name] < u_25 - 1.5×IQR, col_name] = u_25
    return df_data

## 异常值处理-均值法
def avg_Outlier2(df_data):
    from collections import OrderedDict
    res = OrderedDict()
    colnames = df_data.columns.tolist()
    for col_name in colnames:
        x1 = df_data[col_name].mean() + 3 * df_data[col_name].std()  ## 上限
        x2 = df_data[col_name].mean() - 3 * df_data[col_name].std()  ## 下限
        res[col_name] = len(df_data.loc[df_data[col_name] > x1  , col_name]) + len(df_data.loc[df_data[col_name] < x2  , col_name])
    return res

3. 数据变换

连续型变量变换

  • 中心化处理:中心化后的取值清晰地体现了变量值与平均值之间的差距,计算公式为
    在这里插入图片描述

  • Z_Score变换:产生一个由用户自定义均值和标准差的变量,计算公式为
    在这里插入图片描述

  • Min-MaxNormalization(极值正规化),计算公式为:
    在这里插入图片描述
    其中,Min为数据最小值,Max为数据最大值。
    其中,代码为:

from sklearn.preprocessing import MinMaxScaler , StandardScaler
# Min-Max标准化
df[col_name] = MinMaxScaler().fit_transform(df[col_name].values.reshape(-1,1)).reshape(1,-1)[0]
# Z_Score变换
df[col_name] = StandardScaler().fit_transform(df[col_name].values.reshape(-1, 1)).reshape(1, -1)[0]
  • 数据离散化
    自动化分离-装箱法。装箱法主要利用数据集合中数据数值的分布情形来进行区间分离。而每个区间称为箱子(Bin)。装箱法主要分为2种,

  • 等宽分箱

给定数据个数n之后,依据排序后数据数值的最大值与最小值切割成n个等宽箱子。如一组年龄数据28、29、30、31、32、35、36要分为3个箱子,每一个箱子的宽度为(36-28)/3=2.67,经四舍五入后为3。所以:
箱子一:28,29,30
箱子二:31,32,33,因为数据中没有33,所以箱子二为31,32
箱子三:34,35,36,因为数据中没有34,所以箱子三位35,36

  • 等深分箱

即在使用者所给定之箱子个数n下,依据数据数值的数量切割成n个数量相等箱子。
例如,会员数据表中总共有7笔数据记录(28、29、30、31、32、35、36),在用户所给定之箱子个数为3下,每一个箱子可装载之数据笔数为7/3=2.33,经四舍五入后为2。所以,数据按照2,2,3分入到各个箱子中:
箱子一:28,29
箱子二:30,31
箱子三:32,35,36

4数据归约
由于数据规约篇幅较长,放到下一章详细说明。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值