1 目的
1.对数据的特征进一步分析,并进行处理
2.数据特征分析的可视化
2 特征处理
2.1 异常处理
通过箱线图(或 3-Sigma)分析删除异常值;
BOX-COX 转换(处理有偏分布);
长尾截断;
2.2 特征归一化/标准化
标准化(转换为标准正态分布);
归一化(抓换到 [0,1] 区间);
针对幂律分布,可以采用公式log((1+x)/(1+𝑚𝑒𝑑𝑖𝑎𝑛))
2.3 数据分桶
等频分桶;
等距分桶;
Best-KS分桶;
卡方分桶;
2.4 缺失值处理
不处理;
删除;
插值补全;
分箱,缺失值一个箱;
2.5 特征构造
构造统计量特征、报告计数、求和、比例、标准差等;
时间特征,包括相对时间和绝对时间,节假日、双休日等;
地理信息,包括分箱,分布编码等方法;
非线性变换,包括log/平方/根号等;
特征组合。
2.6 特征筛选
过滤式(filter):先对数据进行特征选择,然后在训练学习器,常见的方法有Relief/方差选择法/相关系数法/卡方检验法/互信息法;
包裹式(wrapper):直接把最终将要使用的学习器的性能作为特征子集的评价准则,常见方法有LVM
嵌入式:结合过滤式和包裹式,学习器训练过程中自动进行特征选择,常见的有lasso回归;
2.7 降维
PCA/LDA/ICA;
特征选择也是一种降维.
3 样本特征分析(代码)
对于已有样本
1
3.1 导入数据集
import pandas as pd
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns
from operator import itemgetter
%matplotlib inline
train = pd.read_csv('train.csv', sep=' ')
test = pd.read_csv('testA.csv', sep=' ')
3.2 删除异常值
对训练集处理
def box_plot_outliers(data_ser, box_scale):
"""
利用箱线图去除异常值
:param data_ser: 接收 pandas.Series 数据格式
:param box_scale: 箱线图尺度,
:return:
"""
iqr = box_scale * (data_ser.quantile(0.75) - data_ser.quantile(0.25))
val_low = data_ser.quantile(0.25) - iqr
val_up = data_ser.quantile(0.75) + iqr
rule_low = (data_ser < val_low)
rule_up = (data_ser > val_up)
return (rule_low, rule_up), (val_low, val_up)
def outliers_proc(data, col_name, scale=3):
"""
用于清洗异常值,默认用 box_plot(scale=3)进行清洗
:param data: 接收 pandas 数据格式
:param col_name: pandas 列名
:param scale: 尺度
:return:
"""
data_n = data.copy()
data_series = data_n[col_name]
rule, value = box_plot_outliers(data_series, box_scale=scale)
index = np.arange(data_series.shape[0])[rule[0] | rule[1]]
print("删除的数字是: {}".format(len(index)))
data_n = data_n.drop(index)
data_n.reset_index(drop=True, inplace=True)
print("现在的列号是: {}".format(data_n.shape[0]))
index_low = np.arange(data_series.shape[0])[rule[0]]
outliers = data_series.iloc[index_low]
print("小于下限的数据为:")
print(pd.Series(outliers).describe())
index_up = np.arange(data_series.shape[0])[rule[1]