
本文旨在详细阐述在机器学习模型中,如何将经过对数变换(logarithmic transformation)处理后的预测结果准确地还原回原始数值尺度。我们将探讨对数变换的目的、模型训练与预测过程,并重点讲解使用指数函数(`np.exp()`)进行反向变换的方法,同时强调在评估模型性能时,确保预测值和真实值处于相同尺度下的重要性。
在机器学习实践中,数据预处理是至关重要的一步。当目标变量(或某些特征)呈现高度偏斜分布(如长尾分布)时,直接用于模型训练可能会导致模型性能下降,例如线性模型可能难以捕捉非线性关系,或违反某些统计假设。对数变换是一种常用的技术,它通过将数据映射到对数空间来:
以下代码片段展示了如何对数据集中的特定列进行对数变换,同时处理非正值的情况:
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())在数据经过对数变换后,我们使用这些变换后的数据来训练机器学习模型。例如,如果 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())模型预测出的 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())通过上述步骤,我们可以确保在机器学习模型中使用对数变换时,不仅能利用其优点改善模型性能,还能准确地将预测结果还原到原始业务含义的尺度,从而进行正确的解释和评估。
以上就是机器学习中对数变换预测结果的反向还原的详细内容,更多请关注其它相关文章!
相关文章:
蓝湖怎样用切图标注提对接效率_蓝湖用切图标注提对接效率【设计对接】
TikTok网页版直接登录 TikTok网页端官方平台入口
Python Socket多播通信中指定源IP地址的实践指南
如何有效阻止外部脚本意外修改内联样式的高度属性
Django AJAX 文件上传教程:解决图片无法保存到模型的常见问题
Discord Slash 命令响应超时问题的异步解决方案
在J*a中如何开发简易博客标签推荐系统_博客标签推荐项目实战解析
整合Supabase认证与Django模型:跨模式迁移的解决方案
poki网页游戏推荐_poki免费游戏平台入口
Golang如何安装Swagger工具_GoSwagger文档生成环境
c++ 命名空间怎么用 c++ namespace使用指南
React Hooks最佳实践:动态组件状态管理的组件化方案
Go调试环境为何无法启动_Go调试器启动失败原因与解决策略
利用Bokeh CustomJS动态控制DataTable列可见性
Win10怎么设置静态IP地址 Win10手动配置IP地址步骤【指南】
QQ邮箱官方邮箱登录入口 QQ邮箱网页版快速访问
Django表单提交验证失败后保持字段值不刷新
在J*a里如何理解依赖关系的方向_依赖方向在模块结构中的作用
mysql如何设置表访问权限_mysql表访问权限配置
J*a 递归快速排序中静态变量的状态管理与陷阱
mcjs网页版在线存档 mcjs云存档登录入口
漫蛙2在线漫画入口 漫蛙正版漫画网页版直达
Go语言中Map值调用指针接收器方法的限制与应对
Golang如何处理RPC请求负载均衡_Golang RPC请求负载均衡策略与实践
微信网页版官方快速登录入口 微信网页版网页版账号直达
实现分段式页面滚动导航:CSS与J*aScript教程
Centos/Linux 系统下安装 composer 的完整步骤
中兴BladeV30怎样用测距估书架层高_iPhone中兴BladeV30测距估书架层高【家装参考】
excel怎么提取文本中数字 excel函数提取技巧
4399免费游戏网址入口 4399小游戏免费入口点开即玩
Yandex官网搜索引擎免登录_俄罗斯Yandex一键直达入口
漫蛙漫画官方首页 漫蛙2漫画在线阅读入口
微信网页版登录教程_微信网页版登录入口在哪
“音游” × “怪文书” 题材的节奏冒险游戏 《晕晕电波症候群》确定于2026年4月发售!
自定义Bag-of-Words实现:处理带负号的词汇权重
邮编格式怎么匹配地址_根据邮编格式快速匹配详细地址的技巧
ArrayList与LinkedList核心操作的Big-O复杂度分析
聚水潭ERP登录页面入口 聚水潭ERP官网登录界面
Excel Power Pivot如何处理XML数据源 构建高级数据模型
MongoDB聚合管道:正确匹配对象数组中_id的方法
Go语言实现持久化与原子性文件存储的教程
小红书网页版入口链接分享 小红书官网直接进
将JSON对象数组转置为键值对列表的实用指南
探索高级语言到C/C++的转译路径:以Go为例及内存管理策略
顺丰国际快递查询 国际件官方查询入口
LINUX怎么设置定时任务_LINUX crontab配置教程
MAC如何将整个网页截长图_MAC使用Safari的导出为PDF或第三方工具
葱吃多了会怎样 葱吃多了会伤胃吗
html网页设计源代码怎么运行_运行html网页设计源代码步骤【指南】
Composer如何处理Git子模块(submodule)依赖_Composer与Git Submodule的对比与选择