数据预处理流程

article/2025/8/14 21:55:16

数据预处理流程总结

下面分享一下自己通常会用到的一些数据预处理的方法和步骤,用Kaggle平台上的elo用户忠诚度预测的数据集作为应用案例。

在这里插入图片描述

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
merchant = pd.read_csv(r'\原始数据\elo-merchant-category-recommendation\merchants.csv', header=0)

一、初步探索

拿到一份数据,首先要确定样本大小、特征个数、字段类型这些基本信息。用.info()可以初步得到数据集的这些信息

merchant.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 334696 entries, 0 to 334695
Data columns (total 22 columns):#   Column                       Non-Null Count   Dtype  
---  ------                       --------------   -----  0   merchant_id                  334696 non-null  object 1   merchant_group_id            334696 non-null  int64  2   merchant_category_id         334696 non-null  int64  3   subsector_id                 334696 non-null  int64  4   numerical_1                  334696 non-null  float645   numerical_2                  334696 non-null  float646   category_1                   334696 non-null  object 7   most_recent_sales_range      334696 non-null  object 8   most_recent_purchases_range  334696 non-null  object 9   avg_sales_lag3               334683 non-null  float6410  avg_purchases_lag3           334696 non-null  float6411  active_months_lag3           334696 non-null  int64  12  avg_sales_lag6               334683 non-null  float6413  avg_purchases_lag6           334696 non-null  float6414  active_months_lag6           334696 non-null  int64  15  avg_sales_lag12              334683 non-null  float6416  avg_purchases_lag12          334696 non-null  float6417  active_months_lag12          334696 non-null  int64  18  category_4                   334696 non-null  object 19  city_id                      334696 non-null  int64  20  state_id                     334696 non-null  int64  21  category_2                   322809 non-null  float64
dtypes: float64(9), int64(8), object(5)
memory usage: 56.2+ MB

用.info()搞清楚哪些是分类变量,哪些是数值型变量,分类进行处理。可以先把变量名分类放入category_cols、numeric_cols两个列表中,等待后续操作。

由于object类型变量中有一些离散型变量,之后要把它们的取值映射到数值上(比如category_1有3个取值,分别是A 、B、C,无法直接对它们进行建模计算,要把它们分别转化成0、1、2),也可以把这样的object型变量名存放起来。

category_cols = ['merchant_id', 'merchant_group_id', 'merchant_category_id','subsector_id', 'category_1','most_recent_sales_range', 'most_recent_purchases_range','category_4', 'city_id', 'state_id', 'category_2']
numeric_cols = ['numerical_1', 'numerical_2','avg_sales_lag3', 'avg_purchases_lag3', 'active_months_lag3','avg_sales_lag6', 'avg_purchases_lag6', 'active_months_lag6','avg_sales_lag12', 'avg_purchases_lag12', 'active_months_lag12']
object_cols = ['category_1','most_recent_sales_range','most_recent_purchases_range','category_4' ]

二、正确性校验

2.1 样本重复性检验

一般多用于数据中的样本ID重复性检验,有些数据里面的样本id是不允许重复的,比如订单ID在电商系统中是不会重复使用的,这样的数据集中就不该有重复的样本id,没有重复的订单ID,才算是一份比较漂亮的数据。电商数据中,重复的订单ID可能说明以下两个事实:(1)样本中有大量重复数据(2)数据中的每条样本并不是订单,而是订单中的一个商品,因此标签中的异常实际上可能是“这笔交易的异常”,而不是整个订单的异常(如果是这种情况,数据预处理就会比较困难了)

而有些情况下,样本id重复是被允许的,比如在本文使用的这个例子当中,商户信息数据集中,商户id有重复,因为一些商户进行了业务更新;在一些信用卡交易记录数据中,每张信用卡可以交易多次,所以数据集中出现多个样本具有同样的id,也是一件正常的事情,还是要结合具体业务背景来看样本重复性是否被允许。但是样本重复性检验的确是不可缺失的一个步骤。

这一个步骤常用到.unique()和.nunique()

.unique()返回某一列中所有不同的值。
.nunique()返回某一列中不同取值的个数。

merchant.nunique()
merchant_id                    334633
merchant_group_id              109391
merchant_category_id              324
subsector_id                       41
numerical_1                       954
numerical_2                       947
category_1                          2
most_recent_sales_range             5
most_recent_purchases_range         5
avg_sales_lag3                   3372
avg_purchases_lag3             100003
active_months_lag3                  3
avg_sales_lag6                   4507
avg_purchases_lag6             135202
active_months_lag6                  6
avg_sales_lag12                  5009
avg_purchases_lag12            172917
active_months_lag12                12
category_4                          2
city_id                           271
state_id                           25
category_2                          5
dtype: int64
merchant.nunique()==merchant.shape[0]
merchant_id                    False
merchant_group_id              False
merchant_category_id           False
subsector_id                   False
numerical_1                    False
numerical_2                    False
category_1                     False
most_recent_sales_range        False
most_recent_purchases_range    False
avg_sales_lag3                 False
avg_purchases_lag3             False
active_months_lag3             False
avg_sales_lag6                 False
avg_purchases_lag6             False
active_months_lag6             False
avg_sales_lag12                False
avg_purchases_lag12            False
active_months_lag12            False
category_4                     False
city_id                        False
state_id                       False
category_2                     False
dtype: bool

merchant.shape[0]是样本量,上面这一个命令是检查每个变量中的取值个数是否等于样本数量,若不等于(返回False),那就是有重复值出现.

若等于(返回True),就说明该变量里面没有重复值。

merchant数据集中所有的变量都是含有重复值的,并没有哪个变量里面的取值完全不一样

2.2 缺失值、无穷值处理

缺失值处理

查看每一个变量中所含有缺失值的样本个数:data.isnull().sum()

merchant.isnull().sum()
merchant_id                        0
merchant_group_id                  0
merchant_category_id               0
subsector_id                       0
numerical_1                        0
numerical_2                        0
category_1                         0
most_recent_sales_range            0
most_recent_purchases_range        0
avg_sales_lag3                    13
avg_purchases_lag3                 0
active_months_lag3                 0
avg_sales_lag6                    13
avg_purchases_lag6                 0
active_months_lag6                 0
avg_sales_lag12                   13
avg_purchases_lag12                0
active_months_lag12                0
category_4                         0
city_id                            0
state_id                           0
category_2                     11887
dtype: int64

处理缺失值几个可以思考的方向:

(1) 缺失是否与异常相关?(在样本不平衡场景下可以使用,比如:异常订单识别、患者筛查等等)

  • 看一下有缺失值的样本和异常样本之间的交集,交集越大说明样本缺失与异常越紧密,这时就一定不能删除缺失样本。 还要看两个比例:交集部分/缺失值样本、交集部分/缺失值样本。

    • 交集部分/缺失值样本:若该比例较大,说明缺失样本大多数是异常样本。

    • 交集部分/异常值样本:异常值样本是珍稀物种,如果该比例较大,直接删除缺失值样本,就加重了样本不平衡问题让异常值更加难以捕捉。如果该比例小,直接删去缺失值样本,影响也不会太大。

(2)众数、均值填补

(3)算法填补

(4)直接删掉:.dropna(),删除之后一定要恢复索引:data.index=range(data.shape[0])

当然也可以把四种方法都尝试一下,看看在四份数据集上面建起来的模型谁的表现更好一些。

填补之前可以大致看一下数据分布,缺失值较少的情况下,就直接用均值、众数、中位数来填补;如果连续型变量的缺失值较多,可以考虑用算法填补(比如随机森林);如果是离散型变量缺失值很多的情况,可以先用一个数字来标记这些缺失值。

avg_sales_lag3=merchant['avg_sales_lag3'].value_counts().sort_index()
avg_sales_lag3
-82.13         1
-0.72          1
-0.40          10.33         420.34         99..360107.00     1385833.00     1608433.00     1624741.00     1851844.64     1
Name: avg_sales_lag3, Length: 3372, dtype: int64

统计不同取值的样本个数,并从大到小排序发现取值范围非常大,但是极度偏态,较大的取值之间非常离散。再来用可视化的方法看一下数据分布状况。用到的画图函数是自定义函数,代码在这篇博客里面,可以直接调用数据分布探索函数。

for i in ['avg_sales_lag3','avg_sales_lag6','avg_sales_lag12']:data_distribution_explore(merchant,i,va_type='numeric')
data_distribution_explore(merchant,'category_2',va_type='category')

在这里插入图片描述

在这里插入图片描述在这里插入图片描述在这里插入图片描述

一共四个变量含有缺失值,离散变量’category_2’有许多缺失值(11887个),连续型数值变量‘avg_sales_lag3’、‘avg_sales_lag6’、‘avg_sales_lag12’都只有13个缺失值,数量较少。

因此,对于’category_2’,用-1来填补这些缺失值;对于‘avg_sales_lag3’、‘avg_sales_lag6’、‘avg_sales_lag12’,直接用中位数来填补,或者删掉也无妨。

#填补缺失值(分类型变量)
merchant['category_2'] = merchant['category_2'].fillna(-1)
  • 方案一:中位数填补(连续型数值变量)
numeric_fill=['avg_sales_lag3','avg_sales_lag6','avg_sales_lag12']
for i in numeric_fill:merchant[i] = merchant[i].fillna(merchant[i].median())
numeric_fill=['avg_sales_lag3','avg_sales_lag6','avg_sales_lag12']
for i in numeric_fill:merchant[i] = merchant[i].fillna(merchant[i].median())
  • 方案二:直接删掉少数缺失的样本(副本上操作)。切记!养成好习惯:删除样本后,立刻恢复索引,否则dataframe里面会有空样本。
data=merchant.copy()
data.dropna(inplace=True)
data.index=range(data.shape[0])
merchant.isnull().sum()
merchant_id                    0
merchant_group_id              0
merchant_category_id           0
subsector_id                   0
numerical_1                    0
numerical_2                    0
category_1                     0
most_recent_sales_range        0
most_recent_purchases_range    0
avg_sales_lag3                 0
avg_purchases_lag3             0
active_months_lag3             0
avg_sales_lag6                 0
avg_purchases_lag6             0
active_months_lag6             0
avg_sales_lag12                0
avg_purchases_lag12            0
active_months_lag12            0
category_4                     0
city_id                        0
state_id                       0
category_2                     0
dtype: int64

缺失值填补完毕

无穷值处理

查看哪些变量里面含有inf值,直接.describe(),看均值和最大值

merchant.describe()

在这里插入图片描述

可以看到还是有一些变量(avg_purchases_lag3、avg_purchases_lag6、avg_purchases_lag12)的最大值、均值出现了inf,说明这些变量里面存在inf值,无法直接建模。可以使用天花板盖帽法的方式对其进行修改,即将inf改为最大的显式数值。代码实现流程如下:

inf_cols = ['avg_purchases_lag3', 'avg_purchases_lag6', 'avg_purchases_lag12']
merchant[inf_cols] = merchant[inf_cols].replace(np.inf, merchant[inf_cols].replace(np.inf, -99).max().max())
merchant.describe()
merchant_group_idmerchant_category_idsubsector_idnumerical_1numerical_2avg_sales_lag3avg_purchases_lag3active_months_lag3avg_sales_lag6avg_purchases_lag6active_months_lag6avg_sales_lag12avg_purchases_lag12active_months_lag12city_idstate_idcategory_2
count334696.000000334696.000000334696.000000334696.000000334696.000000334696.000000334696.000000334696.0000003.346960e+05334696.000000334696.0000003.346960e+05334696.000000334696.000000334696.000000334696.000000334696.000000
mean31028.736143423.13166325.1164040.0114760.00810313.8324942.1451432.9941082.164999e+012.4419475.9473972.522677e+012.63357211.599335102.91792611.8609422.259958
std31623.043426252.8980469.8073711.0981541.0704972395.443478213.9558440.0952473.947031e+03209.4393730.3949365.251740e+03205.2061981.520138107.0906736.1768891.657263
min1.000000-1.000000-1.000000-0.057471-0.057471-82.1300000.3334951.000000-8.213000e+010.1670451.000000-8.213000e+010.0983301.000000-1.000000-1.000000-1.000000
25%3612.000000222.00000019.000000-0.057471-0.0574710.8800000.9236503.0000008.500000e-010.9022476.0000008.500000e-010.89833312.000000-1.0000009.0000001.000000
50%19900.000000373.00000027.000000-0.057471-0.0574711.0000001.0166673.0000001.010000e+001.0269616.0000001.020000e+001.04336112.00000069.0000009.0000001.000000
75%51707.250000683.00000033.000000-0.047556-0.0475561.1600001.1465223.0000001.230000e+001.2155756.0000001.290000e+001.26648012.000000182.00000016.0000004.000000
max112586.000000891.00000041.000000183.735111182.079322851844.64000061851.3333333.0000001.513959e+0661851.3333336.0000002.567408e+0661851.33333312.000000347.00000024.0000005.000000

数据中已经没有无穷值了

2.3 数据类型转变

  • 离散变量字典编码

  接下来对离散变量进行字典编码,即将object对象类型按照sort顺序进行数值化(整数)编码。例如原始category_1取值为Y/N,通过sort排序后N在Y之前,因此在重新编码时N取值会重编码为0、Y取值会重编码为1。以此类推。

  需要注意的是,从严格角度来说,变量类型应该是有三类:连续性变量、名义型变量以及有序变量。

名义变量:没有数值大小意义的分类变量,例如用1表示女、0表示男,0、1只是作为性别的指代,而没有1>0的含义。

有序变量:离散型变量,但却有数值大小含义,如上述most_recent_purchases_range字段,销售等级中A>B>C>D>E,该离散变量的5个取值水平是有严格大小意义的,该变量就被称为有序变量。

下面自定义一个编码函数,可以将object型变量转化成离散型变量

# 字典编码函数
def change_object_cols(se):value = se.unique().tolist()value.sort()#从小到大排序return se.map(pd.Series(range(len(value)), index=value)).values
for col in object_cols:merchant[col] = change_object_cols(merchant[col])

http://chatgpt.dhexx.cn/article/bDh9HZrE.shtml

相关文章

transforms数据预处理方法(一)

transforms数据预处理方法&#xff08;一&#xff09; 文章目录 transforms数据预处理方法&#xff08;一&#xff09;1.transforms——裁剪(1) transforms.CenterCrop(size)(2) transforms.RandomCrop (size, padding None , pad_if_needed False ,fill 0 , padding_mode cons…

大数据处理之道(预处理方法)

一&#xff1a;为什么要预处理数据&#xff1f; &#xff08;1&#xff09;现实世界的数据是肮脏的&#xff08;不完整&#xff0c;含噪声&#xff0c;不一致&#xff09; &#xff08;2&#xff09;没有高质量的数据&#xff0c;就没有高质量的挖掘结果&#xff08;高质量的决…

过程数据_数据预处理的方法

首先,我们先来搞清楚,什么叫“过程数据”?以及什么叫“结果数据”? 简单来讲,“过程数据”指的是我们可以掌握的事务和行为“结果数据”就是我们不能完全掌控的。过程数据的英文翻译 基本释义 process data 参考释义过程数据的相关资料 临近单词 过半数 过 过期作废 过气 过谦…

类别型数据的预处理方法

在机器学习过程中,我们往往需要对数据进行预处理。根据数据的取值情况,我们可以把数据总体分为两大类:类别型数据和数值型数据。 对于数值性变量,通常不需要对其进行编码处理。而如何处理类别型数据是一个难题。处理的方法有很多种,各有优缺并且各有适用的范围。 本文在收…

大数据预处理方法,来看看你知道几个

大数据蕴含巨大价值&#xff0c;引起了社会各界的高度关注。大数据的来源多种多样&#xff0c;从现实世界中采集的数据大体上都是不完整、不一致的脏数据&#xff0c;无法直接进行数据挖掘和分析&#xff0c;或分析挖掘的结果差强人意。为了提高数据分析挖掘的质量&#xff0c;…

机器学习中数据预处理的几种方法

由于实际收集到的机器学习数据集不可避免的会存在数据缺、数据集不平衡和数据集中各类数据非同一量级等情况&#xff0c;对缺失数据进行补全和对异常数据进行清洗、均衡化处理防止类别不平衡和数据标准化处理对于机器学习模型至关重要。 1 数据补全方法 有效地恢复缺失的数据是…

常见近红外/红外光谱数据预处理方法及MATLAB实现

在近红外等光谱数据分析建模过程中&#xff0c;最关键的一步除了特征选择之外就是光谱数据预处理&#xff0c;预处理的原因是光谱数据除了纯光谱&#xff08;pure spectra&#xff09;之外还包含基线漂移、噪声等信号&#xff0c;与此同时存在着因样本大小以及环境等因素带来的…

数据预处理常用方法总结

目录 一、数据清理1 处理缺失值2 噪声数据 二、数据集成1 实体识别2 冗余和相关分析3 数值冲突的检测与处理 三、数据变换1 数据规范化2 数据离散化3 概念分层 数据预处理包括多种方法&#xff0c;诸如数据清理、数据集成、数据变换等。 一、数据清理 数据清理主要是处理缺失…

数据预处理的方法有哪些

数据处理的工作时间占整个数据分析项目的70%以上&#xff0c;因此&#xff0c;数据的质量直接决定了分析模型的准确性。那么&#xff0c;数据预处理的方法是什么呢&#xff1f;例如数据清理、数据集成、数据规范、数据转换等&#xff0c;其中最常用的是数据清理和数据集成&…

数据预处理(方法总结)

数据预处理&#xff08;方法总结&#xff09; 转自-https://www.cnblogs.com/sherial/archive/2018/03/07/8522405.html 一、概述 在工程实践中&#xff0c;我们得到的数据会存在有缺失值、重复值等&#xff0c;在使用之前需要进行数据预处理。数据预处理没有标准的流程&…

机器学习算法笔记之6:数据预处理

一、概述 在工程实践中&#xff0c;我们得到的数据会存在有缺失值、重复值等&#xff0c;在使用之前需要进行数据预处理。数据预处理没有标准的流程&#xff0c;通常针对不同的任务和数据集属性的不同而不同。数据预处理的常用流程为&#xff1a;去除唯一属性、处理缺失值、属…

Python的数据分析可视化十种技能总结

常见的可视化试图列举 可视化视图可以分成4大类&#xff1a;比较、联系、构成和分布。他们的特点如下&#xff1a; 1、比较&#xff1a;比较数据之间的各类别的关系&#xff0c;或者是他们随着时间的变化趋势&#xff0c;比如折线图&#xff1b;2、联系&#xff1a;查看两个或…

python 典型变量分析

典型相关分析 1.典型相关分析的基本思想是首先在每组变量中找出变量的线性组合&#xff0c;使其具有最大相关性&#xff0c;然后再在每组变量中找出第二对线性组合&#xff0c;使其分别与第一对线性组合不相关&#xff0c;而第二对本身具有最大的相关性&#xff0c;如此继续下…

脑影像分析|数据分析——单个变量或多个变量与y的皮尔逊相关,同时返回r与p值(python)

| 图源 皮尔逊相关是计算两个变量之间线性相关关系&#xff0c;或者两个向量共线程度的常用指标&#xff0c;应返回衡量相关程度的r值&#xff0c;和相关显著程度的p值。我们熟知的工具包&#xff0c;如pandas&#xff0c;numpy和scipy等&#xff0c;只能计算单个变量x与变量y之…

SPSS处理多自变量多因变量分析以及描述平均值,在不同情况

SPSS处理工具&#xff1a;SPSS25.0 准备好数据 1.分析多自变量对某一个因变量的显著性 在分析里找到&#xff0c;General linear model,然后选择Univariate, 分别把两个自变量TIssue and Speed 输入到Fixed Factor&#xff0c;然后设置Option里的描述,如果需要其他的设置可以…

R语言实现双变量分析教程

双变量分析表示分析两个变量。 双变量分析是为了分析两个变量之间的关系&#xff0c;与单变量、多变量分析对应。主要有三种方式进行双变量分析。 散点图相关系数简单线性回归 下面使用测试数据作为示例来演示三种方法&#xff0c;供包括两个变量&#xff0c;HourStudied表示…

spss实战案例----分析多个变量与因变量之间是否存在关系,方差分析

本案例是IBM SPSS数据分析与挖掘实战案例精粹----第七章的学习记录 案例背景或目标&#xff1a;激素水平是否在对照组和实验组之间存在差异 分析方法&#xff1a;Bootstrap抽样&#xff0c;秩和检验&#xff0c;秩变换方法&#xff0c;cox回归 字段包括&#xff1a;性别&…

Python学习16 ----Seaborn多变量分析绘图

Seaborn多变量分析绘图 代码详见https://github.com/RenDong3/Python_Note 1 读取数据 2 分析绘图 parameters: x,y,hue 数据集变量 变量名data 数据集 数据集名row,col 更多分类变量进行平铺显示 变量名col_warp 每行的最高平铺数 整数estimator 在每个分类中进行矢量到标…

用SPSS进行多变量数据分析

用SPSS进行多变量数据分析 1.将所给的数据输入SPSS 22.0中文版。分别设置变量为温度&#xff0c;体重1、2、3、4&#xff1b;体重&#xff0c;温度5、10、15、20、30。 2.用SPSS进行作图&#xff08;过程略&#xff09;。 3.对数据进行多因素变量分析&#xff0c;具体操作如…

解读SPSS多元方差分析中的多因素多变量的相互影响

多元方差分析研究的是多个自变量与多个因变量的相互关系&#xff0c;也被称为多变量分析。在《怎么使用SPSS的多元方差分析法》一文中&#xff0c;我们已经详细学习了IBM SPSS Statistics多元方差分析的设置方法。 本文将会重点介绍如何解读多元方差分析的检验结果。由于多元方…