特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。 本文主要目的在于熟悉做数据挖掘中对数据做预处理的主要流程。
目录
1数据采集
- 哪些数据对最后的结果预测有帮助?
- 数据我们能够采集到吗?
- 线上实时计算的时候获取是否快捷?
2数据格式存储
- 确定存储格式
- 大多数情况下,需要关联非常非常非常多的hive表和 hdfs文件夹 ,这里有非常大的学问,涉计到大数据方面技术问题,也是初级数据挖掘工程师向高级数据挖掘工程进阶过程中必须要掌握的技术。
3数据清洗
- 缺省值处理
如果缺值的样本占总数比例极高,我们可能就直接舍弃了,作为特征加入的话,可能反倒带入noise,影响最后的结果了;
如果缺值的样本适中,而该属性非连续值特征属性(比如说类目属性),那就把NaN作为一个新类别,加到类别特征中;
如果缺值的样本适中,而该属性为连续值特征属性,有时候我们会考虑给定一个step(age属性,我们可以考虑每隔5岁为一个步长),然后把它离散化,之后把NaN作为一个type加到属性类目中;
有些情况下,缺失的值个数并不是特别多,那我们也可以试着根据已有的其它属性值,构建模型拟合一下数据,补充上。
df = pd.DataFrame({"A": ["a0", "a1", "a1", "a2", "a3", "a4"], \
"B": ["b0", "b1", "b2", "b2", "b3", None],\
"C": [1, 2, None, 3, 4, 5], "D": [0.1, 10.2, 11.4, 8.9, 9.1, 12], \
"E": [10, 19, 32, 25, 8, None],\
"F": ["f0", "f1", "g2", "f3", "f4", "f5"]})
df.dropna(subset=["B","C"]) ##针对B列和C列是否具有空值,如果有就删除具有空值的行
df.duplicated(["A"],keep="first") ##判断A列是否具有重复值,返回sereis列
df.drop_duplicates(["A","B"],keep="first",inplace=False) # 删除A和B列联合重复的行
df["B"].fillna("b*") ##针对B列的空值填充为b
df["E"].fillna(df["E"].mean()) #均值填充
df["E"].interpolate(method="spline",order=3) ##利用插值的方法填充
- 异常值清洗
根据常识判断样本属性的特征值,对于不可信的样本丢掉
通过逻辑推理(组合或统计属性)判定异常值
sup = df["D"].quantile(0.75) + 1.5 * (df["D"].quantile(0.75) - df["D"].quantile(0.25)) #上限
inf =df["D"].quantile(0.25) - 1.5 * (df["D"].quantile(0.75) - df["D"].quantile(0.25)) #下限
df[df["D"]<sup ][df["D"] > inf ] ##保留正常值
df[[True if item.startswith("f") else False for item in list(df["F"].values)]] ##针对第F列,选取值为f开头的数据
4数据采样
- 采样原则
样本具有代表性
样本比例要平衡以及样本不平衡时如何处理
考虑全量数据 - 方法
欠采样,把样本数极多哪一类,随机抽取部分样本或分层抽取部分样本;
欠采样,如果不希望丢弃任何有效样本,一种办法是重新收集样本量,如果没有可能性收集到更多的样本,那么可以把较多的样本类随机分成若干个子集(或利用聚类思想,分成若干个簇),分别与较少的样本类构建模型,形成若干个模型,利用投票机制,判定某一预测样本所属类别。
过采样,把数据集较少的样本类别中,随机复制相同样本,并作一些变化(比如图像识别中的镜像和旋转或随机插值活得新样本),就能达到样本均衡
修改损失函数,降低样本较多类的loss function惩罚权值,增加样较少类的loss function惩罚权值
5单个特征处理
5.1特征处理之数值型
- 每个类别下对应的变量统计值histogram
- 统计值max, min, mean, std
- 连续值离散化,转化为类别型变量,pd.cut(obj,classes_num)
- 归一化、标准化
- 对指化(softmax)、对数化
5.2特征处理之类别型 (定类或定序型数据)
-
标签化(LabelEncode())
-
Hash与聚类处理
-
Histogram映射
5.3特征处理之时间型
- 连续值
- 离散值
可以从这几个维度考虑,
year/month/day/day of week/season/week of year/hours of day/weekends or workday
5.4特征处理之文本型
- 词袋,文本数据预处理后,去掉停用词,剩下的词组成的list, 在词库中的映射稀疏向量。
- 使用Tf–idf 特征
- word2vec
5.5特征处理之统计特征
- 加减平均
- 分位线
- 次序线
- 比例类
5.6特征处理之组合特征
- 简单组合特征:拼接型
- 模型特征组合
6多个特征的处理
6.1 特征选择
- 原因
冗余:部分特征的相关度太高了,消耗计算性能。
噪声:部分特征是对预测结果有负影 - 方式
过滤型
概念:评估单个特征和预测值值之间的相关程度,排序留下 相关性较高的特征。
缺点:没有考虑到特征之间的关联作用,可能把有用 的关联特征误踢掉。
包裹型
概念:把特征选择看做一个特征子集搜索问题,筛选各种特 征子集,用模型评估效果。
① 用全量特征跑一个模型
②根据线性模型的系数(体现相关性),删掉5-10%的弱特征,观 察准确率/auc的变化
③ 逐步进行,直至准确率/auc出现大的下滑停止
嵌入型
根据模型来分析特征的重要性,最常见的方式为用正则化方式来做特征选择。
6.2 降维
- 特征选择只踢掉原本特征里和结果预测关系不大的,而做特征的计算组合构成新特征
- 两种方式:SVD和PCA