在机器学习通常来说,特征工程对模型性能影响最大,参数调优一般提升不如特征工程提升。
首先需要对数据进行充分探索,如属性是字符串类型、日期类型 还是 数值类型;若提供的数据存在几张表中,表中数据是否存在关联,是否可以进行统计、聚合;从业务理解上,可能影响模型性能的因素有哪些,表中数据能否构造该因素。
其次,我们需要对数据进行预处理。对字符串、categories 一般来说我们可以:
1.直接删去,不使用该列数据。这种处理方式对模型效果影响较大
2.进行LabelEncoder处理。可用sklearn提供的LabelEncoder API将categories映射到数值(1,2,3…)上去,或者自定义一个映射标准,通常来说自定义映射标准会更好,如果我们的数据是会变动的,某天可能新增一个类型,自定义映射可保证映射结果一致。LabelEncoder这种处理方式会引入顺序,隐含类2 > 1 的意思在里面。对树模型影响不大,对距离模型影响稍微大一点
3.进行one_hot编码,通过sklearn 提供的 API:OneHotEncoder(handle_unknown=‘ignore’, sparse=False)可以将属性返回numpy形式,可以一定程度解决稀疏问题。
对于数值来说,一般需要观察是否具有缺失值(插补、舍去)、异常值(修正、舍去)、离群点(修正、舍去),而后对其进行相应的操作。
下图为我对机器学习的整体认知,并详细标注了数据预处理 & 特征工程的处理方式: