标签:吐槽 数据可视化 因此 建模 常见 数据信息 python 集合 需要
首先,需要明确数据准备这一步骤的重要性。
2017年开始,人工智能被吵的热火朝天,又因为Python的易学性和机器学习库及框架所带来的便利性,机器学习和深度学习的入门几乎零门槛,现在人人都跟风搞AI(作为真正致力于数据与算法的博主非常反感这样的现象,但也只能无奈了=。=)。然而,大部分注意力都被集中在了算法与模型的选择上,却忽略了数据准备这一步骤对于算法及模型最后结果的影响。可以说,没有好的数据准备,算法很可能无法充分发挥作用,模型很可能Garbage in, garbage out。其实在模型的选择上,只要出现理论性的偏差(例如非要把回归当分类处理=。=),最后不同模型结果的差距一般不会很离谱,即模型与算法的选择多半决定结果的上限(例如准确率的提升)。但是下限在哪呢?这就是数据准备的作用,可以理解为数据预处理。如果不把数据处理好,敢问结果的上限能有多好呢?可以说在数据准备->数据分析->数据建模->模型训练->模型优化->模型上线,这样一个流水线下,数据准备所花的精力可能会达到一半。然鹅真的有不少跟风的童鞋们都忽略了这个极其关键的步骤。博主身边有不少刚开始接触算法的童鞋,把西瓜书花书蓝皮书作为读物,的确书中的模型推导是很重要,这确实是一个数据算法工程师的必备技能。但是之所以需要我们推导模型,是因为已经有了数据的支撑。如果没有好的数据,手撕模型能撕出个花来?真正的算法工程师并不是只负责手撕算法。。
好了不吐槽了,进入正题。。
首先,可以通俗的将数据准备分为2个大部分:数据清洗、特征工程。
数据清洗
也就是平时常说的洗数据。之所以需要这步,是因为现实中得到的数据可能会有各种各样难搞的问题:数据缺失、数据光滑、数据不平衡,数据变换、数据归约、数据分配等等。
数据缺失:常见的处理方式如下:
直接丢弃该样本:数据量很大的时候可行,数据量小的时候就不适合了,会造成数据过少、数据分布有偏等问题。
人工填充:不谈了,海量数据怎么可能呢。。
使用同属性均值、中位数、众数等填充:比较简单的方法,在保证数据完整性与损失数据信息之间取得了一定的平衡。
使用统计方法估计缺失数据:对该属性的整体数据建模(回归、贝叶斯、EM算法等),估计出最有可能的值,比较不错且科学的方法。
数据光滑:一是对数据去噪,二是针对离群点的处理,常见的处理方式如下:
回归:去噪的一种,通过拟合来得到光滑数据。
分箱:去噪的一种,是局部光滑技术。箱的分法有等宽分箱(指取值等宽)、等频分箱(指样本个数等频)等,在箱中用于光滑数据的方法有取箱均值、箱边界、箱中位数等。
数据可视化:通过绘制数据图表找出离群点的范围,好处是直观,不过不够标准化,而且维度大于3时很难可视化。
聚类:不在簇集合内的视为离群点,常用。
数值-均值<=2倍标准差:将与平均值的偏差超过两倍标准差的数据视为离群点,常用。
数据不平衡:即数据量小+正负样本不平衡的各种情况。常见的处理方式如下:
采样:上采样(小众类反复选取,可能会过拟合,所以加入随机扰动)/下采样(大众类剔除部分,可能会欠拟合,所以有例如EasyEnsemble的方法,类似Random Forest的理念),上采样一般更好。
加权:类似Boosting的理念,效果一般不如采样。
数据合成:面对数据量比较小的情况适用,例如SMOTE方法,利用将原有数据视作近邻,加入随机扰动项合成新的数据。
一分类:在正负样本量悬殊极大的情况下可以将问题转换为一分类问题进行建模,不在该分类内的视为异常点。
数据变换:即将数据变换至需要的形式或范围,常见的处理方式如下:
最大最小归一化:新值=(原始值-min)/(max-min),可将数据化至[0,1]区间。比较不稳定的地方在于会受异常值的影响,好处是能够反应更多数据中潜在的关系。
z-score标准化:新值=(原始值-均值)/标准差,可将数据化至均值为0,标准差为1的分布,常用,且能够在计算距离时让不同属性发挥等效的作用。
小数定标标准化:即将原始值缩小10的N次方(N自取)。
离散化:其实和数据光滑中的分箱法一个道理。
聚合:顾名思义,将多种属性聚集在一起视为一种属性。
数据归约:即使用归约技术,得到量更小而不失完整性的数据,常见的处理方式如下:
数值归约:使用回归、聚类、抽样(放回随机/不放回随机/分层抽样等)等方式得到更小而不失完整性的数据。
离散化、概念分层:离散化参考数据变换中的离散化;概念分层指用高层次概念替换低层次概念,以此减少特征数量(比较抽象)。
数据压缩:使用编码变换数据,得到更小的数据。无损压缩:参见音频上的众多无损压缩算法;有损压缩:小波变换、PCA等。
维度归约:需要检查特征之间的相关性,去除弱相关以下及冗余的特征,可以通过相关系数(连续型)、卡方检验(离散型)等计算相关性。
数据分配:即训练集、验证集、测试集的分配,常见的处理方式如下:
留出法:将数据分为几个部分,分别用于训练、验证、测试。其实没啥不好的,就是数据量小的时候不太好用。
交叉验证法:大名鼎鼎的交叉验证,将数据分为若干份(所以也叫k折交叉验证法),循环选取,分别用于训练、验证、测试,由于训练测试了多次,因此最后结果取均值。
特征工程
特征工程这部分和上面数据清洗有一部分是重合的,例如将特征离散化,将特征维度压缩等。但这么写不太好分类,所以在这里也会写上一部分类似的内容。
其实特征工程里可能最关注的问题在于降维,因此先说降维。
明天再更。。。
标签:吐槽 数据可视化 因此 建模 常见 数据信息 python 集合 需要
原文地址:https://www.cnblogs.com/leegendlee/p/8901955.html