学习笔记:数据分析和处理(ML计算模型前的预处理)——持续更新

数据分析和处理,其实就是你计算模型前的预处理步骤。一个不合理的错误数据如果不在预处理的时候剔除,可能会对最终结果造成非常大的影响

在很多时候,如果你换了能换的所有模型和参数,最后计算得到的模型的交叉验证误差一直不令人满意,非常可能是你的数据预处理没做好。

 

数据分析与处理是紧密相关的,这像是句废话,因为你既然分析到了数据不合理的地方自然是要进行相关处理的。

但可能是我还太菜,有时候比如你分析到了数据分布非正态化(即数值的count不是理想化的分布的时候),即使采用log/sin/cos/reciprocal transformation,也不一定就可以直接得到理想的高斯分布,例如我做课程设计的时候会遇到log transformation之后数据还是出现偏态分布的情况。

至于是否可以将transformation复合使用得到最理想的分布情况,就有待大神解答,我个人猜想太纠结这个也可能会引起过拟合(overfitting)

 

本文假设你现在在kaggle上面对一个数据集,想通过train set得到模型。

首先要对数据集的总体有个了解,就是summary:

import pandas as pd
import numpy as np

df=pd.read_csv('./train.csv')

df.shape#看看数据集有几行几列

df.dtypes#看看每列的数据类型是什么

df.head()#看看前几列数据,对数据具体长啥球样有个概念

 那么预处理目前我总结的有:

1. 缺失值

df_train.isnull().sum(axis=0)

这个就俗称靠常识吧我觉得,首先是了解数据集的场景,可能看kaggle里面的说明description。

有些null值可能是二元分类的变量值,比方说,加入Boston数据集(一个公开的Boston房价的数据集)有一列是这个房子有没有花园,那可能’yes‘他就填了个1,’no‘他就干脆不写了,这个时候null值就要填充0,之后或许还对这一列做encoding。

还有可能某一列是连续的值(非离散的),只是0的时候他没写,那这时候对null填充0就非常必要。

不过有时候一些数据就是缺少信息,这时候就考虑要不要把这一个object删掉了

2. 独热编码(One hot encoding)

这个东西感觉还是很有东西的,而且我也还在学习中,可能说的不对。

主要的思想其实是把某列不可用数值表示的列做成数列二元变量(yes or not)。

比如,我做过一个共享单车实时出租量的kaggle,其中有一列是当前的季节,他分别用1、2、3、4表示春夏秋冬。

但我们实际上可以想到,春夏秋冬是四个相对独立的情况,是不宜使用1、2、3、4来表示的,这样数值化之后模型可能会认为 " 冬>春 ”, " 冬=2*夏 ”等等很不合理的情况。

这时候我们可以把季节这一列分为四列,分别为“是否为春/夏/秋/冬” ,数值就可以用1表示是,0表示不是,进行二元分类。

不过这个在树模型里面好像不是很敏感,(我也还没完全理解)或许是随机森林、Boost类的模型在各结点分到child node的时候,看到这列都是1、2、3、4会自动识别为4个元的分类??希望大神解答一下。但我感觉逻辑回归的时候还是有影响的。

 

3. Outliers,干扰项

非常直观地重要,换句话说,其实就是鉴别哪些object应该被剔除。

你想想如果有个object其实是个不合理的数据,你的模型还想方设法去fit这个对象,可想而知这个模型可能就会因为这几颗老鼠屎而毁掉了。

我理解,剔除outliers分为两种:一种是预处理期间的剔除;一种是得到模型后,根据残差的分布模型去检验outliers。

这篇先说预处理的剔除outliers吧。

我接触过两种方式:

一种是高斯分布图(histogram)

我们生活其实正态分布非常常见,比如你掷10000次硬币,重复1000次“掷10000次硬币”这个行为(当然没人这么闲,是个假设)。

根据结果建立一个“横坐标是正面的次数,纵坐标是1000次循环中出现的次数”。

简单想象一下,最符合理想模型的其实是个正态分布,在这个分布图中,横坐标是5000的对应值应该是最高的,因为概率55开。

这时候如果你发现画出来后,分布图前半段好好的,但是出现了好几次“10000次都是正面的”的情况,就是横坐标为10000的样本出现了好几个。

于是你怀疑是你自己在那几个循环里面数晕了,看什么都是正面,因为这几个情况非常的不合情理,所以应该把他们剔除掉。

在实际项目中,对预测值做高斯分布图,如果横坐标的高位值拉的很远,明明前面的分布到了100左右就接近尾声了,结果横坐标拉到了一万甚至十万,这时候就要考虑这个值是不是不合理了。

一种是箱线图(box plot)

这个我也很好奇为什么可以用来剔除outliers,先留点白,以后来详细解释。

贴学习链接:谷歌前置的box plot技术贴

 

4. 数据分布(distribution of data)

理想的数据分布常常是正态分布(不过也有一些情况的理想模型泊松分布之类的,比如高速ETC的车流量,这个我印象大一美赛的时候是这么说的)

那如果不是正态分布怎么办呢,那就想办法把他整成正态分布。

方法有:log变化、正反弦变化、倒数变化、平方或平方根变化等等。

整容前:

log变化,整容后:

右边的那幅图是QQ图(quantile-quantile plot),wiki:https://en.wikipedia.org/wiki/Q%E2%80%93Q_plot

调用代码是

from scipy import stats
stats.probplot(df['count'],dist='norm', fit=True)

大体意思就是用来形容分布拟合正态分布的程度的,我还没深入学,我也标记一下,等最近考试完继续,嘻嘻!

 

5. 变量的共线性(correlation)

Pandas.corr()可以直接计算。

背后算法:

也就是这个这两个系数存在关联的可能性是多大,越接近1或-1,就说明越相关。

例子1:比如还是kaggle共享单车的proj。里头用来预测的变量,已经有了室温,还搞个体感温度,两个变量的corr高达0.98,实属没必要,而且还可能会影响最终结果,所以可以选择剔除体感温度。

例子2:有的时候是一些泄露数据,leakage data,这个也不能被忽视,就是跟预测结果直接相关的数据,这些变量的训练模型的大忌,会使得你的模型完全无意义。比如你预测某商场的客流量,但变量里有个”商场的厕所用水量“,虽然是搞笑,但是你细想就知道这两者是铁钉钉的有联系。我的本意是通过今天的天气,今天是不是工作日,今天的温度等等因素来预测商场的客流量,你都拿厕所用水量预测了,这个预测还有意义吗?这个厕所用水量是跟客流量一起出现的结果,是我们预测事先所不可能知道的。

 

 

差不多先到这把,嘻嘻!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值