Python在机器学习中的数据处理

数据清洗这块绝对是重灾区。拿缺失值来说,之前傻乎乎地直接dropna(),结果样本量骤降三分之一。后来学会用Pandas的isnull().sum()先摸清底细,发现不同字段得区别对待:数值型用fillna(mean()),分类变量干脆单独标成"未知"类别。特别是遇到年龄字段有5%缺失时,如果用中位数填充反而比直接删除更保留分布规律。这里推荐试试Scikit-learn的SimpleImputer,支持中位数、众数、常量多种填充策略,配合Pipeline还能避免数据泄露。

异常值处理有个血泪教训。有次发现某型号车的里程数居然有998万公里,追查发现是数据录入时把"未登记"错误编码成9999999。这种明显超出三倍标准差的极端值,用箱线图或describe()查看五数概括最直观。处理时不要暴力删除,可以按1%~99%分位数进行Winsorize缩尾,或者对连续变量做log(1+x)变换。上次对房价数据取对数后,偏度系数从9.8直接降到0.3,效果立竿见影。

类别特征编码这块坑最多。最开始用LabelEncoder把颜色['红','蓝','红']转成[0,1,0],结果模型误以为蓝色大于红色。后来改用OneHotEncoder生成哑变量,但遇到"车辆品牌"这种有50多个取值的字段,维度爆炸直接拖垮训练效率。这时候其实可以用均值编码------比如按每个品牌对应的价格均值来编码,既保留信息又控制维度。现在更推荐category_encoders库,支持TargetEncoder、CountEncoder等十多种编码方式,还能自动处理未见过的类别。

特征工程才是真正拉开差距的地方。之前预测餐厅销量时,把"开业日期"转换成"经营年限"后,特征重要性排名从末尾跃升到前三。时间序列里经常要提取年月日、是否节假日;地理信息可以计算周边竞品密度;文本描述先用jieba分词再统计词频。最近用featuretools库自动生成特征,通过对客户交易表进行深度特征合成,半小时就构造出"最近三个月退款率"这类业务特征,比手工效率提升十倍不止。

数据标准化经常被新手忽略。上次用KNN算法时,因为年龄范围0-100而收入范围0-500000,模型完全被收入特征主导。后来在Sklearn里比较了StandardScaler和MinMaxScaler,发现带正则化的线性模型用标准化,图像处理用归一化更合适。特别注意要先拆分训练测试集再分别标准化,用训练集的scaler去transform测试集,这是最容易犯的错误之一。

最后安利几个高效工具链。Pandas_profiling三行代码生成数据报告,能直观看到缺失值分布和相关性矩阵;Sklearn的ColumnTransformer可以对数值型和分类型特征并行处理;再用Pipeline把预处理和模型打包成统一流程,测试集上直接transform一路到底。最近在用的ydata-profiling更强大,连数据质量报告和版本对比都能生成。

其实机器学习项目里大约60%时间都花在数据处理上,但这部分投入绝对物超所值。记得刚开始总想跳过预处理直接建模,结果在垃圾数据上堆再复杂的模型也是白搭。后来坚持用Python这套工具链认真做完数据清洗、特征工程、数据标准化三板斧,哪怕用最简单的随机森林,效果都比在脏数据上跑XGBoost强得多。各位在实战中有什么数据处理的心得体会,欢迎在评论区交流拍砖。

相关推荐
子不语1801 小时前
Matlab(一)——绘图
开发语言·matlab
222you1 小时前
MyBatis-Plus当中BaseMapper接口的增删查改操作
java·开发语言·mybatis
深蓝电商API2 小时前
初级爬虫反爬应对:解决 403、IP 限制的简单方法
爬虫·python
闲人编程2 小时前
Python协程的演进:从yield到async/await的完整历史
java·前端·python·async·yield·await·codecapsule
q***92512 小时前
PHP操作redis
开发语言·redis·php
睿思达DBA_WGX2 小时前
使用 Python 的第三方库 xlrd 读取 Excel 文件
python·excel
大佬,救命!!!3 小时前
python实现五子棋
开发语言·python·个人开发·pygame·少儿编程·五子棋
动感小麦兜3 小时前
应用-常用工具部署命令
java·开发语言
立志成为大牛的小牛4 小时前
数据结构——五十一、散列表的基本概念(王道408)
开发语言·数据结构·学习·程序人生·算法·散列表