精华内容
下载资源
问答
  • 常见数据预处理包括
    千次阅读
    2020-04-15 09:11:55
    1. 无量纲化

    无量纲化主要解决数据的量纲不同的问题,使不同的数据转换到同一规格,常见的方法有标准化区间缩放法。标准化的假设前提是特征值服从正态分布。区间放缩法利用了边界值信息,将特征的取值区间缩放到某个特点的范围,列如[0,1]等。

    (1) 标准化

    理论上,标准化适用于服从正态分布的数据,目前很多工程都依赖大数据,所以在样本足够多的情况下,工程师往往直接使用标准化对数据进行无量纲化预处理,在深度学习中,将数据标准化能够保证有更好的收敛。如果不进行数据标准化,有些特征将会对损失函数影响很大,使得其他值比较小的特征重要性降低

    (2)归一化/区间缩放法

    归一化适用于数据量较小的工程。顾名思义就是利用两个最值进行缩放。公式为(x-min)/(max-min)

    2.哑编码与独热编码

    如果某一列数据是一些特征,比如国家名称,那就没有办法应用到回归或者分类里,所以需要对数据进行哑编码或者独热编码。

    哑编码与独热编码的区别主要是哑编码祛除了一个状态位。

    例如:假设在中国、德国、法国、美国四种可能的取值,独热编码就是用每个维度表达一个国家,比如中国为1,0,0,0。而哑编码只需要三个状态位,如其他都为0则中国必为1.

    3.缺失值补充

    缺失值最常用的就是均值、就近补齐、K最近距离填充等方法。特别需要注意的是,有的时候缺失值也是一种特征。

    应当分为三种情况:

    当缺失值过多时:应当舍弃这个特征。

    当缺失值适中时:应当将填充值当成一种特征

    当缺失值较少时:可以考虑进行填充

    填充的常用策略:

    1. 用一个异常值填充并将缺失值作为一个特征处理
    2. 用均值或者条件均值填充,如果数据是不平衡的,那么应该使用条件均值填充,条件均值指的是与缺失值所属标签相同的所有数据的均值。
    3. 用相邻数据填充
    4. 利用插值算法
    5. 数据拟合,将缺失值当成一种预测来处理

    hi 认识一下?

    微信关注公众号:全都是码农 (allmanong)
    你将获得:
    关于人工智能的所有面试问题一网打尽!未来还有思维导图哦!
    回复121 立即获得 已整理好121本python学习电子书
    回复89 立即获得 程序员史诗级必读书单吐血整理四个维度系列89本书。
    回复167 立即获得 机器学习和python学习之路史上整理大数据技术书从入门到进阶最全本(66本)
    回复18 立即获得 数据库从入门到进阶必读18本技术书籍网盘整理电子书(珍藏版)
    回复56 立即获得 我整理的56本算法与数据结构
    未来还有人工智能研究生课程笔记等等,我们一起进步呀!

    更多相关内容
  • 常见数据预处理--python篇

    千次阅读 2020-12-06 21:19:53
    本文简单介绍python中一些常见数据预处理包括数据加载、缺失值处理、异常值处理、描述性变量转换为数值型、训练集测试集划分、数据规范化。1、 加载数据1.1 数据读取数据格式有很多,介绍常见的csv,txt,excel...

    做过数据分析的孩子一般都知道:数据预处理很重要,大概会占用整个分析过程50%到80%的时间,良好的数据预处理会让建模结果达到事半功倍的效果。本文简单介绍python中一些常见的数据预处理,包括数据加载、缺失值处理、异常值处理、描述性变量转换为数值型、训练集测试集划分、数据规范化。

    1、 加载数据

    1.1 数据读取

    数据格式有很多,介绍常见的csv,txt,excel以及数据库mysql中的文件读取

    import pandas as pd

    data = pd.read_csv(r'../filename.csv')#读取csv文件

    data = pd.read_table(r'../filename.txt')#读取txt文件

    data = pd.read_excel(r'../filename.xlsx') #读取excel文件

    # 获取数据库中的数据

    import pymysql

    conn = pymysql.connect(host='localhost',user='root',passwd='12345',db='mydb')#连接数据库,注意修改成要连的数据库信息

    cur = conn.cursor()#创建游标

    cur.execute("select * from train_data limit 100")#train_data是要读取的数据名

    data = cur.fetchall()#获取数据

    cols = cur.description#获取列名

    conn.commit()#执行

    cur.close()#关闭游标

    conn.close()#关闭数据库连接

    col = []

    for i in cols:

    col.append(i[0])

    data = list(map(list,data))

    data = pd.DataFrame(data,columns=col)

    1.2 CSV文件合并

    实际数据可能分布在一个个的小的csv或者txt文档,而建模分析时可能需要读取所有数据,这时呢,需要将一个个小的文档合并到一个文件中

    #合并多个csv文件成一个文件

    import glob

    #合并

    def hebing():

    csv_list = glob.glob('*.csv') #查看同文件夹下的csv文件数

    print(u'共发现%s个CSV文件'% len(csv_list))

    print(u'正在处理............')

    for i in csv_list: #循环读取同文件夹下的csv文件

    fr = open(i,'rb').read()

    with open('result.csv','ab') as f: #将结果保存为result.csv

    f.write(fr)

    print(u'合并完毕!')

    #去重

    def quchong(file):

    df = pd.read_csv(file,header=0)

    datalist = df.drop_duplicates()

    datalist.to_csv(file)

    if __name__ == '__main__':

    hebing()

    quchong("result.csv.csv")

    1.3 CSV文件拆分

    对于一些数据量比较大的文件,想直接读取或者打开比较困难,介绍一个可以拆分数据的方法吧,方便查看数据样式以及读取部分数据

    ##csv比较大,打不开,将其切分成一个个小文件,看数据形式

    f = open('NEW_Data.csv','r') #打开大文件

    i = 0 #设置计数器

    #这里1234567表示文件行数,如果不知道行数可用每行长度等其他条件来判断

    while i<1234567 :

    with open('newfile'+str(i),'w') as f1:

    for j in range(0,10000) : #这里设置每个子文件的大小

    if i < 1234567: #这里判断是否已结束,否则最后可能报错

    f1.writelines(f.readline())

    i = i+1

    else:

    break

    1.4 数据查看

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

    data.head() #显示前五行数据

    data.tail() #显示末尾五行数据

    data.info() #查看各字段的信息

    data.shape #查看数据集有几行几列,data.shape[0]是行数,data.shape[1]是列数

    data.describe() #查看数据的大体情况,均值,最值,分位数值...

    data.columns.tolist() #得到列名的list

    2、缺失值

    现实获取的数据经常存在缺失,不完整的情况(能有数据就不错了,还想完整!!!),为了更好的分析,一般会对这些缺失数据进行识别和处理

    2.1 缺失值查看

    print(data.isnull().sum()) #统计每列有几个缺失值

    missing_col = data.columns[data.isnull().any()].tolist() #找出存在缺失值的列

    import numpy as np

    #统计每个变量的缺失值占比

    def CountNA(data):

    cols = data.columns.tolist() #cols为data的所有列名

    n_df = data.shape[0] #n_df为数据的行数

    for col in cols:

    missing = np.count_nonzero(data[col].isnull().values) #col列中存在的缺失值个数

    mis_perc = float(missing) / n_df * 100

    print("{col}的缺失比例是{miss}%".format(col=col,miss=mis_perc))

    2.2 缺失值处理

    面对缺失值,一般有三种处理方法:不处理、删除以及填充

    2.2.1 不处理

    有的算法(贝叶斯、xgboost、神经网络等)对缺失值不敏感,或者有些字段对结果分析作用不大,此时就没必要费时费力去处理缺失值啦 =。=

    2.2.2 删除

    在数据量比较大时候或者一条记录中多个字段缺失,不方便填补的时候可以选择删除缺失值

    data.dropna(axis=0,how="any",inplace=True) #axis=0代表'行','any'代表任何空值行,若是'all'则代表所有值都为空时,才删除该行

    data.dropna(axis=0,inplace=True) #删除带有空值的行

    data.dropna(axis=1,inplace=True) #删除带有空值的列

    2.2.3 填充

    数据量较少时候,以最可能的值来插补缺失值比删除全部不完全样本所产生的信息丢失要少

    2.2.3.1 固定值填充

    data = data.fillna(0) #缺失值全部用0插补

    data['col_name'] = data['col_name'].fillna('UNKNOWN') #某列缺失值用固定值插补

    2.2.3.2 出现最频繁值填充

    即众数插补,离散/连续数据都行,适用于名义变量,如性别

    freq_port = data.col_name.dropna().mode()[0] # mode返回出现最多的数据,col_name为列名

    data['col_name'] = data['col_name'].fillna(freq_port) #采用出现最频繁的值插补

    2.2.3.3 中位数/均值插补

    data['col_name'].fillna(data['col_name'].dropna().median(),inplace=True) #中位数插补,适用于偏态分布或者有离群点的分布

    data['col_name'].fillna(data['col_name'].dropna().mean(),inplace=True) #均值插补,适用于正态分布

    2.2.3.4 用前后数据填充

    data['col_name'] = data['col_name'].fillna(method='pad') #用前一个数据填充

    data['col_name'] = data['col_name'].fillna(method='bfill') #用后一个数据填充

    2.2.3.5 拉格朗日插值法

    一般针对有序的数据,如带有时间列的数据集,且缺失值为连续型数值小批量数据

    from scipy.interpolate import lagrange

    #自定义列向量插值函数,s为列向量,n为被插值的位置,k为取前后的数据个数,默认5

    def ployinterp_columns(s, n, k=5):

    y = s[list(range(n-k,n)) + list(range(n+1,n+1+k))] #取数

    y = y[y.notnull()] #剔除空值

    return lagrange(y.index, list(y))(n) #插值并返回插值结果

    #逐个元素判断是否需要插值

    for i in data.columns:

    for j in range(len(data)):

    if (data[i].isnull())[j]: #如果为空即插值

    data[i][j] = ployinterp_columns(data[i],j)

    2.2.3.6 其它插补方法

    最近邻插补、回归方法、牛顿插值法、随机森林填充等。

    3、异常值

    异常值是指样本中的个别值,其数值明显偏离它所属样本的其余观测值。异常值有时是记录错误或者其它情况导致的错误数据,有时是代表少数情况的正常值

    3.1 异常值识别

    3.1.1 描述性统计法

    #与业务或者基本认知不符的数据,如年龄为负

    neg_list = ['col_name_1','col_name_2','col_name_3']

    for item in neg_list:

    neg_item = data[item] < 0

    print(item + '小于0的有' + str(neg_item.sum())+'个')

    #删除小于0的记录

    for item in neg_list:

    data = data[(data[item]>=0)]

    3.1.2 三西格玛法

    当数据服从正态分布时,99.7%的数值应该位于距离均值3个标准差之内的距离,P(|x−μ|>3σ)≤0.003

    #当数值超出这个距离,可以认为它是异常值

    for item in neg_list:

    data[item + '_zscore'] = (data[item] - data[item].mean()) / data[item].std()

    z_abnormal = abs(data[item + '_zscore']) > 3

    print(item + '中有' + str(z_abnormal.sum())+'个异常值')

    3.1.3 箱型图

    #IQR(差值) = U(上四分位数) - L(下四分位数)

    #上界 = U + 1.5IQR

    #下界 = L-1.5IQR

    for item in neg_list:

    IQR = data[item].quantile(0.75) - data[item].quantile(0.25)

    q_abnormal_L = data[item] < data[item].quantile(0.25) - 1.5*IQR

    q_abnormal_U = data[item] > data[item].quantile(0.75) + 1.5*IQR

    print(item + '中有' + str(q_abnormal_L.sum() + q_abnormal_U.sum())+'个异常值')

    3.1.4 其它

    基于聚类方法检测、基于密度的离群点检测、基于近邻度的离群点检测等。

    3.2 异常值处理

    对于异常值,可以删除,可以不处理,也可以视作缺失值进行处理。

    4、描述性变量转换为数值型

    大部分机器学习算法要求输入的数据必须是数字,不能是字符串,这就要求将数据中的描述性变量(如性别)转换为数值型数据

    #寻找描述变量,并将其存储到cat_vars这个list中去

    cat_vars = []

    print('\n描述变量有:')

    cols = data.columns.tolist()

    for col in cols:

    if data[col].dtype == 'object':

    print(col)

    cat_vars.append(col)

    ##若变量是有序的##

    print('\n开始转换描述变量...')

    from sklearn import preprocessing

    le = preprocessing.LabelEncoder()

    #将描述变量自动转换为数值型变量,并将转换后的数据附加到原始数据上

    for col in cat_vars:

    tran = le.fit_transform(data[col].tolist())

    tran_df = pd.DataFrame(tran,columns=['num_'+col])

    print('{col}经过转化为{num_col}'.format(col=col,num_col='num_'+col))

    data = pd.concat([data, tran_df], axis=1)

    del data[col]#删除原来的列

    ##若变量是无序变量##

    #值得注意的是one-hot可能引发维度爆炸

    for col in cat_vars:

    onehot_tran = pd.get_dummies(data.col)

    data = data.join(onehot_tran)#将one-hot后的数据添加到data中

    del data[col]#删除原来的列

    5、训练测试集划分

    实际在建模前大多需要对数据进行训练集和测试集划分,此处介绍两种划分方式

    法一、直接调用train_test_split函数

    from sklearn.model_selection import train_test_split

    X = data.drop('目标列',1)#X是特征列

    y = data['目标列']#y是目标列

    X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3)

    法二:随机抽样

    #随机选数据作为测试集

    test_data = data.sample(frac=0.3,replace=False,random_state=123,axis=0)

    #frac是抽取30%的数据,replace是否为有放回抽样,取replace=True时为有放回抽样,axis=0是抽取行、为1时抽取列

    #在data中除去test_data,剩余数据为训练集

    train_data = (data.append(test_data)).drop_duplicates(keep=False)

    X_train = train_data.drop('目标列',1)

    X_test = test_data.drop('目标列',1)

    y_train = train_data['目标列']

    y_test = test_data['目标列']

    6、数据规范化

    数据的标准化(normalization)是将数据按比例缩放,使之落入一个小的特定区间。在某些比较和评价的指标处理中经常会用到,去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。

    一些需要数据规范化的算法:LR、SVM、KNN、KMeans、GBDT、AdaBoost、神经网络等

    6.1 最小最大规范化

    对原始数据进行线性变换,变换到[0,1]区间。计算公式为:

    x* = (x-x.min)/(x.max-x.min)

    from sklearn.preprocessing import MinMaxScaler

    x_scaler = MinMaxScaler()

    y_scaler = MinMaxScaler()

    #特征归一化

    x_train_sca = x_scaler.fit_transform(X_train)

    x_test_sca = x_scaler.transform(X_test)

    y_train_sca = y_scaler.fit_transform(pd.DataFrame(y_train))

    6.2 零均值规范化

    对原始数据进行线性变换,经过处理的数据的均值为0,标准差为1。计算方式是将特征值减去均值,除以标准差。计算公式为:x* = (x-x.mean)/σ

    from sklearn.preprocessing import StandardScaler

    #一般把train和test集放在一起做标准化,或者在train集上做标准化后,用同样的标准化器去标准化test集

    scaler = StandardScaler()

    train = scaler.fit_transform(train)

    test = scaler.transform(test)

    啦啦啦,终于写完了,吐血ING

    展开全文
  • 本用法教程假定您已从UK hesin_all.csv下载并提取了包含参与者数据的.csv文件和包含健康记录数据的hesin_all.csv文件。 文件夹包含有关如何下载这些文件的指南。 1.安装 要使用此仓库,请运行: $ git clone git@...
  • 数据预处理详细步骤

    千次阅读 2021-11-08 17:22:38
    转载自最全面的数据预处理介绍 - 知乎 一、数据可能存在问题 在实际业务处理中,数据通常是脏数据。所谓的脏,指数据可能存在以下几种问题(主要问题): 数据缺失 (Incomplete) 是属性值为空的情况。如 ...

    转载自最全面的数据预处理介绍 - 知乎

    一、数据可能存在问题

    在实际业务处理中,数据通常是脏数据。所谓的脏,指数据可能存在以下几种问题(主要问题):

    1.数据缺失 (Incomplete) 是属性值为空的情况。如 Occupancy = “ ”

    2. 数据噪声 (Noisy)是数据值不合常理的情况。如 Salary = “-100”

    3. 数据不一致 (Inconsistent)是数据前后存在矛盾的情况。如 Age = “42” vs. Birthday = “01/09/1985”

    4. 数据冗余 (Redundant)是数据量或者属性数目超出数据分析需要的情况。

    5. 数据集不均衡 (Imbalance)是各个类别的数据量相差悬殊的情况。

    6. 离群点/异常值 (Outliers)是远离数据集中其余部分的数据。

    7. 数据重复(Duplicate)是在数据集中出现多次的数据。

    二、数据预处理步骤

    数据进行预处理主要有以下步骤,第一部分提及的各种脏数据的处理就在这些步骤中完成:

    1.数据清洗 Data Cleansing

    2. 数据转换 Data Transformation

    3. 数据描述 Data Description

    4. 特征选择 Feature Selection 或特征组合 Feature Combination

    5. 特征抽取 Feature Extraction


    在数据清洗阶段,我们处理第一部分提及的缺失数据、离群点和重复数据。

    缺失数据有以下几类:

    a.Missing completely at random: 缺失的概率是随机的,比如门店的计数器因为断电断网等原因在某个时段数据为空。

    b.Missing conditionally at random: 数据是否缺失取决于另外一个属性,比如一些女生不愿意填写自己的体重。

    c.Not missing at random: 数据缺失与自身的值有关,比如高收入的人可能不愿意填写收入。

    处理方式有以下几种:

    a. 删数据,如果缺失数据的记录占比比较小,直接把这些记录删掉完事。

    b. 手工填补,或者重新收集数据,或者根据领域知识来补数据。

    c. 自动填补,简单的就是均值填充,或者再加一个概率分布看起来更真实些,也可以结合实际情况通过公式计算,比如门店计数缺失,可以参考过往的客流数据,转化数据,缺失时段的销售额,用一个简单公式自动计算回补。

    离群点是远离数据集中其余部分的数据,这部分数据可能由随机因素产生,也可能是由不同机制产生。如何处理取决于离群点的产生原因以及应用目的。若是由随机因素产生,我们忽略或者剔除离群点,若是由不同机制产生,离群点就是宝贝,是应用的重点。后者的一个应用为异常行为检测,如在银行的信用卡诈骗识别中,通过对大量的信用卡用户信息和消费行为进行向量化建模和聚类,发现聚类中远离大量样本的点显得非常可疑,因为他们和一般的信用卡用户特性不同,他们的消费行为和一般的信用卡消费行为也相去甚远。还有购物网站检测恶意刷单等场景也重点对离群点进行分析。

    不论是对离群点提出还是重点研究应用,我们首先需要检测出离群点。在sklearn(一个python机器学习包)中提供了多种方法,如OneClassSVM、Isolation Forest、Local Outlier Factor (LOF)。需要进一步了解原理的可以额外看些资料。这里就不展开了。

    对重复数据的处理如下:如果高度疑似的样本是挨着的,就可以用滑动窗口对比,为了让相似记录相邻,可以每条记录生成一个hash key, 根据key去排序。

    数据清洗阶段结束后,我们得到的是没有错误的数据集了~


    在数据转换阶段,我们对数据进行采样处理、类型转换、归一化。

    采样是从特定的概率分布中抽取样本点的过程。采样在机器学习中有非常重要的应用:将复杂分布简化为离散的样本点;用重采样可以对样本集进行调整以更好地进行调整并适应后期的模型学习;用于随机模拟以进行复杂模型的近似求解或推理。采样的一个重要作用是处理不均衡数据集。

    最简单的处理不均衡样本集的方法是随机采样。采样一般分为过采样(Over-sampling)和欠采样(Under-sampling)。随机过采样是从少数类样本集 S_min中有放回地随机重复抽取样本,随机欠采样是从多数类样本集S_max中随机选取较少样本。两种方法也存在问题,如随机过采样会扩大数据规模,容易造成过拟合;随机欠采样可能损失部分有用信息,造成欠拟合。为了解决上诉问题,通常在随机过采样时不是简单复制样本,而是采取一定方法生成新的样本。如使用SMOTE(Synthetic Minority Oversampling Technique)算法、Borderline-SMOTE、ADASYN等算法。对于欠采样,可以采用Informed Undersampling来解决数据丢失问题。

    PS:当总体数据量不够时,除了简化模型,我们可以借鉴随机过采样的方法,对每个类进行过采样。具体到图像任务,还可以直接在图像空间进行变换,如可以通过对图像施加一定幅度的变换(旋转、平移、缩放、裁剪、填充、翻转、添加噪声、颜色变换、改变亮度、清晰度、对比度等),得到扩充的数据集。此外,迁移学习也是在小数据集上进行建模的好方法。

    PS:整体准确率不适用于不平衡数据集,需要引入新的度量模式比如G-mean, 它会看正类上的准确率,再看负类上的准确率,然后两者相乘取平方根。另外一种常见的度量如F-score

    类型转换处理前,我们先来看下数据的类型。

    数据类型可以简单划分为数值型和非数值型。数值型有连续型和离散型。非数值型有类别型和非类别型,其中类别型特征中如果类别存在排序问题为定序型,若不存在排序问题则为定类型,非类别型是字符串型。如下所示:

    1.连续型 Continuous

    Real values: Temperature, Height, Weight …

    2. 离散型 Discrete

    Integer values: Number of people …

    3. 定序型 Ordinal

    Rankings: {Average, Good, Best}, {Low, Medium, High} …

    4. 定类型 Nominal

    Symbols: {Teacher, Worker, Salesman}, {Red, Green, Blue} …

    5. 字符串型 String

    Text: “Tsinghua University”, “No. 123, Pingan Avenue” …

    对于非数值型,我们需要进行类别转换,即将非数值型转换为数值型,以方便机器学习算法后续处理。

    对于定序型,我们可以使用序号编码,如成绩,分为Average, Good, Best三档,序号编码可以按照大小关系对定序型特征赋予一个数值ID,例如Average表示为1,Good表示为2,Best表示为3,转换后依旧保留了大小关系。

    对于定类型,我们可以使用独热编码,如颜色三原色,为Red, Green, Blue,独热编码可以把三原色变为一个三维稀疏向量,Red表示为(0,0,1),Green表示为(0,1,0),Blue表示为(1,0,0)。需要注意的是,在类别值较多的情况下,可以使用稀疏向量来节省空间,目前大部分算法实现均接受稀疏向量形式的输入。当然还有很多别的编码方式,如二进制编码等,感兴趣的可以额外查阅资料了解。

    对于字符串型,我们有多种表示方式,如词袋模型(Bag of Words),TF-IDF(Term Frequency-Inverse),主题模型(Topic Model),词嵌入模型(Word Embedding)。各种表示有不同的适用场景和优缺点,需要进一步了解的可以额外查资料。

    经过类别转换后,我们所有的数据均转为了数值型。为了消除数据特征之间的量纲影响,我们需要对特征进行归一化处理,使不同指标之间具有可比性。例如,分析一个人的身高和体重对健康的影响,如果使用米(m)和千克(kg)作为单位,身高在1.6-1.8m的数值范围内,体重特征在50-100kg的数值范围内,分析出来的结果会倾向于数值差别较大的体重特征。对数值型特征进行归一化可以将所有特征都统一到一个大致相同的区间内,以便进行分析。归一化方式通常有线性函数归一化(Min-Max Scaling)和零均值归一化(Z-score Normalization)。当然,不是所有的机器学习算法需要对数值进行归一化,在实际应用中,通过梯度下降法求解的模型通常需要归一化,因为经过归一化后,梯度在不同特征上更新速度趋于一致,可以加快模型收敛速度。而决策树模型并不需要,以C4.5为例,决策树在节点分裂时主要依据数据集D关于特征x的信息增益比,而信息增益比跟特征是否经过归一化是无关的。

    ​​​​​​​譬如梯度和矩阵为核心的算法中,譬如逻辑回归,支持向量机,神经网络,无量纲化可以加快求解速度;而在距离类模型,譬如K近邻,K-Means聚类中,无量纲化可以帮我们提升模型精度,避免某一个取值范围特别大的特征对距离计算造成影响。(一个特例是决策树和树的集成算法们,对决策树我们不需要无量纲化,决策树可以把任意数据都处理得很好。)


    在数据描述阶段,我们可以根据需要计算统计量和对数据进行可视化。

    数据的一般性描述有meanmedianmodevariance.

    mean是均值;median是中位数,取数据排序后在中间位置的值,避免因为极端离群点影响客观评价;mode是出现频率最高的元素,其实用的比较少;variance是方差衡量数据集与其均值的偏离。

    数据之间的相关性可以使用Pearson correlation coefficient和Pearson chi-square进行度量。前者适用与有metric data的情况,后者适用于分类统计的情况。

    数据可视化一维数据圆饼图,柱状图;二维数据散点图;三维数据用三维坐标呈现;高维数据需要先做转换或映射,比如用matlab的Box Plots,也可以用平行坐标呈现。可使用工具有很多,如matlab和Geph。


    当我们做特定分析的时候,可能属性非常多,但有些属性是不相关的,有些属性是重复的,所以我们需要用特征选择挑选出来最相关的属性降低问题难度。

    我们可以通过熵增益(Entropy Information Gain)、分支定界(Branch and Bound)等方式进行特征选择。特征选择还有sequential forward, sequential backward, simulated annealing(模拟退火), tabu search(竞技搜索), genetic algorithms(遗传算法)等方式去优化。

    为了提高复杂关系的拟合能力,在特征工程中经常会把一些离散特征两两组合,构成高阶特征。如在点击率预测问题中,原始数据有语言和类型两种特征,为了提高拟合能力,语言和类型可以组合成二阶特征,联合预测对点击率的影响。如何找到有意义的组合特征?有一种方法是基于决策树的组合特征寻找方法。


    在机器学习中,数据通常需要表示为向量的形式进行训练,但是在对高维向量进行处理和分析时,会极大消耗系统资源,甚至产生维度灾难。因此,使用低维度的向量来表示高维度的向量就十分必要。特征抽取或降维即使用低纬度向量表示高维度向量的方法。

    特征抽取是主要有主成分分析(Principal Component Analysis,PCA)和线性判别分析(Linear Discriminant Analysis,LDA)两种方式。两者相同之处为均假设数据服从高斯分布,都使用了矩阵分解的思想。两者不同之处为PCA是无监督的算法,对降低后的维度无限制,其目标为投影方差最大;LDA是有监督的算法,降维后的维度小于类别数,其目标为类内方差最小,类间方差最大。


    以上为数据预处理的步骤,希望对正在进行实操的朋友有所帮助。

    Reference

    1. 袁博. 清华大学《数据挖掘:理论与算法》课件,学堂在线。
    2. Jeru_d39e. 数据挖掘:理论与算法笔记.
    3. 诸葛越等.《百面机器学习:算法工程师带你去面试》.
    4. 胡欢武.《机器学习基础:从入门到求职》.
    5. 高扬,卫峥, 尹会生等. 《白话大数据与机器学习》.
    展开全文
  • 数据预处理之数据变换

    简单函数变换

    在某些情况下,采取一些简单的函数变换对我们的建模会有所帮助。 比如:
    当使用线性回归模型无法很好地拟合数据时,先对数据做一个 log 变换(转换成 非线性模型),再进行拟合往往会有不错的效果;
    当数据跨度非常大时,数据较为稀疏,不便于计算机处理,此时对数据做一个 log10 变换可以使数据跨度变小,数据更为密集,方便运算。

     标准化变换

    标准化,又称规范化,目的是将原来的度量值转换为无量纲的值,使得不同量纲 的指标可以在同一水平线上进行比较,而且除了概率模型(树模型)之外,其他模型如神经网络、最邻近分类和聚类算法等,都需要先对数据进行标准化,以消除量纲,缩放数据,加快算法的收敛速度。
    MATLAB 提供了 normalize 函数对数据进行标准化,语法格式如下:
    N = normalize(A, dim, method, methodtype)
    A: 输入数据,指定为标量、向量、矩阵、多维数组、表或时间表。
    dim: 运算维度,默认为 1,按列进行标准化; 设为 2 则按行进行标准化。
    method: 字符型参数,默认为‘zscore’法,具体选项见下表:

     连续属性离散化: 也即离差标准化,公式如下:

    其中,m a x maxmax 和 m i n minmin 为样本数据的最大值和最小值。该方法保留了原始数据中存在的关系,是消除量纲和数据取值范围影响的最简单的方法,缺点是若数据值集中或某个数值很大,规范化后各值会接近 0 且相差不大。

    零-均值规范化: 即经过处理后均值为 0,标准差为 1,公式如下:

    该方法目前使用广泛,不过均值和标准差受离群点影响较大,因此通常需要修改上述变换,比如用中位数M代替均值,用绝对标准差 \delta =\sum \left | x-W \right |.其中,W为平均数或中位数。
    小数定标规范化: 通过移动属性值的小数位数,将属性值映射到 [-1,1] 之
    间,移动的小数位数取决于属性值绝对值的最大值。转化公式为:

    methodtype: 字符型参数,方法类型,为上一个参数“method”指定更加具体
    的方法类型,具体选项见下表:

     分类变量处理

    在数据挖掘过程中,算法可以直接处理数值型变量,但是算法一般无法直接处理分类变量。 分类变量没有好坏多少之分,多用 0,1,2,等数值代表一个类型,如果直接引入模型中计算容易让计算机误以为这是一个数值型变量,从而出现错误。 因此,在训练模型之前,需要对分类变量进行处理,使之转换为数值型变量。 常 见的分类变量处理方法如下:

     这里介绍一下比较热门的独热编码(one-hot Encoding):

    独热编码是一种将分类变量转换为若干二进制列的方法,其中 1 表示属于该类别的样本

     MATLAB实现方法:

    function data_encoded = onehot(data) 
    % 独热编码函数,将分类变量转换若干二进制列
    % 输入:分类变量组成的数组 data,注意数组元素均需为整数 
    % 输出:编码好的数组 data_encoded 
    test = abs(rem(data,1)); 
    if sum(sum(test)) ~= 0 
    fprintf('数组元素必须全为整数!\n' 
    return 
    end 
    [m, n] = size(data); 
    data_encoded = []; 
    for k = 1:n 
        d = data(:,k); 
        labels = unique(d); %d 的类别 
    num_labels = length(labels); %类别个数 
    data_encoding = zeros(m,num_labels); 
        for i = 1:m 
            for j = 1:num_labels 
                if d(i) == labels(j) 
                   data_encoding(i,j) = 1; 
                else
                   continue 
                end 
            end 
        end 
        data_encoded =[data_encoded,data_encoding]; 
    end
    
    可以在MATLAB 命令行窗口中输入以下代码试运行onehot函数:
    x = randi(3,5,1)
    y = onehot(x)

    先将onehot算法保存到matlab的默认工作路径,然后在命令行试运行。

    连续变量离散化

    连续变量离散化(又称数据分箱),是一种数据预处理方法,用于减少次要观察误差对模型的影响,降低模型过拟合的风险,使模型更加稳定。 但并非所有问题都需要做数据分箱,主要在一些分类算法中,如决策树 ID3 算法,要求自变量 都是离散型。 常见的连续变量离散化方法主要有以下三类:

    (1)等宽法: 将属性的值域分成具有相同宽度的区间,区间的个数由数据本身 的特点决定或者用户指定,类似于制作频率分布表。
    (2)等频法: 将相同数量的记录放进每个区间。 上述两个方法操作简单但都需要人为地规定划分区间的个数,等宽法的缺点在于对离群点比较敏感,因为离群点的出现会使得有些区间包含许多数据而另一些则数据很少,这样会严重损害所建立的决策模型。等频法避免了该问题,但却可能将相同数据值分到不同的区间以满足每个区间中固定的数据个数。
    (3)(一维)聚类分析法: 首先将连续属性的值用聚类算法(如 K-Means)进行聚类,然后再将聚类得到的簇进行处理,合并得到一个簇的连续属性值做同一标记。
    MATLAB 提供了 discretize 函数以实现等宽法分箱。
    [Y,E] = discretize(X,N)
    输入数组 X,将数组划分为 N 个宽度一致的区间(即“箱”,bin)
    输出数组每个元素所在的区间的序号 Y,以及每个区间的边界 E
    每个区间默认包含左边界,即 a <= x < b
    Y = discretize(X,edges, ‘IncludedEdge’,side)
    输入数组 X,按照 edges 进行分箱;
    edges: 区间边界,输入为值递增的数值向量。 edges 中的连续元素形成离散的区间,discretize 使用这些区间 划分 X 中的数据。 默认情况下,每个区间都包括区间的左边界,除了最后一个区间,它包含区间的左右边界。
    ‘IncludedEdge’: 指定每个区间包含的边界。 side 为数值型参数,默认为’ left’,每个区间包含左边界,a <= x < b; 设为’right’则每个区间包含右 边界,即 a < x << span="">= b。
    举 2 个栗子:
    % 等宽法分箱
    X = randi(10,1,10)
    [Y,E] = discretize(X,3) 
    % 自定义每个区间的边界进行分箱 
    data = [1 1 2 3 6 5 8 10 4 4] 
    edges = 2:2:10 
    Y = discretize(data,edges)
    Y 表示数据的每个元素属于哪个 bin。 由于值 1 超出了区间范围,因此 Y 会
    在这些元素位置包含 NaN 值。

     可以直接用,不用提前保存脚本算法。

     

     

    展开全文
  • 数据预处理Part1——数据清洗

    万次阅读 多人点赞 2020-05-22 14:48:54
    数据清洗过程中,主要处理的是**缺失值**、**异常值**和**重复值**。所谓清洗,是对数据集通过丢弃、填充、替换、去重等操作。达到去除异常、纠正错误、补足缺失的目的。
  • ↑↑↑点击上方蓝字,回复资料,嘿嘿,10个G的惊喜本文简单介绍python中一些常见数据预处理包括数据加载、缺失值处理、异常值处理、描述性变量转换为数值型、训练集测试集划分、数据规范化。1、 加载数据 1.1 ...
  • 数据预处理

    2021-08-16 18:00:29
    数据预处理一般包括:重复值处理、缺失值处理、异常值处理等。 二、数据预处理前标签数据处理 三、数据预处理过程及代码 (一)重复值处理 对于重复值数据,一般直接剔除重复值,仅保留一条数据。 ...
  • Python数据分析-数据预处理

    千次阅读 2022-05-12 22:36:03
    数据预处理 1.前言 数据质量分析是数据预处理的前提,是数据挖掘分析结论有效性和准确性的基础,其主要任务是检查原始数据中是否存在脏数据,脏数据一般指的是不符合要求的,以及不能直接进行相应分析的数据。 脏...
  • 数据预处理详解

    千次阅读 2021-03-07 13:46:34
    数据预处理是数据分析和数据运营过程中的重要环节,它直接决定了后期所有数据工作的质量和价值输出 数据清洗 数据转换 数据抽样 Python数据清洗(代码实现) 缺失值处理 :...
  • 数据预处理过程

    万次阅读 多人点赞 2018-12-27 16:50:05
    数据预处理过程会占用很多时间,虽然麻烦但也是必不可少且非常重要的一步。在数据能用于计算的前提下,我们希望数据预处理过程能够提升分析结果的准确性、缩短计算过程,这是数据预处理的目的。本文只说明这些预处理...
  • 数据预处理和特征选择

    千次阅读 2022-03-11 10:45:56
    更重要的是,这篇文章会详尽的讲解数据预处理和特征选择的原理及方法细节。 数据是什么? 通过观察、实验或计算得出的结果。例:数字、文字、图像、声音等。 数据分析是什么? 把隐藏在数据背后的信息集中...
  • 数据预处理主要有四个任务:数据清洗、数据集成、数据变换及数据规约。本文主要介绍常用的数据清洗与数据变换,其中数据清洗包括异常值与缺失值的处理;数据变换指将一种格式的数据转换为另一格式的数据。以上就是在...
  • 作者主页(文火冰糖的硅基工坊):文火冰糖...第2章 数据预处理常见方法 2.1 缺失值的处理 2.2数据无量纲转换 2.3 连续型特征的二值化与分段 2.4分类型特征的编码 第1章 什么是数据预处理 1.1 数据挖掘的五大...
  • 1.2 常见数据预处理方法数据清洗:数据清洗的目的不只是要消除错误、冗余和数据噪音,还要能将按不同的、不兼容的规则所得的各种数据集一致起来。数据集成:将多个数据源中的数据合并,并存放到一个一致的数据存储...
  • 数据挖掘:数据预处理相关概念

    千次阅读 2020-02-19 19:26:18
    数据挖掘:数据预处理相关概念 一、什么是数据预处理? 一般我们得到的数据会存在有缺失值、重复值等,在使用之前需要进行数据预处理。它是一系列对数据操作的统称。 数据预处理没有标准的流程,通常针对不同的任务...
  • 数据整理是数据预处理的重要扩展。它最适合在可视化分析工具中使用,这能够避免分析流程被打断。可视化分析工具与开源数据科学组件之间,如R、Python、KNIME、RapidMiner互为补充。避免过多地使用组件能够加速数据...
  • 数据预处理的方法有哪些

    万次阅读 2020-08-12 14:02:54
    那么,数据预处理的方法是什么呢?例如数据清理、数据集成、数据规范、数据转换等,其中最常用的是数据清理和数据集成,下面中琛魔方将来详细介绍一下这2种方法。  数据预处理的方法  1、数据清洗  ...
  • 机器学习中的数据预处理方法与步骤

    千次阅读 多人点赞 2022-06-02 00:02:27
    机器学习预处理详细方法
  • 数据预处理的几种方法

    千次阅读 2020-02-08 08:30:00
     文本数据预处理后,去掉停用词,剩下的词组成的list,在词库中的映射稀疏向量。Python中用CountVectorizer处理词袋.  以下是Gutenberg项目中 Charles Dickens的《双城记》 一书中的前几行文字。 “It was ...
  • 1 数据预处理 数据预处理大致分为三个步骤:数据的准备、数据的转换、数据的输出。 1.1 格式化数据 scikit-learn提供了适合和多重变换(Fit and Multiple Transform)和适合和变换组合(Combined Fit-and-...
  • 数据分析之数据预处理、分析建模、可视化

    万次阅读 多人点赞 2020-08-08 15:03:21
    数据预处理:数据清洗、数据集成、数据规约、数据变换; 数据分析模型:对比分析、漏斗分析、留存分析、A/B测试、用户行为路径分析、用户分群、用户画像分析等; 数据分析方法:描述统计、假设检验、信度分析、相关...
  • 数据预处理的四种方式

    万次阅读 2018-10-19 14:22:15
    数据预处理 调整数据尺寸 让所有的属性按照相同的尺度来度量数据; 梯度下降算法 神经网络 SVM 回归算法 K 近邻算法 # 调整数据尺度(0..) import pandas as pd import numpy as np from sklearn.preprocessing ...
  • 盘点七大机器学习预处理方法和原理,包含数据规范化、类别平衡化、连续值离散化、缺失值处理、哑言编码、正则化、数据降维等
  • 数据预处理——数据清洗

    万次阅读 2018-05-10 20:46:04
    在数据挖掘中,海量的原始数据中存在着大量不完整、不一致、有异常的数据,严重影响到数据挖掘建模的执行效率,甚至可能导致挖掘结果的偏差,所以...数据预处理的主要内容包括数据清洗、数据集成、数据变换和数据...
  • 数据预处理涉及的步骤:导入所需的库导入数据集处理缺失的数据。编码分类数据。将数据集拆分为测试集和训练集。特征缩放。那么让我们逐一学习这些步骤。步骤1:导入所需的库你先需要下载此数据集:Data.csv每...
  • 数据预处理方法

    千次阅读 2019-03-10 01:30:54
    下面主要针对数据预处理方面入手整理一些常用的方法。数据预处理分为四步,数据清理、数据变换和变量筛选。 一、数据清理 主要根据探索性分析后得到的一些结论入手,然后主要对四类异常数据进行处理;分别是缺失值...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 64,129
精华内容 25,651
热门标签
关键字:

常见数据预处理包括