【RF時(shí)序預(yù)測(cè)】基于隨機(jī)森林算法的時(shí)間序列預(yù)測(cè)附matlab代碼
?作者簡(jiǎn)介:熱愛(ài)科研的Matlab仿真開(kāi)發(fā)者,修心和技術(shù)同步精進(jìn),matlab項(xiàng)目合作可私信。
??個(gè)人主頁(yè):Matlab科研工作室
??個(gè)人信條:格物致知。
更多Matlab仿真內(nèi)容點(diǎn)擊??
智能優(yōu)化算法 ? ? ? 神經(jīng)網(wǎng)絡(luò)預(yù)測(cè) ? ? ? 雷達(dá)通信 ? ? ?無(wú)線傳感器 ? ? ? ?電力系統(tǒng)
信號(hào)處理 ? ? ? ? ? ? ?圖像處理 ? ? ? ? ? ? ? 路徑規(guī)劃 ? ? ? 元胞自動(dòng)機(jī) ? ? ? ?無(wú)人機(jī)
? 內(nèi)容介紹
隨機(jī)森林算法是一種集成學(xué)習(xí)方法,通過(guò)組合多個(gè)決策樹(shù)來(lái)進(jìn)行分類和回歸。
算法的原理如下:
建立多個(gè)決策樹(shù):隨機(jī)森林由多個(gè)決策樹(shù)組成,每個(gè)決策樹(shù)都是獨(dú)立地從訓(xùn)練數(shù)據(jù)中隨機(jī)采樣得到的。這種隨機(jī)采樣可以通過(guò)自助法(bootstrap)或者隨機(jī)子集法(random subspace)進(jìn)行。
隨機(jī)特征選擇:在每個(gè)決策樹(shù)的節(jié)點(diǎn)上,只考慮部分特征進(jìn)行分裂。這樣可以增加決策樹(shù)之間的差異性,提高整體模型的準(zhǔn)確性。常用的特征選擇方法有全特征選擇和隨機(jī)特征選擇。
決策樹(shù)的構(gòu)建:根據(jù)選定的特征進(jìn)行劃分,使得每個(gè)子節(jié)點(diǎn)上的樣本盡量屬于同一類別或具有相似的回歸值。通常使用信息熵、基尼系數(shù)等指標(biāo)來(lái)評(píng)估劃分質(zhì)量。重復(fù)這個(gè)過(guò)程直到達(dá)到預(yù)定的停止條件。
集成投票/平均:對(duì)于分類問(wèn)題,隨機(jī)森林通過(guò)投票機(jī)制來(lái)確定最終的預(yù)測(cè)結(jié)果。每個(gè)決策樹(shù)對(duì)樣本進(jìn)行分類,最后選擇得票最多的類別作為整個(gè)隨機(jī)森林的預(yù)測(cè)結(jié)果。對(duì)于回歸問(wèn)題,隨機(jī)森林通過(guò)平均每個(gè)決策樹(shù)的預(yù)測(cè)值來(lái)得到最終的預(yù)測(cè)結(jié)果。
隨機(jī)森林算法具有很好的魯棒性和泛化能力,能夠有效地處理高維數(shù)據(jù)和大規(guī)模數(shù)據(jù)集,并且對(duì)于特征的缺失和噪聲有較好的容錯(cuò)性。
對(duì)于基于隨機(jī)森林算法的時(shí)間序列預(yù)測(cè),你可以按照以下步驟進(jìn)行:
數(shù)據(jù)準(zhǔn)備:收集并整理時(shí)間序列數(shù)據(jù),確保數(shù)據(jù)包含時(shí)間戳和要預(yù)測(cè)的目標(biāo)變量。將數(shù)據(jù)分為訓(xùn)練集和測(cè)試集。
特征工程:針對(duì)時(shí)間序列數(shù)據(jù),可以提取一些常見(jiàn)的特征,如滯后特征(lag features)、移動(dòng)平均值等。這些特征可以幫助模型捕捉時(shí)間序列的趨勢(shì)和周期性。
隨機(jī)森林模型訓(xùn)練:使用訓(xùn)練集數(shù)據(jù),構(gòu)建隨機(jī)森林模型。隨機(jī)森林是一種集成學(xué)習(xí)方法,由多個(gè)決策樹(shù)組成。每個(gè)決策樹(shù)都基于不同的數(shù)據(jù)子集進(jìn)行訓(xùn)練,最后通過(guò)投票或平均預(yù)測(cè)結(jié)果來(lái)得出最終的預(yù)測(cè)結(jié)果。
模型評(píng)估:使用測(cè)試集數(shù)據(jù),評(píng)估模型的預(yù)測(cè)性能。可以使用一些指標(biāo)如均方根誤差(RMSE)、平均絕對(duì)百分比誤差(MAPE)等來(lái)評(píng)估預(yù)測(cè)結(jié)果與實(shí)際值之間的差異。
模型優(yōu)化:根據(jù)評(píng)估結(jié)果,可以嘗試調(diào)整模型參數(shù)、增加更多特征或者嘗試其他算法來(lái)優(yōu)化模型的性能。
需要注意的是,隨機(jī)森林算法在處理時(shí)間序列數(shù)據(jù)時(shí)可能存在一些限制,如無(wú)法捕捉長(zhǎng)期依賴關(guān)系和忽略時(shí)間序列中的自相關(guān)性。因此,在實(shí)際應(yīng)用中,可能需要考慮其他更適合時(shí)間序列預(yù)測(cè)的算法,如ARIMA、LSTM等。
? 代碼
%% ?清空環(huán)境變量
warning off ? ? ? ? ? ? % 關(guān)閉報(bào)警信息
close all ? ? ? ? ? ? ? % 關(guān)閉開(kāi)啟的圖窗
clear ? ? ? ? ? ? ? ? ? % 清空變量
clc ? ? ? ? ? ? ? ? ? ? % 清空命令行
%% ?導(dǎo)入數(shù)據(jù)(時(shí)間序列的單列數(shù)據(jù))
result = xlsread('數(shù)據(jù)集.xlsx');
%% ?數(shù)據(jù)分析
num_samples = length(result); ?% 樣本個(gè)數(shù)
kim = 15; ? ? ? ? ? ? ? ? ? ? ?% 延時(shí)步長(zhǎng)(kim個(gè)歷史數(shù)據(jù)作為自變量)
zim = ?1; ? ? ? ? ? ? ? ? ? ? ?% 跨zim個(gè)時(shí)間點(diǎn)進(jìn)行預(yù)測(cè)
%% ?構(gòu)造數(shù)據(jù)集
for i = 1: num_samples - kim - zim + 1
? ?res(i, :) = [reshape(result(i: i + kim - 1), 1, kim), result(i + kim + zim - 1)];
end
%% ?劃分訓(xùn)練集和測(cè)試集
temp = 1: 1: 922;
P_train = res(temp(1: 700), 1: 15)';
T_train = res(temp(1: 700), 16)';
M = size(P_train, 2);
P_test = res(temp(701: end), 1: 15)';
T_test = res(temp(701: end), 16)';
N = size(P_test, 2);
%% ?數(shù)據(jù)歸一化
[p_train, ps_input] = mapminmax(P_train, 0, 1);
p_test = mapminmax('apply', P_test, ps_input);
[t_train, ps_output] = mapminmax(T_train, 0, 1);
t_test = mapminmax('apply', T_test, ps_output);
%% ?轉(zhuǎn)置以適應(yīng)模型
p_train = p_train'; p_test = p_test';
t_train = t_train'; t_test = t_test';
%% ?訓(xùn)練模型
trees = 100; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?% 決策樹(shù)數(shù)目
leaf ?= 5; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?% 最小葉子數(shù)
OOBPrediction = 'on'; ? ? ? ? ? ? ? ? ? ? ? ? ? ? % 打開(kāi)誤差圖
OOBPredictorImportance = 'on'; ? ? ? ? ? ? ? ? ? ?% 計(jì)算特征重要性
Method = 'regression'; ? ? ? ? ? ? ? ? ? ? ? ? ? ?% 分類還是回歸
net = TreeBagger(trees, p_train, t_train, 'OOBPredictorImportance', OOBPredictorImportance,...
? ? ?'Method', Method, 'OOBPrediction', OOBPrediction, 'minleaf', leaf);
importance = net.OOBPermutedPredictorDeltaError; ?% 重要性
%% ?仿真測(cè)試
t_sim1 = predict(net, p_train);
t_sim2 = predict(net, p_test );
%% ?數(shù)據(jù)反歸一化
T_sim1 = mapminmax('reverse', t_sim1, ps_output);
T_sim2 = mapminmax('reverse', t_sim2, ps_output);
%% ?均方根誤差
error1 = sqrt(sum((T_sim1' - T_train).^2) ./ M);
error2 = sqrt(sum((T_sim2' - T_test ).^2) ./ N);
%% ?繪圖
figure
plot(1: M, T_train, 'r-', 1: M, T_sim1, 'b-', 'LineWidth', 1)
legend('真實(shí)值', '預(yù)測(cè)值')
xlabel('預(yù)測(cè)樣本')
ylabel('預(yù)測(cè)結(jié)果')
string = {'訓(xùn)練集預(yù)測(cè)結(jié)果對(duì)比'; ['RMSE=' num2str(error1)]};
title(string)
xlim([1, M])
grid
figure
plot(1: N, T_test, 'r-', 1: N, T_sim2, 'b-', 'LineWidth', 1)
legend('真實(shí)值', '預(yù)測(cè)值')
xlabel('預(yù)測(cè)樣本')
ylabel('預(yù)測(cè)結(jié)果')
string = {'測(cè)試集預(yù)測(cè)結(jié)果對(duì)比'; ['RMSE=' num2str(error2)]};
title(string)
xlim([1, N])
grid
%% ?繪制誤差曲線
figure
plot(1: trees, oobError(net), 'b-', 'LineWidth', 1)
legend('誤差曲線')
xlabel('決策樹(shù)數(shù)目')
ylabel('誤差')
xlim([1, trees])
grid
%% ?繪制特征重要性
figure
bar(importance)
legend('重要性')
xlabel('特征')
ylabel('重要性')
%% ?相關(guān)指標(biāo)計(jì)算
% R2
R1 = 1 - norm(T_train - T_sim1')^2 / norm(T_train - mean(T_train))^2;
R2 = 1 - norm(T_test ?- T_sim2')^2 / norm(T_test ?- mean(T_test ))^2;
disp(['訓(xùn)練集數(shù)據(jù)的R2為:', num2str(R1)])
disp(['測(cè)試集數(shù)據(jù)的R2為:', num2str(R2)])
% MAE
mae1 = sum(abs(T_sim1' - T_train)) ./ M ;
mae2 = sum(abs(T_sim2' - T_test )) ./ N ;
disp(['訓(xùn)練集數(shù)據(jù)的MAE為:', num2str(mae1)])
disp(['測(cè)試集數(shù)據(jù)的MAE為:', num2str(mae2)])
% MBE
mbe1 = sum(T_sim1' - T_train) ./ M ;
mbe2 = sum(T_sim2' - T_test ) ./ N ;
disp(['訓(xùn)練集數(shù)據(jù)的MBE為:', num2str(mbe1)])
disp(['測(cè)試集數(shù)據(jù)的MBE為:', num2str(mbe2)])
%% ?繪制散點(diǎn)圖
sz = 25;
c = 'b';
figure
scatter(T_train, T_sim1, sz, c)
hold on
plot(xlim, ylim, '--k')
xlabel('訓(xùn)練集真實(shí)值');
ylabel('訓(xùn)練集預(yù)測(cè)值');
xlim([min(T_train) max(T_train)])
ylim([min(T_sim1) max(T_sim1)])
title('訓(xùn)練集預(yù)測(cè)值 vs. 訓(xùn)練集真實(shí)值')
figure
scatter(T_test, T_sim2, sz, c)
hold on
plot(xlim, ylim, '--k')
xlabel('測(cè)試集真實(shí)值');
ylabel('測(cè)試集預(yù)測(cè)值');
xlim([min(T_test) max(T_test)])
ylim([min(T_sim2) max(T_sim2)])
title('測(cè)試集預(yù)測(cè)值 vs. 測(cè)試集真實(shí)值')
? 運(yùn)行結(jié)果


? 參考文獻(xiàn)
[1] 彭璐.基于長(zhǎng)短時(shí)記憶網(wǎng)絡(luò)的時(shí)間序列預(yù)測(cè)與應(yīng)用研究[J].[2023-07-22].
[2] 胡瑋.基于改進(jìn)鄰域粗糙集和隨機(jī)森林算法的糖尿病預(yù)測(cè)研究[D].首都經(jīng)濟(jì)貿(mào)易大學(xué)[2023-07-22].DOI:CNKI:CDMD:2.1018.136129.
[3] 朱品光.基于隨機(jī)森林回歸算法的堆石壩爆破塊度預(yù)測(cè)研究[D].天津大學(xué)[2023-07-22].