目录

定义

特征:原始数据中抽取出来对结果预测有用的信息

特征工程:使用专业背景知识和技巧处理数据,使得特征能在机器学习算法 上发挥更好的作用的过程。旨在去除原始数据中的杂质和冗余,设计更高效的特征以刻画求解的问题与预测模型之间的关系 alt

特征越好,灵活性越强,模型越简单,模型性能越出色。

数据分类

  • 表格数据:结构化的关系型向量
    • 为数据对象、实体、样本samples、实例instances、数据点data points、对象objects、元组tuples
    • 为属性attributs、特征features、维dimensions、变量variables
  • 图和网络:社交网络
  • 多媒体数据
类型 示例
名义型【离散】 学校={北京大学,清华大学,北京邮电大学……}
布尔型【离散】 性别={0,1}
等级型【离散】 评价={十分满意,满意,一般,不满意,非常不满意}
数值型【连续】 收入200元,考99分,房价100元/㎡

数据的统计信息

alt 通常来说拿到数据后会先分析数据的分布情况,对于离散型的数据会看频率,连续型数据主要会通过boxplot查看数据离散分布情况,随着圈子的发展,越来越多的自动化工具开始涌现。 pandas_profiling是基于pandas的DataFrame数据类型,可以简单快速地进行探索性数据分析。

对于数据集的每一列,pandas_profiling会提供以下统计信息:

  1. 概要:数据类型,唯一值,缺失值,内存大小
  2. 分位数统计:最小值、最大值、中位数、Q1、Q3、最大值,值域,四分位
  3. 描述性统计:均值、众数、标准差、绝对中位差、变异系数、峰值、偏度系数
  4. 最频繁出现的值,直方图/柱状图
  5. 相关性分析可视化:突出强相关的变量,Spearman, Pearson矩阵相关性色阶图

并且这个报告可以导出为HTML,非常方便查看。

import pandas as pd
from pandas_profiling import ProfileReport
df = pd.read_csv("./data/titanic.csv")

# 根据数据生成报告
profile = ProfileReport(df, title="Titanic Dataset", explorative=True)
profile.to_file("titanic_pf_report.html")

alt

数据相似度similarity/proximity

alt h=1时为L1距离,曼哈顿距离,L1范式

h=2时为L2距离,欧几里得距离,L2范式

预处理

数据处理之前比较脏,有不完整,重复,异常,篡改等情况,预处理相当于净化。

目标:提升数据质量,生成新特征,整合数据,以便提升模型收敛效率及模型的训练质量。

类别 特点
不完整 缺失或者仅包含聚集数据
噪声 错误数据或者显著离群点
不一致 编码不同、表示方法不同;如距地铁500米,临地铁
冗余 属性之间存在数学关系,可相互导出

方法

  • 数据清洗:去噪和异常数据
  • 数据集成:多个数据集的整合
  • 数据变换:原始数据→标准化、离散化、泛化
  • 数据规约:发现有用特征,缩减数据模型,保持数据原貌的前提下最大精度的精简数据量。

缺失值处理

  • 丢弃法:样本或特征
  • 填充法:人工处理、均值插补、同类均值插补、极大似然估计、多重插补

常规方法 utils.missing_value

from utils import missing_value as ms
data = pd.read_csv('./data/titanic.csv', usecols=use_cols)
// 以经典的Titanic数据集为例
// 1、检测缺失值
ms.check_missing(data=data)

// 2、【丢弃法】默认丢行
data2 = ms.drop_missing(data=data)

// 3、构建新特征
data3 = ms.add_var_denote_NA(data=data,NA_col=['Age'])

// 4、【赋值】指定值
data4 = ms.impute_NA_with_arbitrary(data=data,impute_value=-999,NA_col=['Age'])

// 5、【赋值】均值/中位数/众数
data5 = ms.impute_NA_with_avg(data=data,strategy='median',NA_col=['Age'])

// 6、【赋值】分布边缘值
data6 = ms.impute_NA_with_end_of_distribution(data=data,NA_col=['Age'])

// 7、【赋值】随机填充
data7 = ms.impute_NA_with_random(data=data,NA_col=['Age'])

进阶方法 missingpy

API详解:https://pypi.org/project/missingpy/

// 8、【赋值】KNN填充
from missingpy import KNNImputer
imputer = KNNImputer(n_neighbors=3, weights="uniform")
impute_age = imputer.fit_transform(data[['Age']])

// 9、【赋值】随机森林填充
from missingpy import MissForest
imputer = MissForest()
data_imputed = imputer.fit_transform(data)

异常值处理

  • 异常值检测:统计分析、拉伊达准则、箱线图
  • 异常值修正:删除、视为缺失、平均值修正、不处理

常规方法utils.outlier

from utils import outlier as ot

// 1、【检测】越界(手动指定范围)样本及查看对应数据
index,para = ot.outlier_detect_arbitrary(data=data,col='Fare',upper_fence=300,lower_fence=5)
// 手动划分出19个
data.loc[index,'Fare'].sort_values()

// 2、【检测】计算IQR越界异常值,参考箱线图,上下界以外的均被检测出
index,para = ot.outlier_detect_IQR(data=data,col='Fare',threshold=5)
// IQR计算出31个
data.loc[index,'Fare'].sort_values()

// 3、【检测】计算均值与标准差,threshold*std距离以外为异常值
index,para = ot.outlier_detect_mean_std(data=data,col='Fare',threshold=3)
print('Upper bound:',para[0],'\nLower bound:',para[1])
// 20个
data.loc[index,'Fare'].sort_values()

// 4、【检测】MAD中值绝对偏差法
// 计算残差的中位数。然后,计算每个历史值与该中位数之间的差。这些差异表示为它们的绝对值,然后计算一个新的中位数并乘以根据经验得出的常数,以产生中值绝对偏差(MAD)。
//如果某个值与残差的中位数相距一定数量的MAD,该值被分类为离群值。默认阈值为3 MAD。
//通常,此方法比均值和标准差方法更有效地检测异常值,但是在分类没有太大不同的价值时可能过于激进。
//同样,如果超过50%的数据点具有相同的值,则MAD计算为0,因此,任何与剩余中位数不同的值都被归为离群值。
# 可以看到这种情况下的离群点检测出来的数量极多
index = ot.outlier_detect_MAD(data=data,col='Fare',threshold=3.5)
// 160个

// 5、【填充】手动指定,使用-999为默认值进行填充
data2 = ot.impute_outlier_with_arbitrary(data=data,outlier_index=index,value=-999,col=['Fare'])

// 6、【填充】使用上下边界替换,
data3 = ot.windsorization(data=data,col='Fare',para=para,strategy='both')

// 7、【填充】均值、中位数、众数
data5 = ot.impute_outlier_with_avg(data=data,col='Fare', outlier_index=index,strategy='mean')

// 8、【删除】
data4 = ot.drop_outlier(data=data,outlier_index=index)

进阶方法 PyOD

API详解:https://github.com/yzhao062/pyod

  1. 异常值检测的线性模型:
    • PCA:主成分分析 使用到特征向量超平面的加权投影距离总和作为离群值得分阈值
    • MCD:最小协方差决定因素(使用马哈拉诺比斯距离作为离群值得分阈值)
    • OCSVM:One-Class 支持向量机
  2. 基于接近度的离群值检测模型:
    • LOF:局部离群系数
    • CBLOF:基于聚类的局部离群值 -** kNN:k最近的邻居(使用到最近的第k个的距离邻居作为离群分数)**
    • 中值KNN:离群值检测(使用与k最近的中值距离邻居作为离群分数)
    • HBOS:基于直方图的离群值
  3. 异常值检测的概率模型:
    • ABOD:基于角度的离群值检测
  4. 异常集合和组合框架
    • Isolation Forest
    • Feature Bagging
    • LSCP

示例,具体用法可查看API

# train the COPOD detector
from pyod.models.copod import COPOD
clf = COPOD()
clf.fit(X_train)

# get outlier scores
y_train_scores = clf.decision_scores_  # raw outlier scores on the train data
y_test_scores = clf.decision_function(X_test)  # predict raw outlier scores on test

alt