目录
定义
特征:原始数据中抽取出来对结果预测有用的信息
特征工程:使用专业背景知识和技巧处理数据,使得特征能在机器学习算法
上发挥更好的作用的过程。旨在去除原始数据中的杂质和冗余,设计更高效的特征以刻画求解的问题与预测模型之间的关系
特征越好,灵活性越强,模型越简单,模型性能越出色。
数据分类
- 表格数据:结构化的关系型向量
- 行为数据对象、实体、样本
samples
、实例instances
、数据点data points
、对象objects
、元组tuples
- 列为属性
attributs
、特征features
、维dimensions
、变量variables
- 行为数据对象、实体、样本
- 图和网络:社交网络
- 多媒体数据
类型 | 示例 |
---|---|
名义型【离散】 | 学校={北京大学,清华大学,北京邮电大学……} |
布尔型【离散】 | 性别={0,1} |
等级型【离散】 | 评价={十分满意,满意,一般,不满意,非常不满意} |
数值型【连续】 | 收入200元,考99分,房价100元/㎡ |
数据的统计信息
通常来说拿到数据后会先分析数据的分布情况,对于离散型的数据会看频率,连续型数据主要会通过boxplot查看数据离散分布情况,随着圈子的发展,越来越多的自动化工具开始涌现。
pandas_profiling
是基于pandas的DataFrame数据类型,可以简单快速地进行探索性数据分析。
对于数据集的每一列,pandas_profiling会提供以下统计信息:
- 概要:数据类型,唯一值,缺失值,内存大小
- 分位数统计:最小值、最大值、中位数、Q1、Q3、最大值,值域,四分位
- 描述性统计:均值、众数、标准差、绝对中位差、变异系数、峰值、偏度系数
- 最频繁出现的值,直方图/柱状图
- 相关性分析可视化:突出强相关的变量,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")
数据相似度similarity/proximity
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
// 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
- 异常值检测的线性模型:
- PCA:主成分分析 使用到特征向量超平面的加权投影距离总和作为离群值得分阈值
- MCD:最小协方差决定因素(使用马哈拉诺比斯距离作为离群值得分阈值)
- OCSVM:One-Class 支持向量机
- 基于接近度的离群值检测模型:
- LOF:局部离群系数
- CBLOF:基于聚类的局部离群值 -** kNN:k最近的邻居(使用到最近的第k个的距离邻居作为离群分数)**
- 中值KNN:离群值检测(使用与k最近的中值距离邻居作为离群分数)
- HBOS:基于直方图的离群值
- 异常值检测的概率模型:
- ABOD:基于角度的离群值检测
- 异常集合和组合框架
- 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