python程序模拟后的数理统计

我用卷积神经网络进行模拟之后让其做出一幅预测与实际的曲线图,我想要对其进行数理统计,得出方差(包括均值和标准偏差)总体均值和置信区间等,根据这些来方便调整程序来让预测曲线更加贴合实际曲线,也作为调整依据。
如果你有更好的调整程序让预测曲线更加贴合实际的方法,也请说说。
程序如下

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import Conv1D, MaxPooling1D, Flatten, Dense

1.
#数据清洗
data = pd.read_csv('zhendaorushuju.csv', encoding='gb18030')

2.
#特征选择
features = ['Nb%', 'Ti%', 'AL%', 'V%', 'Cr%', 'Mo%', 'C%', 'Mn%', 'P%', 'Ni%', 'Cu%', 'Si%', 'S%', '奥氏体化温度0℃',
            '油冷时间0min', '保温时间0min', '上下窜动时间0min', '回火0退火温度0℃', '保温时间0min']
X = data[features]
y = data['硬度']

3.
#特征缩放
scaler = MinMaxScaler()
X = scaler.fit_transform(X)

4.
#数据划分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=400)

5.
#重塑数据为三维数组
X_train = X_train.reshape((X_train.shape[0], X_train.shape[1], 1))
X_test = X_test.reshape((X_test.shape[0], X_test.shape[1], 1))

6.
#构建卷积神经网络模型
model = Sequential()
model.add(Conv1D(filters=37, kernel_size=4, activation='relu', input_shape=(X_train.shape[1], X_train.shape[2])))
model.add(MaxPooling1D(pool_size=5))
model.add(Flatten())
model.add(Dense(1700, activation='relu'))
model.add(Dense(1))

7.
#编译模型
model.compile(optimizer='adam', loss='mse')

8.
#训练模型
history = model.fit(X_train, y_train, epochs=50, batch_size=32, validation_data=(X_test, y_test), verbose=0)

9.
#评估模型
score = model.evaluate(X_test, y_test, verbose=0)
print('Test loss:', score)

10.
#使用模型进行预测
y_pred = model.predict(X_test)

11.
#绘制预测结果与真实结果的对比图
plt.plot(y_test.values, label='true')
plt.plot(y_pred, label='pred')
plt.legend()
plt.show()

回答引用ChatGPT:为了进行数理统计,可以使用numpy库来计算方差、均值、标准差、总体均值等统计量,以及使用scipy库来计算置信区间等统计量。以下是代码示例:

import numpy as np
from scipy import stats

# 计算均值、方差、标准差
mean = np.mean(y_test)
variance = np.var(y_test)
std_deviation = np.std(y_test)

# 计算总体均值和置信区间
n = len(y_test)
t_value = stats.t.ppf(0.95, n-1)  # 计算t分布的临界值
interval = t_value * std_deviation / np.sqrt(n)
lower_bound = mean - interval
upper_bound = mean + interval

print('Mean:', mean)
print('Variance:', variance)
print('Standard Deviation:', std_deviation)
print('Population Mean:', model.predict(X_test).mean())
print('Confidence Interval:', (lower_bound, upper_bound))

如果想要调整程序以提高预测准确性,可以考虑以下方法:

1 调整神经网络的结构和参数,如增加或减少卷积层、池化层、全连接层的数量、调整激活函数、优化器、学习率等参数。
2 增加或减少特征变量,或者使用其他特征选择方法,如PCA、Lasso等。
3 增加样本数量,或者使用其他数据增强方法,如旋转、缩放、平移等。
4 采用其他机器学习算法进行建模,如随机森林、支持向量机、决策树等。
5 对数据进行更加精细的清洗和处理,如缺失值处理、异常值处理、归一化等。
6 考虑使用集成学习方法,如bagging、boosting等,将多个模型的结果进行集成。

1.计算均值和标准偏差

import numpy as np

mean_true = np.mean(y_test.values)
std_true = np.std(y_test.values)

mean_pred = np.mean(y_pred)
std_pred = np.std(y_pred)

2.计算方差

var_true = np.var(y_test.values)
var_pred = np.var(y_pred)

3.计算总体均值和置信区间

import statistics as stats

n = len(y_test.values)
mean_true_all = stats.mean(y_test.values)
se_true = stats.stdev(y_test.values) / np.sqrt(n)
conf_true = (stats.mean(y_test.values) - 1.96*se_true, stats.mean(y_test.values) + 1.96*se_true)

mean_pred_all = np.mean(y_pred)
se_pred = np.std(y_pred) / np.sqrt(n)
conf_pred = (np.mean(y_pred) - 1.96*se_pred, np.mean(y_pred) + 1.96*se_pred)

4.调整模型
根据预测结果和真实结果的差异,自己调整模型就行

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
首先,对于数理统计的部分,可以用numpy库中的函数对预测结果进行计算。代码如下所示:

#计算平均值、标准差和方差
mean = np.mean(y_test.values)
std = np.std(y_test.values)
var = np.var(y_test.values)

#计算置信区间(可调整置信水平)
confidence_level = 0.95
n = len(y_test.values)
m = np.mean(y_test.values)
sem = np.std(y_test.values) / np.sqrt(n)
h = sem * scipy.stats.t.ppf((1 + confidence_level) / 2, n - 1)

lower_bound = m - h
upper_bound = m + h

print("Mean:", mean)
print("Standard deviation:", std)
print("Variance:", var)
print("Confidence interval:", [lower_bound, upper_bound])

这段代码计算了均值、标准差和方差,并根据置信水平计算出置信区间。其中用到了scipy库中的stats模块来进行t分布的计算。

另外,对于调整预测曲线更加贴合实际曲线,可以尝试以下方法:

  1. 增加数据量或进行数据扩充,从而增加模型的泛化能力;
  2. 调整模型超参数,如卷积核大小、卷积核个数、池化窗口大小、全连接层的神经元数量等;
  3. 对特征进行更加精细的筛选和处理,如特征缩放、PCA降维等;
  4. 尝试其他类型的神经网络,如LSTM、GRU等;
  5. 采用集成学习等方法,将多个模型的预测结果进行加权平均。
    如果我的回答解决了您的问题,请采纳!
该回答引用ChatGPT
首先,我们可以使用numpy库中的函数来计算方差、均值和标准偏差:
python
# 计算方差、均值和标准偏差
variance = np.var(y_test)
mean = np.mean(y_test)
std_deviation = np.std(y_test)

其中,`np.var()`函数用于计算方差,`np.mean()`函数用于计算均值,`np.std()`函数用于计算标准偏差。
接下来,我们可以使用`scipy`库中的函数来计算总体均值和置信区间:
python
import scipy.stats as stats
# 计算总体均值
population_mean = np.mean(y)
# 计算置信区间
confidence_interval = stats.norm.interval(0.95, loc=mean, scale=std_deviation/np.sqrt(len(y_test)))

其中,`np.mean()`函数用于计算总体均值,`stats.norm.interval()`函数用于计算置信区间。这里我们使用了95%的置信水平。
最后,我们可以将这些统计量输出:
python
print("方差:", variance)
print("均值:", mean)
print("标准偏差:", std_deviation)
print("总体均值:", population_mean)
print("置信区间:", confidence_interval)

如果想要调整程序来让预测曲线更加贴合实际曲线,可以尝试以下方法:
1. 调整模型的超参数,如卷积核大小、卷积核数量、池化大小、隐藏层神经元数量等,以提高模型的拟合能力。
2. 增加更多的特征,以提高模型的预测能力。
3. 调整训练过程中的学习率、批大小等参数,以提高模型的收敛速度和泛化能力。
4. 尝试使用其他类型的神经网络模型,如循环神经网络、长短时记忆网络等,以提高模型的预测能力。

朋友你的训练模型用的大致是咋样的?数据集多吗,感觉这块可以改进