缺失值填充5——AutoEncoder填充序列缺失值

2023-11-07

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_error


def 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 copy
    from sklearn.datasets import make_classification
    data_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  # 有缺失值的index
    data_x.loc[drop_index, "miss_line"] = np.nan
    true_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_value


class 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_size
        self.output_size = input_size

        self.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):
        # encode
        encode_linear = self.encode_linear(input_x)
        encode_out = self.relu(encode_linear)
        # decode
        decode_linear = self.decode_linear(encode_out)  # =self.linear(lstm_out[:, -1, :])
        predictions = self.sigmoid(decode_linear)
        return predictions


if __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,优化,epochs
    model = AutoEncoder(input_size=full_data.size()[1])  # 模型
    loss_function = nn.MSELoss()  # loss
    optimizer = 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降到一个可接受的范围才行

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

缺失值填充5——AutoEncoder填充序列缺失值 的相关文章

  • Python 类型提示 Dict 语法错误 可变默认值是不允许的。使用“默认工厂”

    我不知道为什么解释器会抱怨这个类型的字典 对于这两个实例 我得到一个 不允许可变默认值 使用默认工厂 语法错误 我使用的是 python 3 7 3 from dataclasses import dataclass from typing
  • 让 VoiceChannel.members 和 Guild.members 返回完整列表的问题

    每当我尝试使用 VoiceChannel members 或 Guild members 时 它都不会提供适用成员的完整列表 我从文本命令的上下文中获取 VoiceChannel 和 Guild 如下所示 bot command name
  • 为什么 dataclasses.astuple 返回类属性的深层副本?

    在下面的代码中astuple函数正在执行数据类的类属性的深层复制 为什么它不能产生与函数相同的结果my tuple import copy import dataclasses dataclasses dataclass class Dem
  • matplotlib 图中点的标签

    所以这是一个关于已发布的解决方案的问题 我试图在我拥有的 matplotlib 散点图中的点上放置一些数据标签 我试图在这里模仿解决方案 是否有与 MATLAB 的 datacursormode 等效的 matplotlib https s
  • 我应该使用 Python 双端队列还是列表作为堆栈? [复制]

    这个问题在这里已经有答案了 我想要一个可以用作堆栈的 Python 对象 使用双端队列还是列表更好 元素数量较少还是数量较多有什么区别 您的情况可能会根据您的应用程序和具体用例而有所不同 但在一般情况下 列表非常适合堆栈 append is
  • 如何从Python中的函数返回多个值? [复制]

    这个问题在这里已经有答案了 如何从Python中的函数返回多个变量 您可以用逗号分隔要返回的值 def get name you code return first name last name 逗号表示它是一个元组 因此您可以用括号将值括
  • 在 Django Admin 中调整字段大小

    在管理上添加或编辑条目时 Django 倾向于填充水平空间 但在某些情况下 当编辑 8 个字符宽的日期字段或 6 或 8 个字符的 CharField 时 这确实是一种空间浪费 字符宽 然后编辑框最多可容纳 15 或 20 个字符 我如何告
  • Python 3d 绘图设置固定色阶

    我正在尝试绘制两个 3d 数组 第一个数组的 z 值在范围内 0 15 0 15 第二个来自 0 001 0 001 当我绘图时 色标自动遵循数据范围 如何设置自定义比例 我不想看到 0 001 的浅色 而应该看到 0 15 的浅色 如何修
  • PyQt 使用 ctrl+Enter 触发按钮

    我正在尝试在我的应用程序中触发 确定 按钮 我当前尝试的代码是这样的 self okPushButton setShortcut ctrl Enter 然而 它不起作用 这是有道理的 我尝试查找一些按键序列here http ftp ics
  • GUI(输入和输出矩阵)?

    我需要创建一个 GUI 将数据输入到矩阵或表格中并读取此表单数据 完美的解决方案是限制输入表单仅允许float 例如 A 1 02 0 25 0 30 0 515 0 41 1 13 0 15 1 555 0 25 0 14 1 21 2
  • 无法导入 langchain.agents.load_tools

    我正在尝试使用 LangChain Agents 但无法导入 load tools 版本 langchain 0 0 27 我尝试过这些 from langchain agents import initialize agent from
  • 通过Python连接到Bigquery:ProjectId和DatasetId必须非空

    我编写了以下脚本来通过 SDK 将 Big Query 连接到 Python 如下所示 from google cloud import bigquery client bigquery Client project My First Pr
  • 当字段是数字时怎么说...在 mongodb 中匹配?

    所以我的结果中有一个名为 城市 的字段 结果已损坏 有时它是一个实际名称 有时它是一个数字 以下代码显示所有记录 db zips aggregate project city substr city 0 1 sort city 1 我需要修
  • Python - 如何确定解析的 XML 元素的层次结构级别?

    我正在尝试使用 Python 解析 XML 文件中具有特定标记的元素并生成输出 excel 文档 该文档将包含元素并保留其层次结构 我的问题是我无法弄清楚每个元素 解析器在其上迭代 的嵌套深度 XML 示例摘录 3 个元素 它们可以任意嵌套
  • Python GTK+ 画布

    我目前正在通过 PyGobject 学习 GTK 需要画布之类的东西 我已经搜索了文档 发现两个小部件似乎可以完成这项工作 GtkDrawingArea 和 GtkLayout 我需要一些基本函数 如 fillrect 或 drawline
  • 如何以正确的方式为独立的Python应用程序制作setup.py?

    我读过几个类似的主题 但还没有成功 我觉得我错过或误解了一些基本的事情 这就是我失败的原因 我有一个用 python 编写的 应用程序 我想在标准 setup py 的帮助下进行部署 由于功能复杂 它由不同的 python 模块组成 但单独
  • 每当使用 import cv2 时 OpenCV 都会出错

    我在终端上使用 pip3 install opencv contrib python 安装了 cv2 并且它工作了 但是每当我尝试导入 cv2 或运行导入了 cv2 的 vscode 文件时 在 python IDLE 上它都会说 Trac
  • 如何使用 Boto3 启动具有 IAM 角色的 EC2 实例?

    我无法弄清楚如何使用指定的 IAM 角色在 Boto3 中启动 EC2 实例 以下是迄今为止我如何成功创建实例的一些示例代码 import boto3 ec2 boto3 resource ec2 region name us west 2
  • 如何将Python3设置为Mac上的默认Python版本?

    有没有办法将 Python 3 8 3 设置为 macOS Catalina 版本 10 15 2 上的默认 Python 版本 我已经完成的步骤 看看它安装在哪里 ls l usr local bin python 我得到的输出是这样的
  • 如何在Python脚本中从youtube-dl中提取文件大小?

    我是 python 编程新手 我想在下载之前提取视频 音频大小 任何 YouTube 视频 gt gt gt from youtube dl import YoutubeDL gt gt gt url https www youtube c

随机推荐

  • HTML5+CSS3定位+导航二维码显示隐藏切换案例

  • Qt 样式表介绍

    概述 Qt Widget界面美化除了自己绘制外 有一个更简单高效的方式 就是Qt样式表 Qt样式表是一种强大的机制 通过QApplication setStyleSheet 设置整个应用程序的样式 通过QWidget setStyleShe
  • 分享几个图床网址,便于大家分享图片

    1 ImgURL 图床ImgURL ImgURL免费图床https https www imgurl org 又是一个比较老牌的免费图床服务 稳定性不错 无需注册 游客限制每日上传10张 单张图片不能超过 5M 支持 HTTPS 诞生于20
  • 数组的方法-sort()

    数组的sort 方法主要用于对数组的元素进行排序 其中 sort 方法有一个可选参数 但是 此参数必须是函数 数组在调用sort 方法时 如果没有传参将按字母顺序 字符编码顺序 对数组中的元素进行排序 如果想按照其他标准进行排序 就需要进行
  • Vue路由+NodeJs环境搭建

    Vue路由 NodeJs环境搭建 一 Vue路由 第一步 引入js文件 第二步 创建两个组件展示相关的功能 第三步 形成组件与请求路径的对应关系 第四步 将路由关系和路由对象绑定 第五步 将路由关系和vue实例绑定 第六步 发起请求 第七步
  • 1、docker 镜像操作

    1 创建 拉取镜像 docker hub https hub docker com 搜索对应的镜像 搜索 nvidia cuda 在tags里最终选择 10 2 cudnn7 devel ubuntu18 04版本 最终完整的镜像名 nvi
  • 域名,端口,IP总结

    前言 真正的房子只有几个门 但是一个IP地址的端口可以有65536 即 2 16 个之多 端口是通过端口号来标记的 端口号只有整数 范围是从0 到65535 2 16 1 我们知道 一台拥有IP地址的主机可以提供许多服务 比如Web服务 F
  • 智能交通技术(ITSTech)公号推广简介

    2023年9月14日更新 一 智能交通技术 微信公众号 简介 关注智能交通 车路协同 交通规划 交通改善 智慧城市等领域新理论和技术发展 交流大数据 云边端计算 人工智能 区块链等技术的应用经验 推广智能交通技术在交通规划 交通运输监管 交
  • hj212协议如何和php通讯,HJ212数据传输标准报文解析

    HJ212分为2005年 HJ T212 2005 和2017年 HJ212 2017 的版本 略有不同 网上没找到非常官方的渠道下载 在这贴一份2017年版本的下载地址 TCP IP通讯包组成 名称 类型 长度 描述 包头 字符 2 固定
  • 有符号数和无符号数

    1 数值 针对二进制来讲 有 有符号数 signed 和无符号数 unsigned 因为计算机无法区分一个二进制数是有符号数还是无符号数 因此我们在定义时要明确该数值是有符号数还是无符号数 无符号类型需要通过unsigned关键字指定 否则
  • 下载bison和flex的好地方

    http sourceforge net projects gnuwin32 这里的bison和flex我觉得是最好用的 捣乱的
  • vue el-form-item给多个表单项绑定rules校验规则

    vue el form item给多个表单项绑定rules规则 如图所示 我们想要在element的表单里 给多个input添加校验规则 只需要在内部添加el form item项 并在el form item项里绑定prop和rules规
  • 基于Prompt的MLM文本分类

    简介 常规NLP做文本分类时常用Transfer Learning的方式 在预训练bert上加一个分类层 哪个输出节点概率最大则划分到哪一类别 而基于Prompt的MLM文本分类是将文本分类任务转化为MLM Masked Language
  • 自动驾驶前沿综述:基于深度强化学习的自动驾驶算法

    作者 TIM 编辑 汽车人 原文链接 https zhuanlan zhihu com p 477372894 点击下方卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心技术交流群 后台回复 数据集下载 获
  • python弹窗程序教程(附源码解析)

    python弹窗程序教程 附源码解析 声明 此程序仅供娱乐整蛊 使用者后果自负 本人概不负责 代码可能有雷同 如有侵权 请联系小编 引言 弹窗是程序的一种显示内容的形式 例如警告 提示等 而弹窗还有一种特殊的呈现形式 恶意程序 有人说不就是
  • VUE3写后台管理(3)

    VUE3写后台管理 3 1 环境 1 node 2 vite 3 Element plus 4 vue router 5 element icon 6 less 7 vuex 8 vue demi 9 mockjs 10 axios 11
  • Top 5 Best Open Source Projects on GitHub 2023

    这里介绍Github上 5 个增长最快的开源项目 它们为原有的解决方案提供了更加具有成本效益的替代方案 并为开发者 数据分析师和企业提供了高可用的工具产品 利用开源的优势 这5个项目拓展了强大而有效的解决方案 是值得收藏 分享以及探索尝试的
  • wayland 概述

    wayland 背景 强烈推荐在阅读本文前先浏览以下文档 Wayland Architecture 概述 wayland 是一种用于用于显示服务器的协议 它规定了客户端如何与服务器进行通信 也就是说 wayland 仅仅只是标准化 了客户端
  • 数据太大,long放不下的问题。numberOutOf Range

    数据库返回的数据 long存不下 改为用String类型
  • 缺失值填充5——AutoEncoder填充序列缺失值

    AutoEncoder可以参考 pytorch实现基本AutoEncoder与案例 AutoEncoder填充缺失值的思路是 在完整的数据集上训练一个AutoEncoder 把有缺失的数据拿过来 先全零填充原有的值 再通过AutoEncod