本文旨在详细阐述在机器学习模型中,如何将经过对数变换(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)。
以下是模型训练和预测的示例流程:
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())通过上述步骤,我们可以确保在机器学习模型中使用对数变换时,不仅能利用其优点改善模型性能,还能准确地将预测结果还原到原始业务含义的尺度,从而进行正确的解释和评估。
# ai
# red
# numpy
# 指数函数
# 在对
# 只对
# 进行了
# 过滤掉
# 正态分布
# 原始数据
# 是在
# 是一种
# 还能
相关文章:
武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?
如何高效生成建站之星成品网站源码?
手机网站制作与建设方案,手机网站如何建设?
Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递
宝塔新建站点报错如何解决?
建站org新手必看:2024最新搭建流程与模板选择技巧
英语简历制作免费网站推荐,如何将简历翻译成英文?
外贸公司网站制作,外贸网站建设一般有哪些步骤?
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
创业网站制作流程,创业网站可靠吗?
建站主机核心功能解析:服务器选择与网站搭建流程指南
免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?
北京营销型网站制作公司,可以用python做一个营销推广网站吗?
Swift开发中switch语句值绑定模式
c# await 一个已经完成的Task会发生什么
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
,石家庄四十八中学官网?
建站之星免费版是否永久可用?
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
建站VPS能否同时实现高效与安全翻墙?
广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?
网站企业制作流程,用什么语言做企业网站比较好?
如何在建站之星绑定自定义域名?
如何零成本快速生成个人自助网站?
建站主机系统SEO优化与智能配置核心关键词操作指南
如何通过建站之星自助学习解决操作问题?
如何用搬瓦工VPS快速搭建个人网站?
如何基于云服务器快速搭建个人网站?
香港服务器网站推广:SEO优化与外贸独立站搭建策略
如何自定义建站之星模板颜色并下载新样式?
成都网站制作报价公司,成都工业用气开户费用?
网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?
C#如何使用XPathNavigator高效查询XML
建站主机是否属于云主机类型?
如何在景安服务器上快速搭建个人网站?
利用JavaScript实现拖拽改变元素大小
建站主机与服务器功能差异如何区分?
如何在IIS中新建站点并配置端口与物理路径?
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
红河网站制作公司,红河事业单位身份证如何上传?
网站制作新手教程,新手建设一个网站需要注意些什么?
太平洋网站制作公司,网络用语太平洋是什么意思?
如何选择CMS系统实现快速建站与SEO优化?
如何高效利用200m空间完成建站?
重庆网站制作公司哪家好,重庆中考招生办官方网站?
宝塔面板创建网站无法访问?如何快速排查修复?
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
制作公司内部网站有哪些,内网如何建网站?
制作农业网站的软件,比较好的农业网站推荐一下?
做企业网站制作流程,企业网站制作基本流程有哪些?
*请认真填写需求信息,我们会在24小时内与您取得联系。