Main Content

ブースティング回帰木のアンサンブルを使用した時系列予想の手動での実行

ブースティング回帰木のアンサンブルを使用して、単一ステップと複数ステップの時系列予想を手動で実行します。ホールドアウト、エクスパンディング ウィンドウ、スライディング ウィンドウなどのさまざまな検証方式を使用して、予想モデルの性能を推定します。

時間 "t" で、最新の観測値 (yt,yt-1,...,yt-maxLag) および現在の時間に観測された他の変数 (Xt) を使用して、未来のタイム ステップ t+h (yˆt+h) におけるデータ点の値を予測する直接予想モデル (predMdl) に学習させることができます。つまり、

yˆt+h=predMdl(yt,yt-1,...,yt-maxLag,Xt).

"h" はモデルの学習に使用する先読み範囲、"maxLag" は予想に使用する過去の観測値の数です。時間 t+h+1 におけるデータ点を予想するには、先読み範囲として h+1 を使用する別のモデルに学習させます。

この例では、以下の方法について説明します。

  • 固定数のステップ (24 時間) を範囲として予想する単一のモデルを作成します。ホールドアウト検証とエクスパンディング ウィンドウ交差検証を使用してモデルの性能を評価します。

  • [2] に記載されている異なる先読み範囲 (1 ~ 24 時間) に対応する複数のモデルを作成します。24 個のモデルそれぞれで異なる時間を範囲として予想します。ホールドアウト検証とスライディング ウィンドウ交差検証を使用してモデルの性能を評価します。

  • 複数のモデルを作成して、利用可能なデータを超えた次の 24 時間について予想します。

関数directforecasterを使用した直接予想の実行方法を示す例については、Perform Time Series Direct Forecasting with directforecasterを参照してください。directforecaster を使用する場合、指定された範囲ステップに対するラグ付きの予測子変数や個別の回帰モデルを手動で作成する必要はありません。

データの読み込みと可視化

この例では、電力消費データを使用して予想モデルを作成します。UCI Machine Learning Repository [1] にある ElectricityLoadDiagrams20112014 データ セットのサブセットである electricityclient.mat のデータを読み込みます。元のデータ セットには、[3] で説明されているように、2012 年から 2014 年まで 15 分ごとにログ記録された 321 のクライアントの電力消費 (kWh 単位) が含まれています。小さい usagedata timetable には、6 番目のクライアントのみに関する 1 時間ごとの電力消費が含まれています。

load electricityclient.mat

最初の 200 時間における 6 番目のクライアントの電力消費をプロットします。全体として、このクライアントの電力消費は 24 時間の周期性を示しています。

hrs = 1:200;
plot(usagedata.Time(hrs),usagedata.Electricity(hrs))
xlabel("Time")
ylabel("Electricity Consumption [kWh]")

関数 isregular を使用して、usagedata の値が時間に関して規則的であることを確認します。データの過去の値を特徴量または予測子として使用するには、データが規則的にサンプリングされている必要があります。

isregular(usagedata)
ans = logical
   1

関数 ismissing を使用して、時系列に欠損値がないことを確認します。

sum(ismissing(usagedata))
ans = 0

データが規則的にサンプリングされていない場合、またはデータに欠損値が含まれる場合は、関数 retime を使用するか欠損値を埋めることができます。詳細については、欠損または重複する時間および非等間隔の時間をもつ timetable の整理を参照してください。

予想用データの準備

予想の前に、データを再編成します。具体的には、先読み範囲ごとに個別の時間関連の変数、ラグ特徴量、および応答変数を作成します。

usagedata timetable の日付と時刻の情報を使用して、個別の変数を作成します。具体的には、変数 MonthDayHourWeekDayDayOfYear、および WeekOfYear を作成して usagedata timetable に追加します。numVarusagedata 内の変数の数を示します。

usagedata.Month = month(usagedata.Time);
usagedata.Day = day(usagedata.Time);
usagedata.Hour = hour(usagedata.Time);
usagedata.WeekDay = weekday(usagedata.Time);
usagedata.DayOfYear = day(usagedata.Time,"dayofyear");
usagedata.WeekOfYear = week(usagedata.Time,"weekofyear");
numVar = size(usagedata,2);

30 を超えるカテゴリが含まれている時間変数を正規化して、その値が –0.5 ~ 0.5 の範囲になるようにします。残りの時間変数をカテゴリカル予測子として指定します。

usagedata(:,["Day","DayOfYear","WeekOfYear"]) = normalize( ...
    usagedata(:,["Day","DayOfYear","WeekOfYear"]),range=[-0.5 0.5]);
catPredictors = ["Month","Hour","WeekDay"];

関数lagを使用して、予測子として使用するラグ特徴量を作成します。つまり、23 個の新しい変数 ElectricityLag1ElectricityLag23 を作成します。ここで、ラグ番号は Electricity データを前の時間にシフトするステップ数を示します。関数synchronizeを使用して新しい変数を usagedata timetable に追加し、dataWithLags timetable を作成します。

dataWithLags = usagedata;
maxLag = 23;
for i = 1:maxLag
    negLag = lag(usagedata(:,"Electricity"),i);
    negLag.Properties.VariableNames = negLag.Properties.VariableNames + ...
        "Lag" + i;
    dataWithLags = synchronize(dataWithLags,negLag,"first");
end

dataWithLags に含まれている最初の 3 つのラグ特徴量に関する最初の数行を表示します。参照用に Electricity 列を含めます。

head(dataWithLags(:,["Electricity","ElectricityLag1","ElectricityLag2", ...
    "ElectricityLag3"]))
            Time            Electricity    ElectricityLag1    ElectricityLag2    ElectricityLag3
    ____________________    ___________    _______________    _______________    _______________

    01-Jan-2012 00:00:00       1056              NaN                NaN                NaN      
    01-Jan-2012 01:00:00       1363             1056                NaN                NaN      
    01-Jan-2012 02:00:00       1240             1363               1056                NaN      
    01-Jan-2012 03:00:00        845             1240               1363               1056      
    01-Jan-2012 04:00:00        647              845               1240               1363      
    01-Jan-2012 05:00:00        641              647                845               1240      
    01-Jan-2012 06:00:00        719              641                647                845      
    01-Jan-2012 07:00:00        662              719                641                647      

先読み範囲 1 ~ 24 用に応答変数を準備します。つまり、24 個の新しい変数 HorizonStep1HorizonStep24 を作成します。ここで、範囲ステップ番号は Electricity データを先の時間にシフトするステップ数を示します。新しい変数を dataWithLags timetable に追加し、fullData timetable を作成します。

fullData = dataWithLags;
maxHorizon = 24;
for i = 1:maxHorizon
    posLag = lag(usagedata(:,"Electricity"),-i);
    posLag.Properties.VariableNames = posLag.Properties.VariableNames + ...
        "HorizonStep" + i;
    fullData = synchronize(fullData,posLag,"first");
end

fullData に含まれている最初の 2 つの応答変数に関する最初の数行を表示します。参照用に Electricity 列を含めます。

head(fullData(:,["Electricity","ElectricityHorizonStep1", ...
    "ElectricityHorizonStep2"]))
            Time            Electricity    ElectricityHorizonStep1    ElectricityHorizonStep2
    ____________________    ___________    _______________________    _______________________

    01-Jan-2012 00:00:00       1056                 1363                       1240          
    01-Jan-2012 01:00:00       1363                 1240                        845          
    01-Jan-2012 02:00:00       1240                  845                        647          
    01-Jan-2012 03:00:00        845                  647                        641          
    01-Jan-2012 04:00:00        647                  641                        719          
    01-Jan-2012 05:00:00        641                  719                        662          
    01-Jan-2012 06:00:00        719                  662                        552          
    01-Jan-2012 07:00:00        662                  552                        698          

ラグ特徴量と応答変数の準備後に NaN 値が含まれている観測値を削除します。削除する行数は maxLagmaxHorizon の値によって異なることに注意してください。

startIdx = maxLag + 1;
endIdx = size(fullData,1) - maxHorizon;
fullDataNoNaN = fullData(startIdx:endIdx,:);

このデータでアンサンブル モデルの学習を実行できるようにするには、予測子データを timetable ではなく table に変換します。応答変数は個別の timetable に保持して、Time 情報を観測値ごとに使用できるようにします。

numPredictors = numVar + maxLag
numPredictors = 30
X = timetable2table(fullDataNoNaN(:,1:numPredictors), ...
    ConvertRowTimes=false);
Y = fullDataNoNaN(:,numPredictors+1:end);

単一ステップの予想の実行

ホールドアウト検証とエクスパンディング ウィンドウ交差検証を使用して、固定数のステップを範囲として予想するモデルの性能を評価します。

先読み範囲を 24 時間として指定し、ElectricityHorizonStep24 を応答変数として使用します。

h = 24;
y = Y(:,h);

ホールドアウト検証

関数tspartitionを使用して時系列分割オブジェクトを作成します。観測値の 20% をテスト用に予約し、残りの観測値を学習に使用します。時系列データにホールドアウト検証を使用する場合、最新の観測値はテスト セット内にあり、最も古い観測値は学習セット内にあります。

holdoutPartition = tspartition(size(y,1),"Holdout",0.2)
holdoutPartition = 
  tspartition

               Type: 'holdout'
    NumObservations: 26257
        NumTestSets: 1
          TrainSize: 21006
           TestSize: 5251


  Properties, Methods

trainIdx = holdoutPartition.training;
testIdx = holdoutPartition.test;

trainIdxtestIdx には、それぞれ学習セットとテスト セット内の観測値のインデックスが含まれます。

関数fitrensembleを使用して、回帰木のブースティング アンサンブルを作成します。最小二乗ブースティングを使用して縮小学習率 0.2 でアンサンブルに学習させ、アンサンブル内の 150 本の木を使用します。関数templateTreeを使用して、木ごとの決定分岐 (枝ノード) の最大数と、葉ごとの最小観測値数を指定します。前に特定したカテゴリカル予測子を指定します。

rng("default") % For reproducibility
tree = templateTree(MaxNumSplits=255,MinLeafSize=1);
singleHoldoutModel = fitrensemble(X(trainIdx,:),y{trainIdx,:}, ...
    Method="LSBoost",LearnRate=0.2,NumLearningCycles=150, ...
    Learners=tree,CategoricalPredictors=catPredictors);

学習済みのモデル singleHoldoutModel を使用して、テスト データ セット内の観測値の応答値を予測します。

predHoldoutTest = predict(singleHoldoutModel,X(testIdx,:));
trueHoldoutTest = y(testIdx,:);

テスト セットに含まれている最初の 200 個の観測値について、実際の電力消費と予測電力消費を比較します。変数 trueHoldoutTest の時間情報を使用して、24 時間先にシフトして値をプロットします。

hrs = 1:200;
plot(trueHoldoutTest.Time(hrs) + hours(24), ...
    trueHoldoutTest.ElectricityHorizonStep24(hrs))
hold on
plot(trueHoldoutTest.Time(hrs) + hours(24), ...
    predHoldoutTest(hrs),"--")
hold off
legend("True","Predicted")
xlabel("Time")
ylabel("Electricity Consumption [kWh]")

補助関数 computeRRSE (この例の終わりに掲載) を使用して、テスト データのルート相対二乗誤差 (RRSE) を計算します。RRSE は、常に実際の値の平均を予測する単純モデルに対する、モデルの相対的な性能を示します。具体的には、RRSE が 1 未満の場合、モデルの性能は単純モデルよりも優れています。詳細については、ルート相対二乗誤差 (RRSE) の計算を参照してください。

singleHoldoutRRSE = computeRRSE(trueHoldoutTest{:,:},predHoldoutTest)
singleHoldoutRRSE = 0.3243

singleHoldoutRRSE の値は、テスト データにおける singleHoldoutModel の性能が良好であることを示しています。

エクスパンディング ウィンドウ交差検証

エクスパンディング ウィンドウを使用して、時系列の観測値を分割するオブジェクトを作成します。tspartition を使用して、データ セットを拡張学習セットと固定サイズのテスト セットをもつ 5 つのウィンドウに分割します。ウィンドウごとに、少なくとも 1 年分の観測値を学習用に使用します。既定で、tspartition では必ず、最新の観測値が最後 (5 番目) のウィンドウに含まれます。

expandingWindowCV = tspartition(size(y,1),"ExpandingWindow",5, ...
    MinTrainSize=366*24)
expandingWindowCV = 
  tspartition

               Type: 'expanding-window'
    NumObservations: 26257
        NumTestSets: 5
          TrainSize: [8787 12281 15775 19269 22763]
           TestSize: [3494 3494 3494 3494 3494]
           StepSize: 3494


  Properties, Methods

最初のウィンドウの学習観測値は 2 番目のウィンドウに含まれ、2 番目のウィンドウの学習観測値は 3 番目のウィンドウに含まれます。以後についても同様です。各ウィンドウについて、テスト観測値は時系列で学習観測値の後に続きます。

ウィンドウごとに、学習観測値を使用して回帰木のブースティング アンサンブルを当てはめます。モデル singleHoldoutModel の作成に使用したものと同じモデル パラメーターを指定します。アンサンブルの学習後に、テスト観測値について応答値を予測し、テスト データの RRSE 値を計算します。

singleCVModels = cell(expandingWindowCV.NumTestSets,1);
expandingWindowRRSE = NaN(expandingWindowCV.NumTestSets,1);

rng("default") % For reproducibility
for i = 1:expandingWindowCV.NumTestSets
    % Get indices
    trainIdx = expandingWindowCV.training(i);
    testIdx = expandingWindowCV.test(i);
    % Train
    singleCVModels{i} = fitrensemble(X(trainIdx,:),y{trainIdx,:}, ...
        Method="LSBoost",LearnRate=0.2,NumLearningCycles=150, ...
        Learners=tree,CategoricalPredictors=catPredictors);
    % Predict
    predTest = predict(singleCVModels{i},X(testIdx,:));
    trueTest = y{testIdx,:};
    expandingWindowRRSE(i) = computeRRSE(trueTest,predTest);
end

各ウィンドウのテスト RRSE 値を表示します。すべてのウィンドウにおける RRSE 値の平均を計算します。

expandingWindowRRSE
expandingWindowRRSE = 5×1

    0.3407
    0.3733
    0.3518
    0.3814
    0.3069

singleCVRRSE = mean(expandingWindowRRSE)
singleCVRRSE = 0.3508

エクスパンディング ウィンドウ交差検証によって返された平均 RRSE 値 (singleCVRRSE) は比較的小さく、ホールドアウト検証によって返された RRSE 値 (singleHoldoutRRSE) と同様です。これらの結果から、アンサンブル モデルの性能が全般的に良好であることがわかります。

複数ステップの予想の実行

ホールドアウト検証とスライディング ウィンドウ交差検証を使用して、異なる時間を範囲として予想する複数のモデルの性能を評価します。

最大範囲は 24 時間であることを思い出してください。検証方式ごとに、1 ~ 24 時間先を予想するモデルを作成します。

maxHorizon
maxHorizon = 24

ホールドアウト検証

ホールドアウト検証には時系列分割オブジェクト holdoutPartition を再利用します。このオブジェクトは観測値の 20% をテスト用に予約し、残りの観測値を学習に使用することを思い出してください。

holdoutPartition
holdoutPartition = 
  tspartition

               Type: 'holdout'
    NumObservations: 26257
        NumTestSets: 1
          TrainSize: 21006
           TestSize: 5251


  Properties, Methods

trainIdx = holdoutPartition.training;
testIdx = holdoutPartition.test;

先読み範囲ごとに、学習観測値を使用して回帰木のブースティング アンサンブルを当てはめます。モデル singleHoldoutModel の作成に使用したものと同じモデル パラメーターを指定します。ただし、学習を高速化するために、使用するアンサンブル内の木を減らして (50 本)、最大 256 個の同確率のビンに数値予測子をビン化します。アンサンブルの学習後に、テスト観測値について応答値を予測し、テスト データの RRSE 値を計算します。

予測子データがすべてのモデルで同じであることに注意してください。ただし、各モデルでは指定された範囲に対応する異なる応答変数が使用されます。

multiHoldoutRRSE = NaN(1,maxHorizon);

rng("default") % For reproducibility
for h = 1:maxHorizon
    % Train
    multiHoldoutModel = fitrensemble(X(trainIdx,:),Y{trainIdx,h}, ...
        Method="LSBoost",LearnRate=0.2,NumLearningCycles=50, ...
        Learners=tree,NumBins=256,CategoricalPredictors=catPredictors); 
    % Predict
    predTest = predict(multiHoldoutModel,X(testIdx,:));
    trueTest = Y{testIdx,h};
    multiHoldoutRRSE(h) = computeRRSE(trueTest,predTest);
end

範囲に対するテスト RRSE 値をプロットします。

plot(1:maxHorizon,multiHoldoutRRSE,"o-")
xlabel("Horizon [hr]")
ylabel("RRSE")
title("RRSE Using Holdout Validation")

範囲が増加しても、RRSE 値は比較的小さい値で安定しています。この結果から、アンサンブル モデルの予測精度は 1 ~ 24 時間のどの時間範囲でも十分であることがわかります。

スライディング ウィンドウ交差検証

スライディング ウィンドウを使用して、時系列の観測値を分割するオブジェクトを作成します。tspartition を使用して、データ セットを固定サイズの学習セットとテスト セットをもつ 5 つのウィンドウに分割します。ウィンドウごとに、少なくとも 1 年分の観測値を学習用に使用します。既定で、tspartition では必ず、最新の観測値が最後 (5 番目) のウィンドウに含まれます。そのため、一部の古い観測値が交差検証から省略される可能性があります。

slidingWindowCV = tspartition(size(Y,1),"SlidingWindow",5, ...
    TrainSize=366*24)
slidingWindowCV = 
  tspartition

               Type: 'sliding-window'
    NumObservations: 26257
        NumTestSets: 5
          TrainSize: [8784 8784 8784 8784 8784]
           TestSize: [3494 3494 3494 3494 3494]
           StepSize: 3494


  Properties, Methods

各ウィンドウについて、テスト観測値は時系列で学習観測値の後に続きます。

ウィンドウおよび先読み範囲ごとに、学習観測値を使用して回帰木のブースティング アンサンブルを当てはめます。モデル singleHoldoutModel の作成に使用したものと同じモデル パラメーターを指定します。ただし、学習を高速化するために、使用するアンサンブル内の木を減らして (50 本)、数値予測子をビン化します。アンサンブルの学習後に、テスト観測値について値を予測し、テスト データの RRSE 値を計算します。

学習と予測のプロセスをさらに高速化するには、parfor (Parallel Computing Toolbox)を使用して並列計算を行います。並列計算には Parallel Computing Toolbox™ が必要です。Parallel Computing Toolbox がない場合、parfor ループは並列実行されません。

slidingWindowRRSE = NaN(slidingWindowCV.NumTestSets, ...
    maxHorizon);

rng("default") % For reproducibility
for i = 1:slidingWindowCV.NumTestSets
    % Split the data
    trainIdx = training(slidingWindowCV,i);
    testIdx = test(slidingWindowCV,i);
    Xtrain = X(trainIdx,:);
    Xtest = X(testIdx,:);
    Ytest = Y{testIdx,:};
    Ytrain = Y{trainIdx,:};
    parfor h = 1:maxHorizon
        % Train
        multiCVModel = fitrensemble(Xtrain,Ytrain(:,h), ...
            Method="LSBoost",LearnRate=0.2,NumLearningCycles=50, ...
            Learners=tree,NumBins=256,CategoricalPredictors=catPredictors); 
        % Predict
        predTest = predict(multiCVModel,Xtest);
        trueTest = Ytest(:,h);
        slidingWindowRRSE(i,h) = computeRRSE(trueTest,predTest);
    end
end
Starting parallel pool (parpool) using the 'Processes' profile ...
Connected to the parallel pool (number of workers: 6).

範囲に対する平均テスト RRSE 値をプロットします。

multiCVRRSE = mean(slidingWindowRRSE);

plot(1:maxHorizon,multiCVRRSE,"o-")
xlabel("Horizon [hr]")
ylabel("RRSE")
title("Average RRSE Using Sliding Window Partition")

範囲が増加しても、RRSE 値は比較的小さい値で安定しています。multiCVRRSE 値は multiHoldoutRRSE 値よりもわずかに大きくなっています。この差異の原因としては、スライディング ウィンドウ検証方式とホールドアウト検証方式で使用した学習観測値の数の差異が考えられます。

slidingWindowCV.TrainSize
ans = 1×5

        8784        8784        8784        8784        8784

holdoutPartition.TrainSize
ans = 21006

各範囲について、スライディング ウィンドウ交差検証方式のモデルで使用されている学習観測値の数は、ホールドアウト検証方式の対応するモデルよりも大幅に少なくなっています。

利用可能なデータを超えた予想

複数のモデルを作成して、利用可能なデータを超えた次の 24 時間の電力消費を予測します。

各モデルについて、fullData に含まれている最新の観測値の予測子データを使用して予想します。fullData には、X に含まれていないその後の観測値がいくつか含まれていることを思い出してください。

forecastX = timetable2table(fullData(end,1:numPredictors), ...
    "ConvertRowTimes",false)
forecastX=1×30 table
    Electricity    Month    Day    Hour    WeekDay    DayOfYear    WeekOfYear    ElectricityLag1    ElectricityLag2    ElectricityLag3    ElectricityLag4    ElectricityLag5    ElectricityLag6    ElectricityLag7    ElectricityLag8    ElectricityLag9    ElectricityLag10    ElectricityLag11    ElectricityLag12    ElectricityLag13    ElectricityLag14    ElectricityLag15    ElectricityLag16    ElectricityLag17    ElectricityLag18    ElectricityLag19    ElectricityLag20    ElectricityLag21    ElectricityLag22    ElectricityLag23
    ___________    _____    ___    ____    _______    _________    __________    _______________    _______________    _______________    _______________    _______________    _______________    _______________    _______________    _______________    ________________    ________________    ________________    ________________    ________________    ________________    ________________    ________________    ________________    ________________    ________________    ________________    ________________    ________________

       1234         12      0.5     23        4        0.49726        0.5             1261               1282               1366               1590               1499               1085               1001               1058               1183                967                 1060                893                 812                 800                 662                 656                 638                 560                 626                 677                 788                 863                 993       

最新の観測値 forecastX の観測後 24 時間の datetime 配列を作成します。

lastT = fullData.Time(end);
maxHorizon
maxHorizon = 24
forecastT = lastT + hours(1):hours(1):lastT + hours(maxHorizon);

先読み範囲ごとに、X の観測値を使用して回帰木のブースティング アンサンブルに学習させます。モデル singleHoldoutModel の作成に使用したものと同じモデル パラメーターを指定します。ただし、学習を高速化するために、使用するアンサンブル内の木を減らして (50 本)、数値予測子をビン化します。アンサンブルの学習後に、最新の観測値 forecastX を使用して電力消費を予測します。

学習と予測のプロセスをさらに高速化するには、parfor を使用して並列計算を行います。

multiModels = cell(1,maxHorizon);
forecastY = NaN(1,maxHorizon);

rng("default") % For reproducibility
parfor h = 1:maxHorizon
    % Train
    multiModels{h} = fitrensemble(X,Y{:,h},Method="LSBoost", ...
        LearnRate=0.2,NumLearningCycles=50,Learners=tree, ...
        NumBins=256,CategoricalPredictors=catPredictors); 
    % Predict
    forecastY(h) = predict(multiModels{h},forecastX);
end

lastT より前の最後の 4 日間に観測された電力消費と、lastT より後の 1 日の予測電力消費をプロットします。

numPastDays = 4;
plot(usagedata.Time(end-(numPastDays*24):end), ...
    usagedata.Electricity(end-(numPastDays*24):end));
hold on
plot([usagedata.Time(end),forecastT], ...
    [usagedata.Electricity(end),forecastY],"--")
hold off
legend("Historical Data","Forecasted Data")
xlabel("Time")
ylabel("Electricity Consumption [kWh]")

ルート相対二乗誤差 (RRSE) の計算

ルート相対二乗誤差 (RRSE) は次の比率として定義されます。

RRSE=i=1m(yi-yiˆ)2i=1m(yi-y)2,

ここで、yi は観測値 "i" の実際の応答、yiˆ は観測値 "i" の予測値、y は実際の応答の平均、"m" は観測値の数です。

補助関数

補助関数 computeRRSE は、与えられた実際の応答変数 trueY と予測値 predY を使用して、RRSE を計算します。次のコードは、補助関数 computeRRSE を作成します。

function rrse = computeRRSE(trueY,predY)
    error = trueY(:) - predY(:);
    meanY = mean(trueY(:),"omitnan");
    rrse = sqrt(sum(error.^2,"omitnan")/sum((trueY(:) - meanY).^2,"omitnan"));
end

参考文献

[1] Dua, D. and Graff, C. (2019). UCI Machine Learning Repository [http://archive.ics.uci.edu/ml]. Irvine, CA: University of California, School of Information and Computer Science.

[2] Elsayed, S., D. Thyssens, A. Rashed, H. S. Jomaa, and L. Schmidt-Thieme. "Do We Really Need Deep Learning Models for Time Series Forecasting?" https://www.arxiv-vanity.com/papers/2101.02118/

[3] Lai, G., W. C. Chang, Y. Yang, and H. Liu. "Modeling long- and short-term temporal patterns with deep neural networks." In 41st International ACM SIGIR Conference on Research & Development in Information Retrieval, 2018, pp. 95-104.

参考

| | | | | | (Parallel Computing Toolbox)

関連するトピック