特征工程3:缺失值及数据降维

缺失值的处理
由于各种原因,许多现实世界的数据集包含缺少的值,通常编码为空白,NaN或其他占位符。然而,这样的数据集与scikit-learn的分类器不兼容,它们假设数组中的所有值都是数字,并且都具有和保持含义。使用不完整数据集的基本策略是丢弃包含缺失值的行或列。然而,这样的代价是可能丢失有价值的数据,如果每行或每列缺失数据占比比较大,建议直接放弃这些数据,否则更好的策略是估算缺失值,并将其填充。
scikit-learn中填充缺失值的API是Imputer类,使用方法如下:
from sklearn.preprocessing import Imputer 

import numpy as np
# 缺失值填补的时候必须得是float类型
# 缺失值要填充为np.nan,它是浮点型,strategy是填充的缺失值类型,这里填充平均数,axis代表轴,这里第0轴是列
im = Imputer(missing_values='NaN',strategy='mean',axis=0)
data = im.fit_transform([[1, 2], [np.nan, 3], [7, 6]])
print(data)
参数strategy有三个值可选:mean(平均值),median(中位数),most_frequent(众数)
输出结果:
array([[ 1., 2.], 
          [ 4., 3.], 
          [ 7., 6.]])
可见:之前的缺失值被这一列的平均值((1+7)/2=4)填充了
 
数据降维
 
1、数据降维是什么?
 
降维不是指的数组的维度减少,而是特征的数量减少。
 
2、为什么要降维?
 
当数据集的特征非常多时,特征冗余,要么是一些无用的特征,要么是表达重复信息的特征,这些数据会消耗计算性能,正确降维后的数据一般保留了原始数据的大部分重要信息,完全可以替代原始数据作为输入,从而提高性能。
 
3、常用的两种降维方式:1、特征选择; 2、 主成分分析(PCA);
 
1、特征选择
特征选择是什么?
特征选择就是从所有特征中选择一部分特征作为算法的输入数据
特征选择的三种方法:
  1. 过滤式(Filter):VarianceThreshold
  2. 嵌入式(Embedded):正则化、决策树
  3. 包裹式(Warpper)
  4. 神经网络
这里我们先只介绍过滤式的方差过滤,包裹式很少使用,嵌入式和神经网络留到后面具体介绍
 
scikit-learn中使用方差进行过滤的API是:feature_selection.VarianceThreshold
from sklearn.feature_selection import VarianceThreshold 
# 返回值:训练集将删除方差低于threshold的特征,threshold默认为0,即删除方差为0的特征 
var = VarianceThreshold(threshold=0.0) 
# 使用fit_transform进行转化 
data = var.fit_transform([[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]]) print(data)
输出结果:
array([[2, 0], 
      [1, 4],
      [1, 1]])
上面使用方差过滤后,输出结果是删除了方差为0的数据。 过滤式的方法常用的就是方差选择,因为方差代表了数据的稳定性,方差越小,数据的波动越小,对结果的影响也就越小,方差为0时,说明这一列的特征值相同,对于结果判断毫无影响,因此将其删除,以提高计算性能。
 
2、主成分分析(PCA)
 
主成分分析是什么?
 
顾名思义:主成分分析即对数据集进行简化,通过线性变换将多个特征合并为少数互不相关的综合特征(即主成分),简化之后,数据的维度降低,但所包含的信息量并不减少,能够最大限度的反映原始数据。
 
scikit-learn中PCA的API是:decomposition.PCA
当特征数量非常多达到上百时,才有必要使用主成分分析,下面只是用四个特征演示一下用法
from sklearn.decomposition import PCA 
# n_components:指定要保留的数据信息为90%,通常保留值在90%-95%之间 
pca = PCA(n_components=0.9) 
data = pca.fit_transform([[2,8,4,5], [6,3,0,8], [5,4,9,1]]) print(data)
PCA中的参数n_components可以为整数,也可以为小数; 为小数时代表保留的信息百分比,比如上面0.9就是保留90%的信息; 为整数时代表保留的特征数量,我们通常不会预先知道保留几个特征比较合适,所以通常不用整数。
 
输出结果:
array([[ -9.33473422e-16, 3.82970843e+00], 
          [ -5.74456265e+00, -1.91485422e+00], 
          [ 5.74456265e+00, -1.91485422e+00]])
 
总结:
1、scikit-learn中缺失值的处理;
2、数据降维的两种方式:过滤式特征选择、PCA(主成分分析);
3、过滤式特征选择所得到数据是原始数据的子集,PCA得到的数据是经过重新计算的,不是原始数据的子集,但保留了原始数据所代表的信息。
原文地址:https://www.cnblogs.com/chaofan-/p/11050120.html