我用卷积神经网络进行模拟之后让其做出一幅预测与实际的曲线图,我想要对其进行数理统计,得出方差(包括均值和标准偏差)总体均值和置信区间等,根据这些来方便调整程序来让预测曲线更加贴合实际曲线,也作为调整依据。
如果你有更好的调整程序让预测曲线更加贴合实际的方法,也请说说。
程序如下
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分布的计算。
另外,对于调整预测曲线更加贴合实际曲线,可以尝试以下方法:
python
# 计算方差、均值和标准偏差
variance = np.var(y_test)
mean = np.mean(y_test)
std_deviation = np.std(y_test)
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)))
python
print("方差:", variance)
print("均值:", mean)
print("标准偏差:", std_deviation)
print("总体均值:", population_mean)
print("置信区间:", confidence_interval)
朋友你的训练模型用的大致是咋样的?数据集多吗,感觉这块可以改进