运用多输入模型优化不同维度特征

news2024/11/25 19:18:20

运用多输入模型优化不同维度特征

背景介绍

使用神经网络模型做用户付费金额预测,一种常见的特征工程场景,是把某个特定付费区间,比如付费金额大于10小于等于12的付费用户信息处理成特征,既可以将这部分用户的付费人数作为特征,也可以将这部分用户的付费金额总和作为特征。

对于上述的两种不同维度的特征,发现一个有意思的现象,按用户属性,比如国家,平台等属性对用户样本分组,部分样本在有付费人数特征的模型(简称模型A)上表现更好,即预测结果的误差更小,另一部分样本在有付费金额特征的模型(简称模型B)上表现更好。

如果能把这两个模型合并成一个模型,理论上可以让不同分组的样本都取得最好的效果。尝试把付费人数特征和付费金额特征同时放入同一个模型(简称模型C)里,但由于付费金额特征的值比付费人数的值要大得多,整体模型表现会更接近只有付费金额特征的模型B,达不到理想效果。

优化方案

针对这种多组不同维度的特征输入同一个模型(简称模型D),keras支持通过functional API构建多输入模型,能很好地同时处理多组特征,不会因为一组特征在数值上更明显而忽略另一组特征。(需要TensorFlow 2.0以上版本)

img

Talk is cheap. Show me the code.

废话少说,上代码。

  1. 准备数据特征

    x_user_train是付费人数特征,x_price_train是付费金额特征。

  2. 构建输入

    分别使用付费人数特征和付费金额特征构建不同的输入输出。

        # 构建付费人数特征部分的输入输出
        in_user = layers.Input(shape = [len(x_user_train.columns)], name='user')
        out_user = layers.Dense(len(x_user_train.columns),
                                activation='linear',
                                kernel_constraint=keras.constraints.NonNeg())(in_user)
    
        # 构建付费金额特征部分的输入输出
        in_price = layers.Input(shape = [len(x_price_train.columns)], name='price')
        out_price = layers.Dense(len(x_price_train.columns),
                                 activation='linear',
                                 kernel_constraint=keras.constraints.NonNeg())(in_price)
  1. 组合输出 将上述两个输出组合成一个输出。

        # 将两个输出组合成一个输出
        out = layers.concatenate([out_user, out_price])
        out = layers.Dense(len(x_user_train.columns) + len(x_price_train.columns),
                           activation="linear",
                           kernel_constraint=keras.constraints.NonNeg())(out)
        out = layers.Dense(1,
                           activation="linear",
                           kernel_constraint=keras.constraints.NonNeg())(out)
  1. 构建模型

    构建一个两个输入一个输出的模型。

        # 构建一个两个输入一个输出的模型
        model = models.Model(inputs=[in_user, in_price], outputs=out)
  2. 运行结果

    1. 在所有测试样本量的总体预测误差上,模型D明显优于前面三个模型,在误差指标上有3%到6%的显著提升。
模型A模型B模型C模型D
总体预测误差20.591%17.791%17.656%14.531%

​ 2. 模型D同时保留了部分样本在模型A上表现更好,另一部分样本在模型B上表现更好的特点,达到理想效果。

结论

构建多输入模型处理多组不同维度的特征,对比单组特征模型,能显著提升模型技术指标和业务效果。同时,多输入模型能很好保留不同类型样本适应不同维度特征的特点,堪称神器。

附录

建立模型部分的完整代码如下:

from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras import models


def build_model(x_user_train, x_price_train):
    # 构建付费人数特征部分的输入
    in_user = layers.Input(shape=[len(x_user_train.columns)], name='user')
    out_user = layers.Dense(len(x_user_train.columns),
                            activation='linear',
                            kernel_constraint=keras.constraints.NonNeg())(in_user)

    # 构建付费金额特征部分的输入
    in_price = layers.Input(shape=[len(x_price_train.columns)], name='price')
    out_price = layers.Dense(len(x_price_train.columns),
                             activation='linear',
                             kernel_constraint=keras.constraints.NonNeg())(in_price)

    # 将两个输入组合成一个输出
    out = layers.concatenate([out_user, out_price])
    out = layers.Dense(len(x_user_train.columns) + len(x_price_train.columns),
                       activation="linear",
                       kernel_constraint=keras.constraints.NonNeg())(out)
    out = layers.Dense(1,
                       activation="linear",
                       kernel_constraint=keras.constraints.NonNeg())(out)

    # 构建两个输入一个输出的模型
    model = models.Model(inputs=[in_user, in_price], outputs=out)

    optimizer = tf.keras.optimizers.RMSprop(0.001)

    model.compile(loss='mse',
                  optimizer=optimizer,
                  metrics=['mse', 'mape'])
    return model

本文由博客一文多发平台 OpenWrite 发布!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/539089.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自助迁移工具升级!如何从 Confluence 切换至 ONES Wiki?

近日,ONES 升级了 Confluence 自助迁移工具,对迁移数据类型、迁移范围、迁移模式等多个维度的能力进行了提升,帮助企业更高效率、更低成本地将 Confluence 中的数据完整、准确地迁移至 ONES Wiki 中。 在 Confluence 与 ONES 服务资源充足的前…

国民游戏王者荣耀的真实地图开发之路

👉腾小云导读 相信很多人都玩过王者荣耀,大家在欣赏其华丽的游戏界面以及炫酷的游戏技能时,是否好奇过王者荣耀的地图是怎样开发出来的?在开发的历程中,都有哪些问题?是怎样解决的?本文将从其地…

飞桨+文心一言的“动力装置”,藏着百度财报的增长密码

我们习以为常的科技世界,正在以肉眼可见的速度被大模型所改变甚至重构。不想错失机遇的科技企业,都怀揣着造AI重器的梦想,各种大模型纷至沓来。 发布大模型只是开始,如同火箭发射,升空是第一步,后续能否顺利…

【运维知识进阶篇】集群架构-Nginx反向代理详解

在互联网请求中,客户端通常无法直接向服务端发起请求,就需要用代理服务,来实现客户端和的交互,起到一个中介的作用。 Nginx代理服务常见模式 Nginx代理按照应用场景模式可以分为正向代理和反向代理。 正向代理是内部上网过程中&a…

将矩阵按指定对角线转化为一个下三角矩阵numpy.tril()方法

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将矩阵按指定对角线转化为一个下三角矩阵 numpy.tril() 选择题 关于以下代码说法错误的一项是? import numpy as np a np.array([[1,2],[3,4]]) print("【显示】a\n",a) print(&…

Nevron Open Vision for .NET 2023.1 Crack

Nevron Open Vision for .NET 2023.1 添加对 .NET Core 7.0 的支持以及用于图表控件的新 3D 渲染引擎。 2023 年 5 月 17 日 - 14:09 新版本 特征 一般改进 添加了对 Microsoft .NET 7.0 的支持- NOV 现在完全支持 .NET Core 7.0,此外还支持 Microsoft .NET Framewo…

chatgpt赋能Python-pycharm降低numpy版本

Pycharm中降低Numpy版本的步骤 如果你在使用Pycharm进行Python编程时遇到了Numpy版本不兼容的问题,你可能需要降低Numpy的版本。在这篇文章中,我们将介绍如何在Pycharm中降低Numpy版本,以便Python程序能够正常运行。 什么是Numpy&#xff1…

测试入门篇

软件测试入门 1.啥是软件测试?2.测试和开发的区别3.测试和调试的区别4.软件测试人员需具备的素质5.测试入门5.1 需求介绍/从测试人员的角度看需求5.2 测试用例5.3 bug介绍5.4 软件的生命周期 6.开发模型6.1 瀑布模型6.2 螺旋模型6.3 增量、迭代模型6.4 敏捷模型(scr…

【贪吃蛇小游戏】宝塔面板快速搭建贪吃蛇小游戏Web网站 - 无需云服务器

文章目录 前言视频教程1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面 转载自远程内网穿透的文章:Linux使用宝塔面板搭建网站,并内网穿透实现公网访问 前言 宝塔面板作为简单好用的服务器运维管理面…

【深度学习】Yolov8追踪从0到1, 这要是做计数啥的,简单的一批

文章目录 前言用了将近2年的yolov5了,之前主要做目标检测后面,还做了yolov5的分割任务和模型转换,现在又有了新任务了。是时间玩玩新模型了。 最好的方式是看文档:https://docs.ultralytics.com/ ![在这里插入图片描述](https://i…

Jmeter的提取值存入csv或excel中,BeanShell PostProcessor后置处理器可满足

实际用户场景:用户登录小游戏,可进行各种操作,例如查看排行榜,玩游戏,进行留言等,现在需要对三个接口查看排行榜/玩游戏/留言进行压测,有两种压测方案: 方案一:将登录接…

JAVA算法(二)排序算法

一、冒泡排序 定义:相邻的数据两两比较,小的 放前面,大的放后面 过程: 相邻的元素两两比较,小的放左边,大的放右边。第一轮比较完毕之后,最大值就已经确定,第二轮可以少循环一次&…

第二章MATLAB基础

在本章我将向大家介绍MATLAB的基本元素。在本章的章末,你将会编写简单的函数 化的工具。 2.1 变量和数组 MATLAB程序的基本数据单元是数组。一个数组是以行和列组织起来的数据集合,并 且拥有一个数组名。数组中的单个数据是可以被访问的,访问的方法是数组名后带一个括号,…

C/C++每日一练(20230518) 表列序号、移除元素、接雨水

目录 1. Excel表列序号 🌟 2. 移除元素 🌟 3. 接雨水 🌟🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. Excel表列序…

2023年美国大学生数学建模竞赛A题受干旱影响的植物群落解题全过程文档及程序

2023年美国大学生数学建模竞赛 A题 受干旱影响的植物群落 原题再现: 背景介绍   不同种类的植物以不同的方式对压力作出反应例如,草场对干旱相当敏感,干旱发生的频率和严重程度各不相同。   许多观察表明不同物种的数量对植物群落在连续…

快速开通ChatGPT Plugin

根据上周OpenAI官方给出的消息,本周ChatGPT Plus用户将全量开放Plugin插件权限。 如果你已经可以访问Plugin Store 可以查看这篇文章获取ChatGPT Plugin的使用和功能介绍 AI“应用商店”来了!OpenAI首批70个ChatGPT Plugin最全梳理_evil-tomato的博客-…

Kali-linux免杀Payload生成工具Veil

Veil是一款利用Metasploit框架生成相兼容的Payload工具,并且在大多数网络环境中能绕过常见的杀毒软件。本节将介绍Veil工具的安装及使用。 在Kali Linux中,默认没有安装Veil工具。这里首先安装Veil工具,执行如下所示的命令: roo…

[网络安全]DVWA之XSS(DOM)攻击姿势及解题详析合集

[网络安全]DVWA之XSS(DOM)攻击姿势及解题详析合集 XSS(DOM)-low levelXSS(DOM)-medium level源代码姿势script与option标签 XSS(DOM)-high level源代码姿势 XSS(DOM)-Impossible level页面源代码代码审计 总结 免责声明:本文仅分享XSS攻击相关…

有标签的各种图片大小的宫格拼图

当自己的数据集是从大图中切割下来的小图(根据检测框外括一小部分比例的抠图,后续更新此方法),此时数据集一定是大小不一的图片,若每张都直接输入进行训练那么太小的图片会失真严重,本篇对此提出了解决方法…

阻塞赋值和非阻塞赋值

FPGA这一块和C语言不太一样。 学习FPGA,必须时刻有时钟的概念,而单片机时钟相关性就比较差,FPGA必须把握每一个时钟。 首先介绍一下,非阻塞赋值,这个在时序逻辑里面经常遇见。 reg A; reg B;…