训练数据缺失处理方法
最近在做一个模型,通过输入的病人身体各项数据判断能否对治疗药物产生应答。基本上来说就是一个普通的分类模型,逻辑回归。
但是我遇到了一个问题,就是训练数据中有大量缺失,后来我向熟人了解到,这是在所难免的,有些患者转院过来,在不同地方就诊,已经提供的身体指标就这些,医院方面也已经确诊了患者,不好再让患者花钱去做测量其他指标的各项检查。
那应该如何处理这些缺失数据,实现一个比较合理的模型呢?
缺失数据在trainingData中占一定比例,dropna
掉所有的缺失值显然是不合适的。
我知道可以用均值、随机数等方式填充,我综合了一下二者,用这一列的确知数据产生的正态分布去随机缺失数据了。
isna = np.array(fetch_data.isna())
fetch_data = np.array(fetch_data, dtype=float)
for i in range(sure_batch, np.shape(isna)[0]):
for j in range(np.shape(isna)[1]):
if isna[i][j]:
fetch_data[i][j] = np.random.normal(data_mean[j], data_std[j])
np.random.shuffle(fetch_data)
# return torch.Tensor(fetch_data[:, : -1]).float(),torch.Tensor(fetch_data[:, -1]).float().view(-1, 1)
但是这样模型训练准确率也最好只训练到了90%。所以我去网上整理了一下大家关于缺失值的处理方法。这一篇总结比较全面。
删除数据
将这一组数据删除,简单粗暴,但是如果数据集中缺失数据占比很大,这会造成可用数据急剧减小;当缺失数据的分布呈现某种特征/分布,这会让训练数据产生较大偏差,最终导致模型的偏差。
df.dropna(how="any")
删除特征
如果可用特征很多,某些缺失少的特征又与有缺失的特征呈现某种相关性,那么不妨直接不考虑这一个特征,它的影响让模型在矩阵中反映出来。
均值/中位数/众数填补
这应该是一个很好理解的做法,适用于数据比较简单的情况,如果缺失不多,那么填充之后数据的统计特性上不会有太大的影响。
热卡填补
在数据中查找和缺失组在其他特征上表现非常相似的数据,如果一样就随机选择一个。通常选择的其他比较特征要多于一个。这个问题关键是不同的问题可能会选用不同的标准来对相似进行判定,以及如何制定这个判定标准。
拟合缺失值
通过其他已有特征来训练对缺失特征的预判。比如缺失性别,可以根据身高、体重和一些其他身体特征对性别进行逻辑回归,缺失身高,可以用性别、体重、年龄等进行回归拟合。这种做法灵活性比较高,但是过程也很复杂,首先需要先训练填补缺失值模型,再用填补后的数据去比较相同训练方法下对原本结果的预测,比其他方法在训练成本上要expensive不少。
多值插补
(待补)
随机森林
随机森林对缺失值处理比较不同,在数据中先选择合理的特征,构造决策树。根据这里的描述,随机森林记录所有数据的决策树上的路径,然后比较缺失数据与哪些数据的路径相似度高,用这些数据,引入相似度矩阵对其进行评估,选择打分最高的预估数据。
作为新数据
将数据特征转化为高维空间,引入NAN
作为新的数据特征,比如性别分为1.明确男性2.明确女性3.不明确。
虚拟变量
为数据新加一维特征,表示是否有数据缺失,如果有很多种特征缺失,可能要把这个二值特征改成能表示多种缺失的。
其他
欢迎大佬不吝赐教,补充你的数据缺失处理方法!谢谢🙏