Python sklearn学习之缺失值插补

Python sklearn学习之缺失值插补

文章目录

    • Python sklearn学习之缺失值插补
      • 1 单变量插补
        • 1.1 SimpleImputer类
      • 2 多变量插补
        • 2.1 IterativeImputer类
      • 3 标记缺失值

scikit-learn要求数据没有缺失值,如果出现了缺失值,则需要对数据集进行插补——从已有数据推断出缺失的数据。

在插补过程中,若只使用缺失特征维度中非缺失值来插补该特征维度下的缺失值的插补算法,则称之为单变量算法;若使用整个可用特征维度来估计缺失的值的插补算法则称之为多变量算法。

1 单变量插补

sklearn提供了单变量插补的工具类SimpleImputer ,其提供了计算缺失值的基本策略。缺失值可以用提供的常数值计算,也可以使用缺失值所在的行/列中的统计数据(平均值、中位数或者众数)来计算。这个类也支持不同的缺失值编码。

1.1 SimpleImputer类

在版本0.20之前,请使用Imputer 类,版本0.22(包含0.22)之后的,则使用SimpleImputer

  • 类定义
def __init__(self, missing_values=np.nan, strategy="mean",
                 fill_value=None, verbose=0, copy=True, add_indicator=False):
  • 参数说明:
    • missing_values :指定何种占位符表示缺失值,可选 numberstringnp.nan(default)None
    • strategy :插补策略,字符串,默认"mean"
      • "mean" :使用每列的平均值替换缺失值,只能与数字数据一起使用
      • "median":则使用每列的中位数替换缺失值,只能与数字数据一起使用
      • "most_frequent" :则使用每列中最常用的值替换缺失值,可以与字符串或数字数据一起使用
      • "constant" :则用 fill_value 替换缺失值。可以与字符串或数字数据一起使用
    • fill_value :字符串或数值,默认"None",当strategy ==“constant”时,fill_value用于替换所有出现的missing_values。如果保留默认值,则在输入数字数据时fill_value将为0,对于字符串或对象数据类型则为“missing_value”。
    • verbose :整数,默认为0,可选的参数,控制imputer的详细程度
    • copy :略
    • add_indicator :可选,布尔值类型,默认为False。如果为True,则 MissingIndicator 变换将堆叠到imputer的变换的输出上。这允许预测估计器尽管插补而解释缺失。如果某个要素在拟合/训练时没有缺失值,即使在变换/测试时缺少值,该要素也不会出现在缺失的指示符上。
  • 属性说明
    • statistics_ :每一个样本的插补值
    • indicator_ :指示用于为缺失值添加二进制指标
  • 源码分析
imp = SimpleImputer(missing_values=np.nan, strategy='mean')
imp.fit([[1, 2], [np.nan, 3], [7, 6]])
X = [[np.nan, 2], [6, np.nan], [7, 6]]
print(imp.transform(X))
[[4.         2.        ]
 [6.         3.66666667]
 [7.         6.        ]]

SimpleImputer 类在fit过程中将会保存状态。

当使用 'most_frequent''constant' 策略时,SimpleImputer 类还支持以 string values 或 pandas categoricals 表示的分类数据(categorical data)

df = pd.DataFrame([["a", "x"], [np.nan, "y"], ["a", np.nan], ["b", "y"]], dtype="category")
imp = SimpleImputer(strategy="most_frequent")
print(imp.fit_transform(df))
out:
[['a' 'x']
 ['a' 'y']
 ['a' 'y']
 ['b' 'y']]

2 多变量插补

2.1 IterativeImputer类

IterativeImputer类的功能是,将每个缺失值的特征建模为其他特征的函数,并使用该估计值进行估算。

它以循环迭代方式实现:在每个步骤中,将特征目标列指定为输出y,将其他列视为输入X。使用一个回归器来在已知(未缺失)y的样本上对(X,y)进行拟合。然后使用这个回归器来预测缺失的y值。这是以迭代的方式对每个特征进行的,然后重复max_iter轮。最后一轮的计算结果被返回。

  • 类定义
def __init__(self, estimator=None, missing_values=np.nan, sample_posterior=False, max_iter=10, tol=1e-3, n_nearest_features=None, initial_strategy="mean", imputation_order='ascending', min_value=None, max_value=None, verbose=0, random_state=None, add_indicator=False):
  • 参数说明
    • estimator :estimator对象,默认= BayesianRidge()。循环法插补的每一步使用的估算器。如果sample_posterior为True,则估算器必须支持 return_std其predict方法。
    • missing_values :指定何种占位符表示缺失值,可选 numberstringnp.nan(default)None
    • sample_posterior :布尔值,默认为False,是否从每个插补的拟合估计的(高斯)预测后验进行采样。如果设置为True,Estimator 必须支持return_stdpredict 方法。True如果IterativeImputer用于多个插补,则设置为 。
    • max_iter :输入为int型数据,默认值是10。在返回最后一轮计算的估算值之前要执行的最大插补轮次数。
    • tol :容忍停止条件
    • n_nearest_features :用于估计每个要素列的缺失值的其他要素数。使用每个特征对之间的绝对相关系数(在初始插补之后)测量特征之间的接近度。为了确保在整个插补过程中覆盖特征,邻居特征不一定是最接近的,而是以与每个插补目标特征的相关性成比例的概率绘制。当功能数量巨大时,可以提供显着的加速。如果None,将使用所有功能。
    • initial_strategy :使用哪种策略初始化缺失值。与 SimpleImputer 中的strategy参数相同
    • imputation_order :排序规则
      • ascending :从缺失值最少的功能到最多
      • descending :从具有最多缺失值的功能到最少
      • roman :左到右
      • arabic :右到左
      • random :随机顺序
    • min_value :最小可能的估算值。默认值None将最小值设置为负无穷大。
    • max_value :最大可能的估算值。默认值None将最大值设置为正无穷大。
    • verbose :详细程度标志控制在评估函数时发出的调试消息。越高越详细。可以是0,1或2。
    • random_state :伪随机数生成器的种子使用。如果 n_nearest_features不是Noneimputation_order则随机选择估计器特征, if random和后验if的采样sample_posterior为True。
    • add_indicator :如果为True,则MissingIndicator变换将堆叠到imputer的变换的输出上。这允许预测估计器尽管插补而解释缺失。如果某个要素在拟合/训练时没有缺失值,即使在变换/测试时缺少值,该要素也不会出现在缺失的指示符上。
  • 实例
imp = IterativeImputer(max_iter=10, random_state=0)
imp.fit([[1, 2], [3, 6], [4, 8], [np.nan, 3], [7, np.nan]])
X_test = [[np.nan, 2], [6, np.nan], [np.nan, 6]]
np.round(imp.transform(X_test))

# [['a' 'x']
#  ['a' 'y']
#  ['a' 'y']
#  ['b' 'y']]

3 标记缺失值

MissingIndicator 转换器用于将数据集转换为相应的二进制矩阵,以指示数据集中缺失值的存在。这个变换与归算结合起来是有用的。当使用插补时,保存关于哪些值丢失的信息可以提供有用的信息。

X = [[-1, 2], [6, -1], [7, 6]]
indicator = MissingIndicator(missing_values=-1)
mask_missing_values_only = indicator.fit_transform(X)
# out
# array([[ True,  True, False],
#        [False,  True,  True],
#       [False,  True, False]])
def __init__(self, missing_values=np.nan, features="missing-only",
                 sparse="auto", error_on_new=True):
  • 参数说明
    • missing_values :指定何种占位符表示缺失值,可选 numberstringnp.nan(default)None
    • features :植入掩模是否应代表全部或部分特征。
      • “missing-only” (default):在fit时返回包含缺失值的特征的输入掩码
      • “all”:回所有特征,无论它们是否包含缺失的值
    • sparse :返回的标记矩阵是否是稀疏
      • auto:则imputer mask将与输入类型相同
      • True:则imputer mask将是稀疏
      • False:则imputer mask将是一个numpy数组
    • error_on_new :布尔值,如果为True(默认值),当变换中不含有缺少缺少值的要素时,transform将引发错误。这仅适用于features="missing-only"

你可能感兴趣的:(机器学习)