ps:本笔记是因为在完善模型时将自己的数据集代入会引发很多的错误,例如:缺省值对函数运算造成的报错,通过数据转换后数据形状不匹配,导致预测结果无法正确生成等等,因此我打算正式的学习一下有关数据处理的相关知识,而不是和之前一样,在借鉴的模型中有用到的才去查询相关的信息。主要以python中对机器学习的数据处理。
一、数据处理概念
数据预处理是指在应用机器学习算法之前,对原始数据进行清洗、转换和处理的过程。这包括了数据清洗、特征选择、特征变换、数据标准化等多个步骤。数据预处理的目的是使原始数据更适合于机器学习模型的训练和应用,从而提高模型的准确性和泛化能力
以下是一些常见的数据处理步骤:
1.数据收集:收集原始数据,这可能涉及到从数据库中查询数据、爬取网页、使用传感器采集数据等。
2.数据清洗:清洗数据以去除错误、不一致或缺失的数据。这可能包括填充缺失值、移除异常值、解决重复数据等。
3.数据转换:将原始数据转换成适合机器学习模型处理的形式。例如,将文本数据转换成数值型数据、对数据进行归一化或标准化等。
4.特征工程:提取、构建或选择适当的特征,以帮助模型更好地理解数据。这可能涉及到对原始特征进行组合、降维、离散化等操作。
5.数据分割:将数据集划分为训练集、验证集和测试集。训练集用于训练模型,验证集用于调整模型超参数,测试集用于评估模型的性能。
6.数据增强:在训练模型之前,通过对原始数据进行变换、扩充等操作来增加数据样本的多样性,以提高模型的泛化能力。
7.特征选择:根据特征的重要性或相关性,选择最具代表性的特征,以减少模型的复杂性并提高性能。
8.数据可视化:通过可视化工具对数据进行探索性分析,以帮助理解数据的分布、关联性和特征重要性等。
二、数据处理分类
在进行数据处理前应判断具体的处理操作类型例如缺省值,异常值,重复值等等
我手上以后数据集中目前已知出现了缺省值和异常值。
缺省值
分为随机丢失,完全随机丢失,非随机丢失。
在前两种情况下可以根据其出现情况删除缺失值的数据,同时,随机缺失可以通过已知变量对缺失值进行估计。
在第三种情况下,删除包含缺失值的数据可能会导致模型出现偏差,同时,对数据进行填充也需要格外谨慎。
下图为转载知乎博主的大纲图(链接在文末):
基于本人自己参加的项目来说,主要对插补方法进行深入讨论。
我已有数据集为时间序列的问题,并且有一定趋势和季节性的特征,根据此图应采取季节性调整和插值的方法。
对于多种填补方法,我选取一下这些方法来讨论;
平均值填充(Mean/Mode Completer)
将初始数据集中的属性分为数值属性和非数值属性来分别进行处理。
如果空值是数值型的,就根据该属性在其他所有对象的取值的平均值来填充该缺失的属性值; 如果空值是非数值型的,就根据统计学中的众数原理,用该属性在其他所有对象的取值次数最多的值(即出现频率最高的值)来补齐该缺失的属性值。
与其相似的另一种方法叫条件平均值填充法(Conditional Mean Completer)。在该方法中,用于求平均的值并不是从数据集的所有对象中取,而是从与该对象具有相同决策属性值的对象中取得。这两种数据的补齐方法,其基本的出发点都是一样的,以最大概率可能的取值来补充缺失的属性值,只是在具体方法上有一点不同。与其他方法相比,它是用现存数据的多数信息来推测缺失值。
回归(Regression)
基于完整的数据集,建立回归方程,或利用机器学习中的回归算法。对于包含空值的对象,将已知属性值代入方程来估计未知属性值,以此估计值来进行填充。当变量不是线性相关时会导致有偏差的估计。较常用。
多重插补(Multiple Imputation,MI)
多重填补方法分为三个步骤:
(1)插补:将不完整数据集缺失的观测行估算填充m次(图中m=3)。请注意,填充值是从某种分布中提取的。模拟随机抽取并不包含模型参数的不确定性。更好的方法是采用马尔科夫链蒙特卡洛模拟(MCMC,Markov Chain Monte Carlo Simulation)。这一步骤将生成m个完整的数据集。
(2)分析:分别对(m个)每一个完整数据集进行分析。
(3)合并:对来自各个填补数据集的结果进行综合,产生最终的统计推断,这一推断考虑到了由于数据填补而产生的不确定性。该方法将空缺值视为随机样本,这样计算出来的统计推断可能受到空缺值的不确定性的影响
其中常用方法为mice
MICE(Multiple Imputation by Chained Equations)是一种常用的填充缺失数据的技术。它通过将待填充的数据集中的每个缺失值视为一个待估计的参数,然后使用其他观察到的变量进行预测。对于每个缺失值,通过从生成的多个填充数据集中随机选择一个值来进行填充。通常会重复这个过程多次以增加填充的稳定性。
主要分为两个步骤
多重插补(Multiple Imputation):MICE通过多次生成填充数据集来处理缺失数据。在每次迭代中,它将缺失值填充为估计的值,然后将完整的数据集用于下一次迭代,从而产生多个填充的数据集。
链式方程(Chained Equations):MICE使用链式方程的方法进行填充。它将待填充的缺失值视为需要估计的参数,然后使用其他已知的变量作为预测变量,通过建立一系列的预测方程来进行填充。每个变量的填充都依赖于其他变量的估计值,形成一个链式的填充过程。
在python中也同样含有MICE的库供我们直接调用
使用MICE对数据集缺失值进行填充
1.分别读取train/test数据
2.合并训练测试集
3.使用MICE对缺失值进行填充
4.填充后数据重新划分为训练集/测试集
#1.分别读取训练/测试数据为dataframe格式
train = pd.read_csv(r"D:\data\train.csv",encoding="utf-8")
test = pd.read_csv(r"D:\data\test.csv",encoding="utf-8")
#2.训练/测试数据集合并
df = train.append(test)
#3.使用MICE填充缺失值
mice = MICE()
new_df = mice.complete(np.asarray(df.values, dtype=float))
#4.将填充后的数据集重新划分为训练/测试集
columns = train.columns.tolist()
train_shape = train.shape[0]
df_train = pd.DataFrame(new_df[:train_shape,:],columns=columns)
df_test = pd.DataFrame(new_df[train_shape:,:],columns=columns)
异常值
以下内容转载知乎博主,链接在文末
异常值是指那些在数据集中存在的不合理的值,需要注意的是,不合理的值是偏离正常范围的值,不是错误值。比如人的身高为-1m,人的体重为1吨等,都属于异常值的范围。虽然异常值不常出现,但是又会对实际项目分析有影响,造成结果的偏差,所以在数据挖掘的过程中不能不重视
异常值检测
1.简单统计分析:最常用的统计量是最大值和最小值,用来判断这个变量的取值是否超出合理的范围。
2:3σ原则:3σ原则是建立在正态分布的等精度重复测量基础上而造成奇异数据的干扰或噪声难以满足正态分布。
3.箱线图:箱线图是通过数据集的四分位数形成的图形化描述,是非常简单而且效的可视化离群点的一种方法
异常值处理
1.删除:直接将含有异常值的记录删除,通常有两种策略:整条删除和成对删除。这种方法最简单简单易行,但缺点也不容忽视,一是在观测值很少的情况下,这种删除操作会造成样本量不足;二是,直接删除、可能会对变量的原有分布造成影响,从而导致统计模型不稳定。
2.视为缺失值:利用处理缺失值的方法来处理。这一方法的好处是能够利用现有变量的信息,来填补异常值。需要注意的是,将该异常值作为缺失值处理,需要根据该异常值(缺失值)的特点来进行,针对该异常值(缺失值)是完全随机缺失、随机缺失还是非随机缺失的不同情况进行不同处理。
3.平均值修正:如果数据的样本量很小的话,也可用前后两个观测值的平均值来修正该异常值。这其实是一种比较折中的方法,大部分的参数方法是针对均值来建模的,用平均值来修正,优点是能克服了丢失样本的缺陷,缺点是丢失了样本“特色”。
4.盖帽法:整行替换数据框里99%以上和1%以下的点,将99%以上的点值=99%的点值;小于1%的点值=1%的点值。
5.分箱法:分箱法通过考察数据的“近邻”来光滑有序数据的值。有序值分布到一些桶或箱中。包括等深分箱:每个分箱中的样本量一致;等宽分箱:每个分箱中的取值范围一致。
6.回归插补:发现两个相关的变量之间的变化模式,通过使数据适合一个函数来平滑数据。若是变量之间存在依赖关系,也就是y=f(x),那么就可以设法求出依赖关系f,再根据x来预测y,这也是回归问题的实质。实际问题中更常为见的假设是p(y)=N(f(x)),N为正态分布。假设y是观测值并且存在噪声数据,根据我们求出的x和y之间的依赖关系,再根据x来更新y的值,这样就能去除其中的随机噪声,这就是回归去噪的原理 。
7.多重插补:多重插补的处理有两个要点:先删除Y变量的缺失值然后插补
1)被解释变量有缺失值的观测不能填补,只能删除,不能自己乱补;
2)只对放入模型的解释变量进行插补。
8.不处理:根据该异常值的性质特点,使用更加稳健模型来修饰,然后直接在该数据集上进行数据挖掘。
三、python中的数据处理
本文介绍numpy和pandas,常用的数据处理库
Numpy
Numpy 是python科学计算的基础包,本书大部分内容都基于numpy以及构建于其上的库。其功能有:
快速高效的多维数组对象ndarray
用于对数组执行元素级计算以及直接对数组执行数字运算的函数
用于读写硬盘上基于数组的数据集的工具
线性代数运算,傅里叶变换,以及随机数生成
用于将C,C++,Fortran代码集成到python的工具
除了为python提供快速的数组处理能力,numpy在数据分析方面还有一个主要作用,即作为在算法之间传递数据的容器。对于数值型数据,numpy 数组在储存和处理数据时要比内置的python数据结构高效得多。
Pandas
Pandas提供了使我们能够快速便捷地处理结构化数据的大量数据结构和函数。它是使python成为强大而高效的数据分析环境的重要因素之一。本书用的最多的pandas对象是dataframe,它是一个面向列的二维表结构,且含有行标和列标。
Pandas兼具numpy高性能的数组计算功能以及电子表格和关系型数据库(SQL)灵活的数据处理功能。它提供了复杂精细的索引功能,以便更为便捷地完成重塑,切片和切块聚合以及选取数据子集等操作。
详细具体用法近期更新
参考/转载:
数据分析——缺失值处理详解(理论篇) - 知乎 (zhihu.com)
Python使用MICE填充缺失值的简单实现_python mice-CSDN博客