12.24

 

名称:混凝土承重等级预测

一、实验背景

在土木工程中,混凝土是构筑建筑物最基本的材料。混凝土可承受的强度与其寿命、制造所使用的材料、测试时的温度等因素息息相关。混凝土的制造过程十分复杂,涉及水泥、熔炉产出的煤渣和灰烬、水、强度塑化剂、粗聚合剂、细聚合剂等多种化工原料。我们用一个压力达2000kN的液压测试机采集混凝土承重能力的指标,对混凝土方块或圆柱体进行压力测试。这个测试是破坏性的,并且可能会持续很长时间,因此如果我们能够脱离实际测试,直接使用制作原料对其承重能力进行预测,则将具备非常高的商业价值。图1 显示了一次承重能力测试。在本次研究中,我们希望能够建立出一个以混凝土制作配方为输入数据,能够预测其承重能力的模型。

 

图 1  承重能力测试

二、实验数据

为了通过混凝土配方预测其成品的承重强度,我们向数据集中采集了大量的样本数据。每个样本都包含8个特征值作为输入数据,其输出值就是指标承重强度。

本数据集包含了如下指标(按照数据集中特征值的顺序进行排列),其中输入指标包括以下内容。

(1)Cement 单位:kg /m3。

(2)Blast Furnace Slag 单位:kg /m3。

(3)Fly Ash 单位:kg /m3。

(4)Water 单位:kg /m3。

(5)Superplasticizer 单位:kg /m3。

(6)Coarse Aggregate 单位:kg /m3。

(7)Fine Aggregate 单位:kg /m3。

(8)Age 单位:kg /m3。

输出指标包括Concrete compressive strength 单位:MPa。

三、实验任务

1.导入数据集,并采用.head()读取前6条数据,采用.info()返回当前数据的信息(10)

通过粗略观察,我们可以看到数据集的大小是1030×9,即其中包含了1030个样本和9个变量(9 列)。每个样本有8个混凝土原料配方作为输入特征值(前8 列)及1个目标值(最后一列,承重能力)。

2. 对混凝土数据集进行可视化处理,生成各特征之间关系的矩阵图seaborn工具的pairplot ()方法进行绘图(10)

3. 数据预处理,并将原始数据集划分为训练集和测试集,选用合适的机器学习算法对混凝土数据集进行拟合。(20)

4. 采用交叉验证估计超参数,分析超参数对预测结果的影响(30)

5. 预测结果分析及可视化,绘制混淆矩阵,分析不同承重等级混凝土的查全率查准率(30)

四、实验结果及分析

简明结果

精度

0.616504854368932

查准率

0.6178653925078001

查全率

0.616504854368932

F1

0.6131203492470739

详细方案和结果分析

解决方案

设计思路

1数据探索:初步了解数据集的结构和特征,检查数据的完整性和分布。

2数据预处理:对数据进行标准化处理,以消除不同量纲的影响。

3特征选择:分析各特征与目标变量的相关性,选择对预测结果影响较大的特征。

4模型选择:根据目标变量的性质(分类或回归),选择合适的机器学习模型。

5模型训练与评估:训练模型并使用交叉验证评估模型的泛化能力。

6结果分析:分析模型的预测结果,评估模型性能。

实现步骤

1导入数据集:使用pandas读取Excel文件中的数据。

2数据探索:使用.head().info()方法查看数据的基本信息。

3数据可视化:使用seabornpairplot方法展示特征之间的关系。

4数据预处理:使用StandardScaler对特征进行标准化处理。

5划分数据集:使用train_test_split将数据集划分为训练集和测试集。

6模型训练:如果目标变量是分类的,使用RandomForestClassifier

如果目标变量是回归的,使用RandomForestRegressor

7交叉验证:使用cross_val_score评估模型的泛化能力。

8预测与评估:

对测试集进行预测。

如果是分类问题,使用classification_reportconfusion_matrix评估模型。

如果是回归问题,计算MSERMSEMAE分数。

9结果分析:根据评估指标分析模型性能,讨论可能的改进方向。

结果展示

【包括每个任务点结果的展示】

  1. 返回前六条数据结果

 

           1、数据展示

  1. 数据可视化结果

 

2. 数据可视化

  1. 混淆矩阵展示

 

3. 分类混淆矩阵

  1. 精度,查准率,查全率,FI值结果截图

4. 分类结果

 

 

结果分析

1. 超参数影响分析

在本实验中,我们使用了随机森林模型,其主要超参数包括树的数量(n_estimators)、树的最大深度(max_depth)、以及是否进行特征选择(max_features)。这些超参数对模型性能有显著影响:

  • 树的数量:增加树的数量可以提高模型的稳定性和准确性,但也会增加计算成本。
  • 树的最大深度:限制树的深度可以防止过拟合,但过浅的树可能无法捕捉数据的复杂性。
  • 特征选择:通过随机选择特征子集来构建每棵树,可以增加模型的泛化能力。

2. 精度、查准率、查全率、F1值分析

由于目标变量 yy 是整数类型,我们首先假设这是一个分类问题。以下是对模型性能的分析:

  • 精度(Accuracy):表示模型预测正确的比例。高精度意味着模型在大多数情况下都能正确分类。
  • 查准率(Precision):在所有被预测为正类的样本中,实际为正类的比例。高查准率意味着较少的假阳性。
  • 查全率(Recall):在所有实际为正类的样本中,被正确预测为正类的比例。高查全率意味着较少的假阴性。
  • F1值:查准率和查全率的调和平均,是一个综合考虑查准率和查全率的指标。

3. 可能存在的问题

  • 过拟合:如果模型在训练集上表现很好,但在测试集上表现不佳,可能是过拟合。
  • 欠拟合:如果模型在训练集和测试集上的表现都不好,可能是欠拟合。
  • 数据不平衡:如果某些类别的样本数量远多于其他类别,可能会影响模型的预测性能。

4. 可提升的改进思路

  • 超参数调优:使用网格搜索(Grid Search)或随机搜索(Random Search)来寻找最优的超参数组合。
  • 特征工程:通过创建新的特征或转换现有特征来提高模型性能。
  • 模型集成:结合多个模型的预测结果,如使用投票分类器或堆叠(Stacking)方法。
  • 处理数据不平衡:如果存在类别不平衡,可以考虑过采样少数类、欠采样多数类或使用合成少数类技术(如SMOTE)。
  • 模型选择:尝试其他机器学习算法,如支持向量机、梯度提升树或神经网络,以找到最适合数据的模型。

结论

本实验通过随机森林模型对混凝土的承重等级进行了预测。通过分析超参数的影响、模型的精度、查准率、查全率和F1值,我们对模型的性能有了深入的理解。同时,我们也识别了可能存在的问题,并提出了改进思路,以期在未来的工作中进一步提升模型的预测能力。

代码

# 导入必要的库
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import confusion_matrix, classification_report, accuracy_score, precision_score, recall_score, f1_score

# 1. 导入数据集并读取前6条数据,返回数据信息
data = pd.read_excel('BP_R_Data.xlsx')
print(data.head(6))
print(data.info())

# 2. 数据可视化处理
sns.pairplot(data)
plt.show()

# 3. 数据预处理,并将原始数据集划分为训练集和测试集
X = data.drop(['y'], axis=1)
y = data['y']
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)

# 4. 选择机器学习算法进行拟合
rf = RandomForestClassifier(random_state=42)
rf.fit(X_train, y_train)

# 交叉验证
scores = cross_val_score(rf, X_scaled, y, cv=5)
print("交叉验证分数:", scores)

# 5. 预测结果分析及可视化
y_pred = rf.predict(X_test)

# 绘制混淆矩阵
conf_matrix = confusion_matrix(y_test, y_pred)
sns.heatmap(conf_matrix, annot=True, fmt='d')
plt.title('Confusion Matrix')
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.show()

# 分类报告
print(classification_report(y_test, y_pred))

# 计算分类模型的性能指标
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred, average='weighted')
recall = recall_score(y_test, y_pred, average='weighted')
f1 = f1_score(y_test, y_pred, average='weighted')

print("精度 (Accuracy):", accuracy)
print("查准率 (Precision):", precision)
print("查全率 (Recall):", recall)
print("F1值 (F1 Score):", f1)

# 保存模型,如果需要的话
# from joblib import dump, load
# dump(rf, 'random_forest_model.joblib')

 

 

posted @ 2024-12-29 13:29  七安。  阅读(22)  评论(0编辑  收藏  举报