python float和Java float引发的问题

25 篇文章 1 订阅
17 篇文章 0 订阅

问题

离线特征是python加工出来的,在python中默认也是float类型,java中xgboost相关的api也都是float类型,为啥进行特征比对的时候结果就不一致呢?

这就涉及到底层数据结构的实现了,也就是本篇的由来,下面我们一探究竟。

在进行xgboost模型线上特征加工的时候,数据是采用Java float存储,为啥采用float呢?

因为如下的Booster api
​
public float[][] predict(DMatrix data, boolean outputMargin, int treeLimit) throws XGBoostError

​

Java预测时候,入参为DMatrix,数据是用的float类型

​# https://xgboost.readthedocs.io/en/release_1.5.0/jvm/javadocs/index.html
public DMatrix(float[] data,
               int nrow,
               int ncol,
               float missing)
        throws XGBoostError
create DMatrix from dense matrix

Parameters:

data - data values

nrow - number of rows

ncol - number of columns

missing - the specified value to represent the missing value

​

在Java中 float占用4个字节,包括:

  • 1bit(符号位):0表示正数,1表示负数;
  • 8bits(指数位):float的偏移量为2^8 - 1,double的偏移量为2^11 - 1;
  • 23bits(尾数位):实际尾数部分中的小数点后的数值,规约浮点数使用标准的二进制科学计数法表示,其尾数范围在 [1,2),非规约浮点数的尾数部分范围在(0,1)

 

python中float类型是如何实现的?

python中的数值类型

共有三种不同的数值类型:整数浮点数复数。此外,布尔值是整数的一个子类型。

整数具有无限精度。

浮点数通常在 C 中使用double实现;有关运行程序的机器的浮点数精度和内部表示的信息可在sys.float_info. (这个就是Java float和python float数据存在差异的原因)

所以float是8个字节是真正的数字,但是float对象是24字节的。

复数具有实部和虚部,每个都是浮点数。要从复数z中提取这些部分,请使用z.realz.imag。(标准库包括额外的数字类型fractions.Fraction,用于有理数,和decimal.Decimal,用于具有用户可定义精度的浮点数。)

参见:Built-in Types — Python 3.11.0 documentation

案例重现

python具体示例:

>>> float(0.63693581908)

0.63693581908

>>> np.float16(0.63693581908)

0.6367

>>> np.float32(0.63693581908)

0.63693583

>>> np.float64(0.63693581908)

0.63693581908

Java具体示例

double a = -636935.81908;
float b = (float) -636935.81908;
float c = (float) -0.63693581908;
float d = (float) 0.63693581908;

System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);

-636935.81908
-636935.8
-0.63693583
0.63693583

结论:

1、python中的float是和Java中的double是精度一样的

2、numpy中的float32是和Java中的float是等价的

所以在进行特征&模型结果比对的时候,最好按照这种结论中的形式进行数据精度对齐,保持结果一致。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mtj66

看心情

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值