fit2 = model.MAPE(X_test[:, -1], adjusted_prediction1)通过此代码计算得出的fit2,建立一个空的列表将fit2添加进去为什么输出的是None
时间: 2024-03-23 14:40:51 浏览: 37
这个问题可能是因为你没有正确地将 `fit2` 添加到列表中。请确保你正确地使用了 `append()` 方法将 `fit2` 添加到列表中。例如:
```python
fit_list = [] # 建立空列表
fit2 = model.MAPE(X_test[:, -1], adjusted_prediction1)
fit_list.append(fit2) # 将 fit2 添加到列表中
print(fit_list) # 此处应该输出 [fit2]
```
如果你仍然无法得到正确的输出,请检查你的 `model.MAPE()` 方法是否正确地返回了一个数值类型的结果。你可以在 `model.MAPE()` 方法中添加一个 `print()` 语句来检查这一点。例如:
```python
def MAPE(self, y_true, y_pred):
mape = np.mean(np.abs((y_true - y_pred) / y_true)) * 100
print("MAPE:", mape) # 添加一个 print 语句
return mape
```
这样,你就可以在终端中看到 `MAPE` 值是否正确计算出来了。
相关问题
model = Sequential() model.add(LSTM(10, activation = "tanh",input_shape=(window_size, 1))) model.add(Dense(1)) model.add(tfp.layers.DistributionLambda( lambda t: tfd.Normal(loc=t[...,0], scale=0.01*tf.math.softplus(t[...,1])), name='normal_dist')) # note this negloglik = lambda y, p_y: -p_y.log_prob(y) # note this opt = keras.optimizers.Adam(learning_rate=0.001) model.compile(loss=negloglik, optimizer= opt) #model.compile(loss="mse", optimizer= opt)中,改为model.add(Dense(2)),测试集中的MAPE上升,怎么办
当您将 `model.add(Dense(1))` 更改为 `model.add(Dense(2))` 后,您的模型将输出两个值,一个是均值,另一个是标准差。这表明您希望使用正态分布来拟合您的目标。但您需要相应地更改损失函数,使其适用于正态分布。可以使用负对数似然作为损失函数,然后使用 `tfd.Normal.log_prob(y)` 来计算概率密度。
以下是更改后的代码示例:
```
model = Sequential()
model.add(LSTM(10, activation="tanh", input_shape=(window_size, 1)))
model.add(Dense(2))
model.add(tfp.layers.DistributionLambda(
lambda t: tfd.Normal(loc=t[...,0], scale=0.01*tf.math.softplus(t[...,1])),
name='normal_dist'))
def negloglik(y, p_y):
return -tf.reduce_mean(p_y.log_prob(y))
opt = keras.optimizers.Adam(learning_rate=0.001)
model.compile(loss=negloglik, optimizer=opt)
```
请注意,您还需要相应地调整您的训练代码,以便在训练期间使用 `tfd.Normal(loc=p_y[:,0], scale=tf.math.softplus(p_y[:,1]))` 来计算预测值的概率密度。
import numpy as np import pandas as pd import matplotlib.pyplot as plt import BPNN from sklearn import metrics from sklearn.metrics import mean_absolute_error from sklearn.metrics import mean_squared_error #导入必要的库 df1=pd.read_excel(r'D:\Users\Desktop\大数据\44.xls',0) df1=df1.iloc[:,:] #进行数据归一化 from sklearn import preprocessing min_max_scaler = preprocessing.MinMaxScaler() df0=min_max_scaler.fit_transform(df1) df = pd.DataFrame(df0, columns=df1.columns) x=df.iloc[:,:4] y=df.iloc[:,-1] #划分训练集测试集 cut=4#取最后cut=30天为测试集 x_train, x_test=x.iloc[4:],x.iloc[:4]#列表的切片操作,X.iloc[0:2400,0:7]即为1-2400行,1-7列 y_train, y_test=y.iloc[4:],y.iloc[:4] x_train, x_test=x_train.values, x_test.values y_train, y_test=y_train.values, y_test.values #神经网络搭建 bp1 = BPNN.BPNNRegression([4, 16, 1]) train_data=[[sx.reshape(4,1),sy.reshape(1,1)] for sx,sy in zip(x_train,y_train)] test_data = [np.reshape(sx,(4,1))for sx in x_test] #神经网络训练 bp1.MSGD(train_data, 1000, len(train_data), 0.2) #神经网络预测 y_predict=bp1.predict(test_data) y_pre = np.array(y_predict) # 列表转数组 y_pre=y_pre.reshape(4,1) y_pre=y_pre[:,0] #画图 #展示在测试集上的表现 draw=pd.concat([pd.DataFrame(y_test),pd.DataFrame(y_pre)],axis=1); draw.iloc[:,0].plot(figsize=(12,6)) draw.iloc[:,1].plot(figsize=(12,6)) plt.legend(('real', 'predict'),loc='upper right',fontsize='15') plt.title("Test Data",fontsize='30') #添加标题 #输出精度指标 print('测试集上的MAE/MSE') print(mean_absolute_error(y_pre, y_test)) print(mean_squared_error(y_pre, y_test) ) mape = np.mean(np.abs((y_pre-y_test)/(y_test)))*100 print('=============mape==============') print(mape,'%') # 画出真实数据和预测数据的对比曲线图 print("R2 = ",metrics.r2_score(y_test, y_pre)) # R2 运行上述程序。在下面这一步中draw=pd.concat([pd.DataFrame(y_test),pd.DataFrame(y_pre)],axis=1);我需要将归一化的数据变成真实值,输出对比图,该怎么修改程序
在将归一化的数据变回真实值的过程中,需要将归一化的因变量(即最后一列)逆转换回来,以得到真实的预测值和真实值。代码如下:
```
# 将预测结果和真实结果逆归一化
y_predict = min_max_scaler.inverse_transform(y_pre.reshape(-1, 1))
y_test = min_max_scaler.inverse_transform(y_test.reshape(-1, 1))
# 画图
draw=pd.concat([pd.DataFrame(y_test), pd.DataFrame(y_predict)], axis=1)
draw.iloc[:,0].plot(figsize=(12,6))
draw.iloc[:,1].plot(figsize=(12,6))
plt.legend(('real', 'predict'), loc='upper right', fontsize='15')
plt.title("Test Data", fontsize='30')
# 输出精度指标
print('测试集上的MAE/MSE')
print(mean_absolute_error(y_predict, y_test))
print(mean_squared_error(y_predict, y_test))
mape = np.mean(np.abs((y_predict-y_test)/(y_test)))*100
print('=============mape==============')
print(mape,'%')
# 输出R2分数
print("R2 = ", metrics.r2_score(y_test, y_predict))
```
在此代码中,我们使用了 MinMaxScaler 对象的 inverse_transform() 方法将归一化的结果转换回原始的数据范围。运行修改后的代码,即可得到真实值与预测值的对比图,以及各种精度指标的输出。
阅读全文