“我的分析模型准确率为什么一直上不去”“为什么同样的算法别人跑出来的结果比我的好那么多”如果你在工作中遇到过类似问题很可能是因为数据预处理环节出了问题。当你处理一份销售数据发现30%的客户年龄字段是空白的或者城市字段里“北京市”、“北京”和“Beijing”竟然被系统认为是三个不同的城市这时候你就需要好好审视你的数据预处理流程了。数据预处理做不好后面的分析工作就很难顺利进行。今天我将分享九种数据预处理的方法这些都是我在实际工作中积累的经验。顺便分享一份企业数据化建设知识地图包括数据分析、数据库基本操作、挖掘建模等500个数据领域的细分知识点。需要自取https://s.fanruan.com/ip0ko复制到浏览器一、先看缺失值打开数据集第一件事就是看看哪些值缺了。看到缺失值很多人要么全删要么随便用平均数补上。这两种做法都可能带来新问题。全删数据样本变少如果删的不是随机缺失的结论就偏了。直接用平均数补如果数据本身是偏的比如工资数据少数人工资极高平均数就会拉高补出来的值就不真实。那应该怎么做需要根据情况决定。如果缺失的数据很少比如一万行里缺几十行删除影响不大可以考虑删除。如果缺失较多就需要填充。用均值、中位数还是众数数据分布对称用均值明显一边倒用中位数分类数据用众数。说白了就是看大多数数据长什么样就让缺失值向大多数看齐。用过来人的经验告诉你高级方法比如回归插补听起来好但算起来麻烦。平时工作把简单方法用对就能解决大部分问题。二、识别异常值看到某些数据点明显偏离大多数你是直接删除还是先研究一下我敢说很多人第一反应是删掉。但异常值不一定是错误它可能就是事实。举个例子一个地区销售额突然是平时的十倍可能是数据录入时多打了个零也可能真是搞了个爆款活动。直接删掉可能就把重要的商业机会给忽略了。检测异常值有常用的统计方法。Z-score法计算数据点与平均值的距离如果超过3个标准差就需要关注。这个方法适合数据形状比较规整的情况。IQR法通过计算四分位距来识别异常值对数据分布没有特定要求。找到异常值后关键是根据业务知识判断。这个值在业务上合理吗问一问相关业务人员查看操作记录比单纯依赖统计方法更可靠。如果是错误就修正或删除如果是真实情况可以保留但单独处理。三、处理重复值你有没有遇到过统计客户总数和订单数对不上的情况很可能是有重复记录。处理重复值可以用 df.duplicated() 查找用 df.drop_duplicates() 删除。但这里需要注意有些记录看起来不同实际上是重复的有些看起来相同实际不是重复。比如同一个客户一条记录地址写“海淀区”另一条写“海淀区公司”。系统严格比对认为这不一样但人一看就知道是同一个。这种叫近似重复处理起来更麻烦有时需要模糊匹配算法。所以处理前一定要弄清楚数据是怎么来的。如果是日志数据同一秒内产生多条相同记录很可能就是重复错误如果是交易数据同一个人买两次相同东西那就是合理重复不能删。处理重复记录不只是技术操作还需要理解数据背景。四、标准化数据数据中身高以厘米为单位数值大约一百多体重以公斤为单位数值大约几十。直接计算时数值大的特征影响会更大这显然不对。标准化的目的是消除单位的影响让不同特征在计算中有同等的重要性。常用的标准化方法有两种Z-score标准化处理后数据平均值为0标准差为1。Min-Max标准化将数据缩放到0到1的范围内。你该选哪个如果你后续要用那些假设数据长得规整的模型比如线性回归就用Z-score如果你没特殊要求只想快速缩放用Min-Max就行。不过话说回来如果数据里有非常离谱的异常值标准化也会被带偏。所以标准化通常在处理完异常值之后做。五、转换数据许多统计方法假设数据符合正态分布但实际数据常常不符合这个假设。数据转换就是通过数学方法调整数据分布。对数变换适用于数据集中在较小值范围有少量极大值的情况。平方根变换适用于计数类型的数据。Box-Cox变换功能更强大可以调整参数适应更多情况。在实际项目中对数变换后模型效果提升是常见的。但要注意一点你转换数据训练了模型将来用模型预测新数据时新数据也要用同样的方法转换预测结果如果需要解释有时还得再转换回去。六、编码分类数据机器学习模型只能处理数值不能直接处理文字。所以“男”、“女”这样的分类信息需要转换成数字。常用的编码方法有两种标签编码就是给类别编号比如“北京”1“上海”2。这里有个潜在问题模型可能会认为“上海”比“北京”大然后瞎琢磨出根本不存在的顺序关系。独热编码为每个类别创建一个新列如果数据属于该类别对应列的值为1否则为0。这样就彻底避免了顺序误会。那该怎么选择编码方法如果类别有自然顺序比如低、中、高可以用标签编码。如果类别没有顺序比如城市、产品类型应该用独热编码。但独热编码有个缺点如果类别有上百种就会创造出上百个新列数据一下子变得非常稀疏和庞大。这时候可能需要考虑其他方案比如目标编码。七、处理时间数据日期时间字段经常以各种格式的字符串混在一起比如“2023-01-01”、“2023/1/1”。第一步是将这些字符串转换为统一的时间格式。时间数据包含很多有用信息可以提取出来单独作为特征基本部分年、月、日、周几、第几季度。业务部分是否是节假日、是否是周末。衍生部分距离某个重要日期的天数、与上个月同期的比较。原始的时间值本身信息有限但提取出来的这些特征往往是分析趋势、构建预测模型的关键。处理时需要注意时区、闰年等情况无效的日期也需要处理。八、集成多个数据源公司的数据通常散落在各处客户信息在CRM系统交易记录在订单数据库产品详情又在另一个表里。数据集成就是将不同来源的相关数据合并在一起。在Python中可以用 merge() 函数合并数据表。合并时需要注意选择合并方式内连接只保留两个表都有的记录。左连接保留左边表的所有记录右边表能匹配的保留不能匹配的用空值。听起来简单但实际存在很多问题。最大的挑战是实体对齐A表里的“客户ID”和B表里的“user_id”可能指的是同一样东西但名字不同你需要先把它俩对应上。另一个常见问题是数据冲突。比如同一个客户在两个系统中的电话号码不同。这时需要确定以哪个系统的数据为准。随着数据源增多用代码手动写merge会变得非常繁琐且容易出错。这时候专业的数据集成平台就能派上大用场。像FineDataLink这样的工具它能通过可视化拖拽的方式将来自CRM、ERP、财务系统乃至本地Excel表格的数据一键连接起来。你不需要写复杂的关联代码只需在界面上配置好数据源和关联关系它就能帮你自动完成多表融合、整库同步的工作把数据统一到一个企业级的数据仓库里。工具体验地址我放在这里可以试试看​​​​​​​https://s.fanruan.com/tx4dw复制到浏览器九、抽取数据子集数据不是越多越好。无关的特征和记录会增加计算量也可能干扰分析。数据抽取与子集化就是做减法聚焦核心。选择相关列只保留与问题直接相关的特征。比如预测用户流失登录IP可能就不如登录频率重要。选择相关行只分析目标群体比如只分析消费额超过一万元的客户。这样做可以减少计算量模型训练更快结果更易懂也更准。但是我必须提醒你筛选必须有依据不能乱删。如果只挑某一类样本你的模型就只能学会预测这一类拿到更广的数据上就会失灵。数据预处理没有固定步骤需要根据数据情况和分析目标选择合适的方法。每次处理数据时你可以按照这些方面逐一检查根据实际情况决定如何处理。一键get文中同款数据集成平台​​​​​​​https://s.fanruan.com/tx4dw复制到浏览器