新闻中心
机器学习中对数变换预测结果的反向还原

本文旨在详细阐述在机器学习模型中,如何将经过对数变换(logarithmic transformation)处理后的预测结果准确地还原回原始数值尺度。我们将探讨对数变换的目的、模型训练与预测过程,并重点讲解使用指数函数(`np.exp()`)进行反向变换的方法,同时强调在评估模型性能时,确保预测值和真实值处于相同尺度下的重要性。
1. 对数变换的背景与目的
在机器学习实践中,数据预处理是至关重要的一步。当目标变量(或某些特征)呈现高度偏斜分布(如长尾分布)时,直接用于模型训练可能会导致模型性能下降,例如线性模型可能难以捕捉非线性关系,或违反某些统计假设。对数变换是一种常用的技术,它通过将数据映射到对数空间来:
- 减小数据偏斜: 使数据分布更接近正态分布,有助于满足某些模型的假设。
- 稳定方差: 对于方差随均值增大的数据,对数变换可以使其方差更加稳定。
- 处理异常值: 压缩极端值的影响,使模型对异常值不那么敏感。
- 将乘性关系转化为加性关系: 在某些经济或生物学模型中,这有助于简化模型。
以下代码片段展示了如何对数据集中的特定列进行对数变换,同时处理非正值的情况:
import numpy as np
import pandas as pd
from sklearn.metrics import mean_absolute_error
# 假设 dtk 是原始DataFrame,dtd 是将要进行变换的DataFrame
# 为演示目的,我们创建一个模拟的 dtk 和 dtd
dtk_data = {
'value_eur': [1000, 20000, 500000, 15000, 300000, 0, 500],
'wage_eur': [500, 10000, 250000, 7500, 150000, 0, 250],
'other_feature': [10, 20, 30, 15, 25, 5, 12]
}
dtk = pd.DataFrame(dtk_data)
dtd = dtk.copy() # dtd 将用于存储变换后的数据
# 对 'value_eur' 和 'wage_eur' 进行对数变换
# 注意:np.log() 只能处理正数,因此需要先过滤掉非正值
mask_value = dtd['value_eur'] > 0
dtd.loc[mask_value, 'value_eur'] = np.log(dtk.loc[mask_value, 'value_eur'])
mask_wage = dtd['wage_eur'] > 0
dtd.loc[mask_wage, 'wage_eur'] = np.log(dtk.loc[mask_wage, 'wage_eur'])
print("变换后的数据 (部分):")
print(dtd.head())2. 模型训练与预测
在数据经过对数变换后,我们使用这些变换后的数据来训练机器学习模型。例如,如果 value_eur 是我们的目标变量 y,并且我们对其进行了对数变换,那么模型将学习预测 log(value_eur)。
以下是模型训练和预测的示例流程:
网易人工智能
网易数帆多媒体智能生产力平台
233
查看详情
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor # 假设使用随机森林回归器
from sklearn.model_selection import GridSearchCV
# 准备 X 和 y
X = dtd.drop(['value_eur'], axis=1)
y = dtd['value_eur']
# 过滤掉因为对数变换而可能产生的 NaN/inf 值(如果原始数据包含0或负数)
# 在实际应用中,需要更完善的 NaN 处理策略
valid_indices = y.notna() & X.notna().all(axis=1)
X = X.loc[valid_indices]
y = y.loc[valid_indices]
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 假设 gs.best_estimator_ 已经通过 GridSearchCV 获得
# 这里我们直接实例化一个回归器作为示例
regressor = RandomForestRegressor(random_state=42)
# 训练模型
regressor.fit(X_train, y_train)
# 在测试集上进行预测
regs = regressor.predict(X_test)
# 此时 regs 中的值是 log-transformed 的预测值
print("\nLog-transformed 预测值 (部分):")
print(regs[:5])
print("\nLog-transformed 真实值 (部分):")
print(y_test.head())3. 预测结果的反向变换
模型预测出的 regs 是目标变量的对数变换值。为了获得原始尺度的预测值,我们需要执行反向变换。对数变换的逆运算是指数函数,即 exp(log(x)) = x。在 NumPy 中,这可以通过 np.exp() 函数实现。
重要提示: 当计算评估指标(如 MAE, RMSE)时,如果希望在原始数据尺度上进行评估,则预测值和真实值都必须还原到原始尺度。仅仅还原预测值而真实值仍是对数变换后的,会导致评估结果的偏差和误解。
# 将预测值从对数尺度还原到原始尺度
y_pred_original_scale = np.exp(regs)
# 将测试集真实值从对数尺度还原到原始尺度,以便进行公平的评估和比较
y_test_original_scale = np.exp(y_test)
# 计算在原始尺度上的平均绝对误差 (MAE)
mae_original_scale = mean_absolute_error(y_test_original_scale, y_pred_original_scale)
print(f"\n原始尺度上的平均绝对误差 (MAE): {mae_original_scale:.2f}")
# 结果展示
results_original_scale = pd.DataFrame({
'预测值 (原始尺度)': y_pred_original_scale,
'真实值 (原始尺度)': y_test_original_scale
})
print("\n预测结果与真实值 (原始尺度,部分):")
print(results_original_scale.head())4. 注意事项与总结
- 一致性是关键: 确保在模型训练前对目标变量进行了对数变换,那么在预测后也必须进行指数反向变换。同时,在计算基于原始尺度的评估指标时,真实值也需要进行相应的反向变换。
-
零值和负值的处理: 对数函数只对正数有定义。在进行对数变换前,务必处理好数据中的零值或负值。常见方法包括:
- 加常数: 对所有值加上一个小的正数(如 np.log(x + 1)),尤其适用于数据中包含零的情况。
- 过滤: 如示例所示,只对正值进行变换,并对非正值进行单独处理或排除。
- 分段变换: 对不同范围的值采用不同的变换策略。
- 评估指标的选择: 如果模型在对数尺度上训练,其优化目标也是在对数尺度上的误差。这意味着模型可能在对数尺度上表现良好,但在原始尺度上,尤其是在高值区域,误差可能会被放大。因此,同时观察对数尺度和原始尺度上的评估指标是明智的。例如,MAE在原始尺度上更直观,而RMSE在对数尺度上可能更稳定。
- 解释性: 将预测结果还原到原始尺度,使得模型预测值更具业务可解释性,方便与领域专家沟通和实际应用。
通过上述步骤,我们可以确保在机器学习模型中使用对数变换时,不仅能利用其优点改善模型性能,还能准确地将预测结果还原到原始业务含义的尺度,从而进行正确的解释和评估。
以上就是机器学习中对数变换预测结果的反向还原的详细内容,更多请关注其它相关文章!
# 正态分布
# 什么网站最容易推广赚钱
# 慈东工业区网站优化推广
# 订餐网站建设
# 宜宾网站建设设计
# 公司邮箱网站建设
# 安丘网站建设平台
# 分销推广网站有哪些
# 无锡制作网站建设推广
# seo优化程序排行
# 营销短信推广平台
# ai
# 过滤掉
# 进行了
# 一键
# 如何使用
# 只对
# 在对
# 自动识别
# 指数函数
# 网易
# red
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
CSS Flexbox如何实现多行排列_flex-wrap wrap自动换行显示
如何在Python中使用Optional类型处理可变对象并避免Pylint警告
J*a里如何实现订单支付与库存同步功能_支付库存同步项目开发方法说明
html两个JS只运行一个怎么办_让双JS在html中都运行方法【技巧】
J*aScript异步迭代器_j*ascript异步遍历
J*aScript Promise链中如何正确终止后续.then执行并处理错误
可靠CSGO开箱平台解析 CSGO开箱网合集
构建轻量级网站内部消息系统:Formspree 集成指南
Node.js CSV 数据处理:基于字段空值条件过滤整条记录的策略
Go语言中对Map值调用带指针接收者方法:原理与最佳实践
百度网盘网页版入口 百度网盘网页版官方登录网址
J*aScript 字符串标签转换:使用正则表达式高效替换
Discord Slash 命令响应超时问题的异步解决方案
Golang如何安装Swagger工具_GoSwagger文档生成环境
如何在CSS中使用浮动制作导航栏_float实现水平菜单
Node.js中HTML按钮与J*aScript函数交互的正确姿势
Python实现多节点属性重叠度分析教程
Excel函数批量查找替换超快方法_Excel用REPLACE和FIND函数秒级替换
利用Bokeh CustomJS动态控制DataTable列可见性
sublime怎么设置启动时打开的窗口_sublime会话管理与热退出
uc手机浏览器网页版入口 uc浏览器手机版便捷登录首页
漫蛙2在线漫画入口 漫蛙正版漫画网页版直达
Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践
在J*a中如何使用Exception包装底层异常_异常包装与信息传递方法说明
Python:递归比较文件夹内容并找出特定类型文件的差异
俄罗斯搜索引擎Yandex指南 附2025年免登录官网入口
J*aScript中高效清空DOM列表元素:解决for循环中断与任务管理问题
小红书网页版入口链接分享 小红书官网直接进
中兴BladeV30怎样用测距估书架层高_iPhone中兴BladeV30测距估书架层高【家装参考】
怎么在html里运行vbs脚本_html中运行vbs脚本方法【教程】
AO3最新可访问网址 Archive of Our Own官方在线入口
Mac怎么使用表情符号_Mac Emoji快捷键面板
Linux如何排查内存不足OOME问题_LinuxOOM分析教程
一加手机拍照效果不好怎么办 一加哈苏影像调校与专业模式使用教程【高手篇】
不会效仿卡普空!《铁拳》制作人澄清:不采取赛事付费|直播|
在Qt QML中通过Python字典动态更新TextEdit内容的教程
ArrayList与LinkedList操作复杂度详解:遍历与修改
uc浏览器网页版入口 uc浏览器网页版最新网址
将JSON对象数组转置为键值对列表的实用指南
抓大鹅无需下载版 抓大鹅秒玩版入口
怎么在mac上运行html代码_mac运行html代码方法【指南】
LINUX的perf命令入门_LINUX官方性能分析工具的使用与解读
如何在Promise链中优雅地中断后续then执行
AngularJS $http POST请求数据传递与Go后端接收实践
Web Components中自定义开关组件状态同步的常见陷阱与解决方案
聚水潭ERP登录页面入口 聚水潭ERP官网登录界面
C++如何实现单例模式_C++设计模式之线程安全的单例写法
Safari自带网页翻译功能怎么用 无需插件轻松看懂外文网站【方法】
MAC怎么让Dock栏只显示当前运行的应用_MAC终端命令实现极简Dock栏
优化MinIO list_objects_v2 操作的性能瓶颈与最佳实践


2025-12-01
浏览次数:次
返回列表