机器学习实战——特征工程之数据预处理

机器学习实战的特征工程主要包含数据预处理、特征构建、特征选择三步,首先来介绍数据预处理。

我选择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范围之内处理,对于方差非常小的属性可以增强其稳定性,公式为:

x{}'=frac{x-min}{max-min}

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) #解码
原文地址:https://www.cnblogs.com/yucen/p/9912062.html