缺失值填充5——AutoEncoder填充序列缺失值
AutoEncoder可以参考:pytorch实现基本AutoEncoder与案例
AutoEncoder填充缺失值的思路是:
- 在完整的数据集上训练一个AutoEncoder
- 把有缺失的数据拿过来,先全零填充原有的值,再通过AutoEncoder得到结果
- 将得到的结果对应填充到原有的缺失数据上
背后的理由是,数据压缩后已经很好的掌握了原有数据的一些规律,才能很好的复原。借助这种规律来反推出缺失值,这就是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填充序列缺失值相关推荐
- 缺失值填充4——使用线性模型(岭回归、Lasso回归、ElasticNet回归)填充序列缺失值
原始的问题可能是:一个X(包含x1,x2,缺失x,x3-) =====预测=> y 模型填充缺失值:使用:x1,x2,x3- y =====预测=> 缺失x 算法思路 Lasso回归:在线 ...
- 机器学习数据预处理之缺失值:最小值最大值填充
机器学习数据预处理之缺失值:最小值最大值填充 garbage in, garbage out. 没有高质量的数据,就没有高质量的数据挖掘结果,数据值缺失是数据分析中经常遇到的问题之一.当缺失比例很小时 ...
- 机器学习数据预处理之缺失值:固定值填充
机器学习数据预处理之缺失值:固定值填充 garbage in, garbage out. 没有高质量的数据,就没有高质量的数据挖掘结果,数据值缺失是数据分析中经常遇到的问题之一.当缺失比例很小时,可直 ...
- 机器学习数据预处理之缺失值:前向填充
机器学习数据预处理之缺失值:前向填充 garbage in, garbage out. 没有高质量的数据,就没有高质量的数据挖掘结果,数据值缺失是数据分析中经常遇到的问题之一.当缺失比例很小时,可直接 ...
- 机器学习数据预处理之缺失值:后向填充
机器学习数据预处理之缺失值:后向填充 garbage in, garbage out. 没有高质量的数据,就没有高质量的数据挖掘结果,数据值缺失是数据分析中经常遇到的问题之一.当缺失比例很小时,可直接 ...
- 机器学习数据清洗之缺失值处理、缺失的原因、缺失值删除、缺失值填充、KNN填充
机器学习数据清洗之缺失值处理.缺失的原因.缺失值删除.缺失值填充.KNN填充 目录
- 数据预处理+缺失值处理方案+Missing Value+pandas+缺失值填充方法、方案
数据预处理+缺失值处理方案+Missing Value+pandas+缺失值填充方法.方案 缺失值+sklearn from sklearn.preprocessing import Imputer ...
- 缺失值填充1——缺失值查看、确定值填充、参考值填充
可以参考:https://blog.csdn.net/weixin_35757704/article/details/89280715 查看缺失值 可以通过下面的代码得到缺失值的数量: datafra ...
- excel填充序列_猴哥讲述:excel的自动填充功能——自动填充单元格
我们都知道excel的自动填充功能非常的好用,自动填充功能可以帮我们在工作中大大的提升工作效率,同时还可以准确无误的帮助我们进行数据自动输入,我们也可以自定义自动填充的序列. 一.自动填充功能,是指我 ...
最新文章
- 利用perf排查sys高的问题
- C++第9周(春)项目5 - 一元一次方程类
- linux编译ios动态库,[Linux] linux下生成静态库和动态库
- 软件测试,何去何从?想安逸不可能!软饭得硬吃...我整理的超全学习指南【值得每个测试一看】
- jquery中checkbox全选失效的解决方法
- 使用 PHP Curl 做数据中转
- oracle怎么查导入导出记录,Oracle实验记录——数据的导入和导出
- 【2017级面向对象程序设计】作业二
- 计算机桌面上的声音图标没了怎么办,电脑桌面的音量图标不见了怎么办
- Windows系统下长ping记录日志小工具
- c语言正方体的表面积和体积公式,长方体的表面积(正方体体积的计算公式)
- 松翰单片机操作日记SN8F5721(同步串口)
- cmd配网关_win7下用DOS命令修改IP、网关和DNS
- iphone屏幕镜像如何全屏_手机投屏到电视的照片如何全屏显示?
- iOS开发之制作越狱ios设备ipa包
- 第一课 初识计算机ppt,第一课 初识Powerpoint.ppt
- 全新整理:微软、谷歌、百度等公司经典面试100题[第101-160题]
- ARM920T内核工作模式
- MySQL之连接原理
- GBase产品系列介绍