- 导入必要的库和模块:
```python
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Bidirectional, LSTM, Dense
```
- 加载数据并准备训练集和测试集:
```python
data = pd.read_excel('c.xlsx').iloc[0:, 1:]
X, y = data.iloc[:, 0:-1], data.iloc[:, -1]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, shuffle=False)
```
- 缩放特征:
```python
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
```
- 构建 BiLSTM 模型并进行训练:
```python
model = Sequential()
model.add(Bidirectional(LSTM(units=64, return_sequences=True), input_shape=(X_train_scaled.shape[1], X_train_scaled.shape[2])))
model.add(Dense(1)) # Regression problems typically have output layer with one neuron
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(X_train_scaled, y_train, epochs=10, batch_size=32)
```
- 在测试集上进行预测并评估模型:
```python
y_pred = model.predict(X_test_scaled)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
mae = mean_absolute_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("RMSE:", rmse)
print("MAE:", mae)
print("R²:", r2)
```
- 绘制拟合对比曲线图:
```python
plt.figure(figsize=(10, 6))
plt.plot(range(len(y_test)), y_test, color='darkorange', label='Actual')
plt.plot(range(len(y_pred)), y_pred, color='navy', linewidth=2, label='Predicted')
plt.xlabel('Sample Index')
plt.ylabel('Target Variable')
plt.title('BiLSTM Regression Fit Comparison')
plt.legend()
plt.grid(True)
plt.show()
```