如何标准化 Tensorflow.js 中的日期?

How do I normalise dates in Tensorflow.js?

我一直在 Tensorflow.js 中使用各种类型的数据集构建一些简单的线性回归模型。但是,我现在想看看我的数据集中日期和价格之间的关系。

在以前的模型中,我将价格或其他特征归一化,使张量表示为 0 到 1 之间的向量。

如果第一个日期必须是 0 而最后一个日期必须在 1 范围内,那么如何处理这个日期?此外,之后我需要对张量进行非规范化。

我可以使用像 date.fns 这样的库将日期转换为 unix 时间戳...但我想知道是否有更简洁的方法来做到这一点。

我的规范化和反规范化函数:

        function normalise (tensor) {
            const min = tensor.min();
            const max = tensor.max();
            const normalisedTensor = tensor.sub(min).div(max.sub(min))
            return {
                tensor : normalisedTensor,
                min,
                max
            }
        }

        function denormalise(tensor, min, max) {
            const denormalisedTensor = tensor.mul(max.sub(min)).add(min);
            return denormalisedTensor    
        
        }

我通过使用 date.fns 将日期转换为时间戳,然后使用以下函数进行规范化来实现这一点

const getTimestamps = (data) => {

    data.forEach(record => {
        let newDate = record.time
        newDate = new Date(newDate);
        const timestamp = getUnixTime(newDate);
        console.log(newDate, timestamp)
        record.timestamp = timestamp
    }

基本原理是你需要将日期格式(如2021-03-21)转换为数字,然后你可以使用你已有的规范化和反规范化功能。在您的解决方案中,您已经做到了这一点,但是,您可以用更简单的方式编写它。您可以使用 date-fns,但标准 JavaScript Date object 也足够,所以我将使用它。

假设您的输入是日期字符串数组,如 2021-05-01,那么您可以这样做:

const dateStrings = ['2021-05-01', '2021-05-07', '2021-05-31'];
const timestamps = dateStrings.map(dateString => new Date(dateString).valueOf());
const unnormalisedTensor = tf.tensor1d(timestamps);

然后您可以使用您拥有的函数进行规范化(和反规范化)。

您可以像这样从时间戳转换回日期字符串:

const timestamps = await unnormalisedTensor.array();
const dateStrings = timestamps.map(timestamp => new Date(timestamp).toISOString().substring(0,10));