預測效果
代碼功能
該代碼實現了一個結合卷積神經網絡(CNN)和Kolmogorov–Arnold網絡(KAN)的混合模型(CNN-KAN),用于時間序列預測任務。核心功能包括:
- 數據加載與預處理:加載標準化后的訓練集和測試集(時間序列數據)。
- 模型構建:
- CNN部分:提取時間序列的局部特征(使用1D卷積層和池化層)。
- KAN部分:替代全連接層,通過樣條基函數增強非線性擬合能力,提高預測精度。
- 模型訓練與評估:使用MSE損失和Adam優化器訓練模型,保存最佳模型參數,并在測試集上計算評估指標(MSE、RMSE、MAE、R2)。
- 結果可視化:繪制訓練/測試損失曲線,并反歸一化預測結果。
算法步驟
-
數據加載
- 使用
joblib
加載預處理后的訓練集(train_set
,train_label
)和測試集(test_set
,test_label
)。 - 封裝為
DataLoader
(批量大小=64)。
- 使用
-
模型定義
KANLinear
層:- 基礎線性變換 + 樣條基函數(B-splines)的非線性變換。
- 支持動態網格更新和正則化損失計算。
CNN1DKANModel
:- 卷積塊:多個
Conv1d + ReLU + MaxPool1d
層(參考VGG架構)。 - 自適應平均池化:替代全連接層,減少參數量。
- KAN輸出層:生成最終預測結果。
- 卷積塊:多個
-
模型訓練
- 損失函數:均方誤差(
MSELoss
)。 - 優化器:Adam(學習率=0.0003)。
- 訓練循環:
- 前向傳播 → 計算損失 → 反向傳播 → 參數更新。
- 記錄每個epoch的訓練/測試MSE,保存最佳模型(最低測試MSE)。
- 損失函數:均方誤差(
-
模型評估
- 加載最佳模型進行預測。
- 計算指標:
R2
(模型擬合優度)、MSE
、RMSE
、MAE
。 - 反歸一化預測結果(使用預訓練的
StandardScaler
)。
-
可視化
- 繪制訓練/測試MSE隨epoch的變化曲線。
- 輸出評估指標和反歸一化后的結果。
技術路線
- 框架:PyTorch(模型構建、訓練、評估)。
- 數據預處理:使用
StandardScaler
標準化數據(通過joblib
保存/加載)。 - 模型架構:
- 特征提取:CNN(1D卷積層)捕獲時間序列局部模式。
- 非線性映射:KAN層替代傳統全連接層,通過樣條函數靈活擬合復雜關系。
- 評估指標:
sklearn
計算R2
、MSE
等。 - 可視化:
matplotlib
繪制損失曲線。
關鍵參數設定
參數 | 值 | 說明 |
---|---|---|
batch_size | 64 | 數據批量大小 |
epochs | 50 | 訓練輪數 |
learn_rate | 0.0003 | Adam優化器學習率 |
conv_archs | ((2, 32), (2, 64)) | CNN層配置(卷積層數×通道數) |
grid_size | 5 | KAN樣條網格大小 |
spline_order | 3 | 樣條多項式階數 |
output_dim | 1 | 預測輸出維度(回歸任務) |
運行環境
- Python庫:
torch, joblib, numpy, pandas, sklearn, matplotlib
- 硬件:支持CUDA的GPU(優先)或CPU(自動切換)。
- 數據依賴:
- 預處理的訓練/測試集文件(
train_set
,train_label
等)。 - 預訓練的
StandardScaler
(scaler
文件)。
- 預處理的訓練/測試集文件(
應用場景
- 時間序列預測:
- 如股票價格、氣象數據、電力負荷等序列數據的未來值預測。
- 高非線性關系建模:
- KAN層通過樣條基函數靈活擬合復雜非線性模式,優于傳統全連接層。
- 輕量化模型需求:
- 自適應池化替代全連接層,減少參數量(模型總參數量:22,432)。
- 研究驗證:
- 探索CNN與KAN結合的混合架構在預測任務中的有效性(最終
R2=0.995
,擬合優度高)。
- 探索CNN與KAN結合的混合架構在預測任務中的有效性(最終
補充說明
- 創新點:KAN作為輸出層,通過動態網格更新和正則化約束(L1 + 熵),增強模型表達能力。
- 性能:50個epoch后測試集
MSE=0.2627
(反歸一化后MSE=0.0041
),預測精度高。 - 擴展性:可通過調整卷積架構、KAN參數適配不同時間序列長度和復雜度。
完整代碼
- 完整代碼訂閱專欄獲取
# 模型預測
# 模型 測試集 驗證
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 模型加載
model = torch.load('best_model_cnn_kan.pt')
model = model.to(device)# 預測數據
original_data = []
pre_data = []
with torch.no_grad():for data, label in test_loader:origin_lable = label.tolist()original_data += origin_lablemodel.eval() # 將模型設置為評估模式data, label = data.to(device), label.to(device)# 預測test_pred = model(data) # 對測試集進行預測test_pred = test_pred.tolist()pre_data += test_pred
[8]
import numpy as np
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score# 模型分數
score = r2_score(original_data, pre_data)
print('*'*50)
print('模型分數--R^2:',score)print('*'*50)
# 測試集上的預測誤差
test_mse = mean_squared_error(original_data, pre_data)
test_rmse = np.sqrt(test_mse)
test_mae = mean_absolute_error(original_data, pre_data)
print('測試數據集上的均方誤差--MSE: ',test_mse)
print('測試數據集上的均方根誤差--RMSE: ',test_rmse)
print('測試數據集上的平均絕對誤差--MAE: ',test_mae)
**************************************************
模型分數--R^2: 0.9954956071920047
**************************************************
測試數據集上的均方誤差--MSE: 0.004104453060426307
測試數據集上的均方根誤差--RMSE: 0.06406600549766082
測試數據集上的平均絕對誤差--MAE: 0.047805079976603375[19]
from sklearn.preprocessing import StandardScaler, MinMaxScaler# 將列表轉換為 NumPy 數組
original_data = np.array(original_data)
pre_data = np.array(pre_data)# 反歸一化處理
# 使用相同的均值和標準差對預測結果進行反歸一化處理
# 反標準化
scaler = load('scaler')
original_data = scaler.inverse_transform(original_data)
pre_data = scaler.inverse_transform(pre_data)
[20]
# 可視化結果
plt.figure(figsize=(12, 6), dpi=100)
plt.plot(original_data, label='原始值',color='orange') # 真實值
plt.plot(pre_data, label='CNN-KAN預測值',color='green') # 預測值
plt.legend()
plt.show()