AutoEncoder可以参考:pytorch实现基本AutoEncoder与案例

AutoEncoder填充缺失值的思路是:

  1. 在完整的数据集上训练一个AutoEncoder
  2. 把有缺失的数据拿过来,先全零填充原有的值,再通过AutoEncoder得到结果
  3. 将得到的结果对应填充到原有的缺失数据上

背后的理由是,数据压缩后已经很好的掌握了原有数据的一些规律,才能很好的复原。借助这种规律来反推出缺失值,这就是AutoEncoder的有效性的来源。

示例代码

import torch
import torch.nn as nn
import torch.utils.data as Data
import numpy as np
import pandas as pd
from sklearn.metrics import mean_squared_errordef get_train_data():"""得到数据:return data_x:有缺失值的数据:return true_value:缺失数据的原始真实值:return data_y:原问题中待预测的label"""def get_tensor_from_pd(dataframe_series) -> torch.Tensor:return torch.tensor(data=dataframe_series.values)import copyfrom sklearn.datasets import make_classificationdata_x, data_y = make_classification(n_samples=1000, n_classes=4, n_features=40, n_informative=4,random_state=0)  # 6个特征data_x = pd.DataFrame(data_x)data_x.columns = ["x{}".format(i + 1) for i in range(39)] + ["miss_line"]true_data = copy.deepcopy(data_x)# 在miss_line这一列删除20%的数据,来模拟缺失值的场景drop_index = data_x.sample(frac=0.1).index  # 有缺失值的indexdata_x.loc[drop_index, "miss_line"] = np.nantrue_value = true_data.loc[drop_index, 'miss_line']  # 空值的真实值# 开始构造数据# data_x为全部的数据(包含完整数据、有缺失项的数据)full_x = data_x.drop(drop_index)lack_x = data_x.loc[drop_index]return get_tensor_from_pd(full_x).float(), get_tensor_from_pd(lack_x).float(), true_valueclass AutoEncoder(nn.Module):def __init__(self, input_size=300, hidden_layer_size=20):super().__init__()self.hidden_layer_size = hidden_layer_size# 输入与输出的维度相同self.input_size = input_sizeself.output_size = input_sizeself.encode_linear = nn.Linear(self.input_size, hidden_layer_size)self.decode_linear = nn.Linear(hidden_layer_size, self.output_size)self.relu = nn.ReLU()self.sigmoid = nn.Sigmoid()def forward(self, input_x):# encodeencode_linear = self.encode_linear(input_x)encode_out = self.relu(encode_linear)# decodedecode_linear = self.decode_linear(encode_out)  # =self.linear(lstm_out[:, -1, :])predictions = self.sigmoid(decode_linear)return predictionsif __name__ == '__main__':# 得到数据print("开始训练Auto Encoder")full_data, lack_data, true_x = get_train_data()train_loader = Data.DataLoader(dataset=Data.TensorDataset(full_data),  # 封装进Data.TensorDataset()类的数据,可以为任意维度batch_size=20,  # 每块的大小shuffle=True,  # 要不要打乱数据 (打乱比较好)num_workers=4,  # 多进程(multiprocess)来读数据)# 建模三件套:loss,优化,epochsmodel = AutoEncoder(input_size=full_data.size()[1])  # 模型loss_function = nn.MSELoss()  # lossoptimizer = torch.optim.Adam(model.parameters(), lr=0.001)  # 优化器epochs = 100# 开始训练model.train()for i in range(epochs):epoch_loss: list = []for seq in train_loader:# seq = torch.where(torch.isnan(seq), torch.full_like(seq, 0), seq)  # 全0填充缺失值seq = seq[0]optimizer.zero_grad()y_pred = model(seq).squeeze()  # 压缩维度:得到输出,并将维度为1的去除single_loss = loss_function(y_pred, seq)single_loss.backward()optimizer.step()epoch_loss.append(float(single_loss.detach()))print("EPOCH", i, "LOSS: ", np.mean(epoch_loss))# 开始填充缺失值lack_loader = Data.DataLoader(dataset=Data.TensorDataset(lack_data),  # 封装进Data.TensorDataset()类的数据,可以为任意维度batch_size=20,  # 每块的大小shuffle=True,  # 要不要打乱数据 (打乱比较好)num_workers=4,  # 多进程(multiprocess)来读数据)model.eval()pred_lack = np.array([])for seq in lack_loader:seq = seq[0]# 每个seq[:,-1]都是缺失值的位置seq = torch.where(torch.isnan(seq), torch.full_like(seq, 0), seq)  # 全0填充缺失值y_pred = model(seq).squeeze()  # 压缩维度:得到输出,并将维度为1的去除lack_pred = y_pred[:, -1]  # AutoEncoder预测的缺失值pred_lack = np.append(pred_lack, np.array(lack_pred.detach().numpy()))print("预测结果的MSE:", mean_squared_error(true_x, pred_lack))

结果如下:

EPOCH 0 LOSS:  1.458275842666626
EPOCH 1 LOSS:  1.3739446348614164
EPOCH 2 LOSS:  1.2893095705244275
EPOCH 3 LOSS:  1.2242507404751248
EPOCH 4 LOSS:  1.1825604584481981
......
EPOCH 95 LOSS:  0.9070883777406481
EPOCH 96 LOSS:  0.9068020873599583
EPOCH 97 LOSS:  0.9063400851355659
EPOCH 98 LOSS:  0.9060421744982402
EPOCH 99 LOSS:  0.9056544555558099
预测结果的MSE: 1.2656838427106964

明显训练AutoEncoder迭代100次是不够的,一般需要持续迭代,直到Loss降到一个可接受的范围才行

缺失值填充5——AutoEncoder填充序列缺失值相关推荐

  1. 缺失值填充4——使用线性模型(岭回归、Lasso回归、ElasticNet回归)填充序列缺失值

    原始的问题可能是:一个X(包含x1,x2,缺失x,x3-) =====预测=> y 模型填充缺失值:使用:x1,x2,x3- y =====预测=> 缺失x 算法思路 Lasso回归:在线 ...

  2. 机器学习数据预处理之缺失值:最小值最大值填充

    机器学习数据预处理之缺失值:最小值最大值填充 garbage in, garbage out. 没有高质量的数据,就没有高质量的数据挖掘结果,数据值缺失是数据分析中经常遇到的问题之一.当缺失比例很小时 ...

  3. 机器学习数据预处理之缺失值:固定值填充

    机器学习数据预处理之缺失值:固定值填充 garbage in, garbage out. 没有高质量的数据,就没有高质量的数据挖掘结果,数据值缺失是数据分析中经常遇到的问题之一.当缺失比例很小时,可直 ...

  4. 机器学习数据预处理之缺失值:前向填充

    机器学习数据预处理之缺失值:前向填充 garbage in, garbage out. 没有高质量的数据,就没有高质量的数据挖掘结果,数据值缺失是数据分析中经常遇到的问题之一.当缺失比例很小时,可直接 ...

  5. 机器学习数据预处理之缺失值:后向填充

    机器学习数据预处理之缺失值:后向填充 garbage in, garbage out. 没有高质量的数据,就没有高质量的数据挖掘结果,数据值缺失是数据分析中经常遇到的问题之一.当缺失比例很小时,可直接 ...

  6. 机器学习数据清洗之缺失值处理、缺失的原因、缺失值删除、缺失值填充、KNN填充

    机器学习数据清洗之缺失值处理.缺失的原因.缺失值删除.缺失值填充.KNN填充 目录

  7. 数据预处理+缺失值处理方案+Missing Value+pandas+缺失值填充方法、方案

    数据预处理+缺失值处理方案+Missing Value+pandas+缺失值填充方法.方案 缺失值+sklearn from sklearn.preprocessing import Imputer ...

  8. 缺失值填充1——缺失值查看、确定值填充、参考值填充

    可以参考:https://blog.csdn.net/weixin_35757704/article/details/89280715 查看缺失值 可以通过下面的代码得到缺失值的数量: datafra ...

  9. excel填充序列_猴哥讲述:excel的自动填充功能——自动填充单元格

    我们都知道excel的自动填充功能非常的好用,自动填充功能可以帮我们在工作中大大的提升工作效率,同时还可以准确无误的帮助我们进行数据自动输入,我们也可以自定义自动填充的序列. 一.自动填充功能,是指我 ...

最新文章

  1. 利用perf排查sys高的问题
  2. C++第9周(春)项目5 - 一元一次方程类
  3. linux编译ios动态库,[Linux] linux下生成静态库和动态库
  4. 软件测试,何去何从?想安逸不可能!软饭得硬吃...我整理的超全学习指南【值得每个测试一看】
  5. jquery中checkbox全选失效的解决方法
  6. 使用 PHP Curl 做数据中转
  7. oracle怎么查导入导出记录,Oracle实验记录——数据的导入和导出
  8. 【2017级面向对象程序设计】作业二
  9. 计算机桌面上的声音图标没了怎么办,电脑桌面的音量图标不见了怎么办
  10. Windows系统下长ping记录日志小工具
  11. c语言正方体的表面积和体积公式,长方体的表面积(正方体体积的计算公式)
  12. 松翰单片机操作日记SN8F5721(同步串口)
  13. cmd配网关_win7下用DOS命令修改IP、网关和DNS
  14. iphone屏幕镜像如何全屏_手机投屏到电视的照片如何全屏显示?
  15. iOS开发之制作越狱ios设备ipa包
  16. 第一课 初识计算机ppt,第一课 初识Powerpoint.ppt
  17. 全新整理:微软、谷歌、百度等公司经典面试100题[第101-160题]
  18. ARM920T内核工作模式
  19. MySQL之连接原理
  20. GBase产品系列介绍

热门文章

  1. python交换两个值原理_python 两数交换新写法原理
  2. 物联网卡会锁卡吗_物联网卡在建筑行业中的应用你知道吗?
  3. vector 设置大小_BetterSnapTool for Mac(窗口设置工具) v1.9.3
  4. HLSL编译工具—FXC
  5. 返回最大数,不同语言之间的比较
  6. JNI 简明教程之手把手教你入门
  7. 如何用java实现使用电子邮件控制你的电脑
  8. zend studio 的注册码-php的编辑器
  9. 工作到了第七年,说说自己每天的工作(一)
  10. 使用它tshark分析pcap的例子以及scapy下载地址