请求解读实现75%缺失项赋值的NumPy代码逻辑
代码逐行解读:实现75%数据缺失项赋值功能
这段代码的核心目的是给数据集data随机注入75%的缺失值(用np.nan标记),具体逻辑是给75%的样本各随机挑选一个特征设置为缺失。下面逐段拆解:
- 导入依赖库
import numpy as np
导入Python数值计算库numpy,后续所有数组操作、随机数生成都依赖它。
- 计算需要设置缺失的样本数量
missing_rate = 0.75 n_missing_samples = int(np.floor(data.shape[0] * missing_rate))
missing_rate = 0.75:设定缺失率为75%,即要给75%的样本添加缺失值。data.shape[0]是数据集的总样本数(行数),乘以缺失率后用np.floor()向下取整并转成整数,得到需要设置缺失值的样本总数n_missing_samples。
- 生成缺失样本标记数组
missing_samples = np.hstack( ( np.zeros(data.shape[0] - n_missing_samples, dtype=np.bool), np.ones(n_missing_samples, dtype=np.bool), ) )
np.zeros(..., dtype=np.bool):生成长度为「总样本数-缺失样本数」的布尔数组,元素全为False,代表这些样本不需要设置缺失值。np.ones(..., dtype=np.bool):生成长度为n_missing_samples的布尔数组,元素全为True,代表这些样本需要设置缺失值。np.hstack():把两个数组横向拼接,得到和总样本数长度一致的布尔数组missing_samples,此时True集中在数组末尾。
- 打乱缺失标记的顺序
rng = np.random.RandomState(0) rng.shuffle(missing_samples)
np.random.RandomState(0):创建固定种子的随机数生成器,种子设为0是为了让随机结果可复现(每次运行代码,打乱后的结果都相同)。rng.shuffle():随机打乱missing_samples的元素顺序,让True(需要缺失的样本)均匀分布,实现随机选缺失样本的效果。
- 随机选择每个缺失样本对应的特征
missing_features = rng.randint(0, data.shape[1], n_missing_samples)
data.shape[1]是数据集的总特征数(列数)。rng.randint(0, data.shape[1], n_missing_samples):生成n_missing_samples个随机整数,范围是[0, 特征总数),每个整数对应一个特征索引,意思是给每个需要缺失的样本随机选一个特征来设置缺失值。
- 给指定位置赋值为缺失值
data.values[np.where(missing_samples)[0], missing_features] = np.nan
np.where(missing_samples)[0]:找出missing_samples中所有True的索引,也就是需要设置缺失值的样本的行索引。data.values:获取数据集data的底层numpy数组(假设data是pandas的DataFrame)。- 通过行索引和特征索引的组合,把对应位置的元素赋值为
np.nan(numpy中代表缺失值的标记),完成缺失值注入。
内容的提问来源于stack exchange,提问作者Luis Valencia
相关产品推荐
相关产品推荐

