前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >时间序列预测-女性出生数量预测

时间序列预测-女性出生数量预测

作者头像
致Great
发布2023-08-25 13:08:40
1870
发布2023-08-25 13:08:40
举报
文章被收录于专栏:程序生活程序生活

1 数据集构建

原始数据为:

然后通过滑窗来构造多个X,如下图所示,第一列为是将原始值往后移6个时间步,其他列依次类推。

在这里插入图片描述
在这里插入图片描述

我们去除空值之后,最后数据集为:

在这里插入图片描述
在这里插入图片描述

这里的X就是前六列特征,最后一列为y是预测值

预测女性未来出生数量 每日女性出生数据集,即三年内的每月出生数。

下载链接:https://raw.githubusercontent.com/jbrownlee/Datasets/master/daily-total-female-births.csv

完整代码

代码语言:javascript
复制
from numpy import asarray
from pandas import DataFrame
from pandas import concat
from pandas import read_csv
from sklearn.metrics import mean_absolute_error
from xgboost import XGBRegressor


# transform a time series dataset into a supervised learning dataset
def series_to_supervised(data, n_in=1, n_out=1, dropnan=True):
    n_vars = 1 if type(data) is list else data.shape[1]
    df = DataFrame(data)
    cols = list()
    # input sequence (t-n, ... t-1)
    for i in range(n_in, 0, -1):
        cols.append(df.shift(i))
    # forecast sequence (t, t+1, ... t+n)
    for i in range(0, n_out):
        cols.append(df.shift(-i))
    # put it all together
    agg = concat(cols, axis=1)
    # drop rows with NaN values

    if dropnan:
        agg.dropna(inplace=True)
        return agg.values


series = read_csv('data/daily-total-female-births.csv', header=0, index_col=0)
values = series.values
data = series_to_supervised(values, n_in=6)


def train_test_split(data, n_test):
    return data[:-n_test, :], data[-n_test:, :]


def xgboost_forecast(train, testX):
    # transform list into array
    train = asarray(train)
    # split into input and output columns
    trainX, trainy = train[:, :-1], train[:, -1]
    # fit model
    model = XGBRegressor(objective='reg:squarederror', n_estimators=1000)
    model.fit(trainX, trainy)
    # make a one-step prediction
    yhat = model.predict(asarray([testX]))
    return yhat[0]


# walk-forward validation for univariate data
def walk_forward_validation(data, n_test):
    predictions = list()
    # split dataset
    train, test = train_test_split(data, n_test)
    # seed history with training dataset
    history = [x for x in train]
    # step over each time-step in the test set
    for i in range(len(test)):
        # split test row into input and output columns
        testX, testy = test[i, :-1], test[i, -1]
        # fit model on history and make a prediction
        yhat = xgboost_forecast(history, testX)
        # store forecast in list of predictions
        predictions.append(yhat)
        # add actual observation to history for the next loop
        history.append(test[i])
        # summarize progress
        print('>expected=%.1f, predicted=%.1f' % (testy, yhat))
    # estimate prediction error
    error = mean_absolute_error(test[:, -1], predictions)
    return error, test[:, -1], predictions


# %%

# transform the time series data into supervised learning
data = series_to_supervised(values, n_in=6)
# evaluate
mae, y, yhat = walk_forward_validation(data, 12)
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-08-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 数据集构建
    • 完整代码
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档