机器学习实战的特征工程主要包含数据预处理、特征构建、特征选择三步,首先来介绍数据预处理。
我选择python作为工具,并将主要用到pandas、numpy等数据工具库。加载库:
import pandas as pd
import numpy as np
1. 观察数据
(1)查看数据的行数和列数
print("TRAIN shape:",train.shape)
(2)查看数据的标签
print("TRAIN columns:",train.columns)
(3)查看各字段的信息(大小、数据类型)
print("查看各字段的信息:
"),train.info() #不需要print
(4)查看数据描述(数据长度、均值、标准差、极大值、极小值、四分位点)
print("TRAIN describe:
"), train.describe()
(5)查看本题的label
print('本题的label是:',set(train.columns)-set(test.columns))
2. 处理错误数据
如果观察数据时发现在某些应该是int或float等数值型的列的类型是object,表明存在错误数据,需要观察后进行处理。
(1)将内容为"\N"的脏数据替换为-1
train['column_i'] = train['column_i'].replace("\N",-1)
(2)将格式为'str'的数据转化为'float'型
train['column_i'] = train['column_i'].astype('float')
3. 缺失值处理
(1)查看缺失值所占比例
print("缺失值比例:", len(train['column_i'][pd.isnull(train['column_i'])]) / len(train['column_i']))
(2)删除包含缺失值的任意行
train = train.dropna()
(3)用0/-1/均值/众数/中位数填补
train = train.fillna(0)
train = train.fillna(-1)
train['column_i'] = train['column_i'].fillna(train['column_i'].mean()) #均值
train['column_i'] = train['column_i'].fillna(train['column_i'].mode()) #众数
train['column_i'] = train['column_i'].fillna(train['column_i'].median()) #中位数
4. 异常值处理
由于测量误差或实验误差,原始数据中可能会存在异常值。检测异常值最常见的方法是数据可视化,另外也可以根据一些规则来判定异常值,如将超出数据5%或95%的值视为异常值、距均值超过四分卫距两倍的值看作异常值等等。
5. 数据标准化与编码
(1)Min-Max标准化
也称离差标准化,将数据映射到0~1范围之内处理,对于方差非常小的属性可以增强其稳定性,公式为:
train['column_i'] = (train['column_i']-train['column_i'].min())/(train['column_i'].max()-train['column_i'].min())
(2)one-hot编码
将指定列进行one-hot编码,并合并到原dataframe中。
train = train.join(pd.get_dummies(train['gender']))
(3)映射编码
将无实际意义的离散值映射到0~n的范围内。
# 定义两个字典,用于映射
label2data = dict(zip(range(0,len(set(train['column_i']))),sorted(list(set(train['column_i'])))))
data2label = dict(zip(sorted(list(set(train['column_i']))),range(0,len(set(train['column_i'])))))
train['column_i'] = train['column_i'].map(data2label) #编码
train['column_i'] = train['column_i'].map(label2data) #解码