> 技术文档 > 【A题解题思路 第二弹】2025创新杯(钉钉杯)数学建模A题解题思路+可运行代码参考(无偿分享)

【A题解题思路 第二弹】2025创新杯(钉钉杯)数学建模A题解题思路+可运行代码参考(无偿分享)

注:该内容由“数模加油站”原创,无偿分享,可以领取参考但不要利用该内容倒卖,谢谢!

A 题 智慧工厂工业设备传感器数据分析

初赛任务A:机床设备故障预测回归分析问题 使用机器编号、机器类型、运行小时数、温度、振动、声音、油位、冷却液位、功耗、距 上次维护天数、维护历史次数、故障历史次数、人工智能监控、过去30天错误编码等特征,构 建回归模型,预测机床设备在7天内是否会发生故障。要求输出模型准确率、召回率、F1值,并 分析前5个最重要的特征。

初赛任务B:剩余使用寿命预测回归分析问题 在不使用目标标签(7天内故障预测)的情况下,基于剩余使用寿命(天)、运行小时数、 温度、振动、油位、冷却液位、维护历史次数、故障历史次数等特征,构建回归模型,预测机 床设备的剩余使用寿命(目标为连续值)。要求输出模型的均方误差(MSE)和决定系数(R²) 并分析特征重要性对剩余寿命的影响

对于这两个问题,首先需要做好数据的预处理和特征选择,确保输入数据质量高且对目标变量有较好的预测能力。在选择模型时,可以从简单的回归模型入手,逐步引入复杂模型(如随机森林、XGBoost、SVR等)。评估模型时,需要使用合适的回归指标,如准确率、召回率、F1值等来评估故障预测任务,而使用均方误差和R²来评估剩余使用寿命预测任务。

问题1

问题1思路框架:

 

数学模型构建:

 

1. 数据预处理

数据预处理是任何机器学习任务中的关键步骤,直接影响到模型的表现。

1.1 缺失值处理

数值型特征(如温度、功耗等)的缺失值可以用 均值填充中位数填充。选择均值填充是因为大部分特征应该围绕某个中心值分布,均值作为一个较好的估计。

对于 类别型特征(如机器类型),可以使用 众数填充,即填充该特征的最常见值。

1.2 异常值处理

Z-score 方法用于检测异常值。Z-score反映了一个数据点距离均值的标准差。如果Z-score大于3,通常认为该点是异常值。

                       Z=\\frac{X-\\mu }{\\sigma }

其中,\\mu 是均值,\\sigma是标准差。

异常值可能会影响模型训练的稳定性,通常可以将异常值剔除或替换。

1.3 数据标准化

为了确保各个特征在相同的尺度上进行比较,通常需要对数值型特征进行标准化,特别是当使用距离度量或者对模型训练时间较为敏感的模型时。

标准化公式

{​{X}_{\\text{standard }}}=\\frac{X-\\mu }{\\sigma }

1.4 特征工程

  • 特征构造:可以结合现有特征构造新的特征。例如,可以计算 温度和振动的交互项,以反映设备状态变化的潜在关联。
  • 类别特征编码:如机器类型等可以通过 独热编码(One-Hot Encoding 转换为数值特征。

2. 特征选择

特征选择是减少模型复杂性、提高性能和避免过拟合的重要步骤。在此任务中,我们有多个传感器数据和设备历史记录特征,我们需要从中选择对预测故障最为相关的特征。

2.1 相关性分析

目标:初步筛选特征。通过计算各特征与目标变量(是否故障)的相关性,去除与目标变量相关性低的特征。

使用皮尔逊相关系数(Pearson correlation)来评估特征与目标之间的线性相关性。

{​{\\rho }_{X,Y}}=\\frac{\\operatorname{cov}(X,Y)}{​{​{\\sigma }_{X}}{​{\\sigma }_{Y}}}

其中,\\text{cov}(X,Y) 是特征 X 与目标 Y 的协方差,\\sigma_X\\sigma_Y是它们的标准差。

相关性分析帮助我们快速去除无关特征,避免后续算法在冗余特征上浪费计算资源。

2.2 递归特征消除(RFE

目标:在数据集较为复杂时,递归特征消除(RFE)可以进一步优化特征选择。

方法

    • RFE通过训练回归模型,并逐步去除不重要的特征,最终保留最具预测能力的特征。
    • 每次训练一个基学习器(例如线性回归),评估每个特征的重要性,然后递归地移除最不重要的特征,直到保留最重要的特征。
    • 适用场景:如果数据集特征之间存在复杂的非线性关系或交互作用,RFE能够帮助我们从中挖掘出最有用的特征。

2.3 基于树的模型(XGBoost

目标:使用树模型(如XGBoost或随机森林)对特征的重要性进行排序。这些模型在评估特征重要性时能够有效处理非线性关系。

方法

训练一个随机森林回归XGBoost回归模型,这些模型能够自动评估每个特征的贡献并计算特征重要性。

特征重要性通常基于信息增益或基尼指数(用于决策树的分裂标准)。

XGBoost的特征重要性评估:

\\text{ Feature Importance }=\\frac{\\sum\\limits_{i=1}^{n}{\\text{ Gain of feature }}\\text{i}}{n}

优点:随机森林和XGBoost能够处理非线性关系,适合复杂的设备故障预测问题,并且能够自动计算和筛选特征。

3. 构建XGBoost回归模型

在特征选择后,我们可以使用 XGBoost 来构建回归模型。XGBoost是一种基于梯度提升树的集成学习算法,适用于复杂的非线性数据。

3.1 初始化XGBoost模型

选择XGBoost作为回归模型,因为它能够处理复杂的特征交互,适合本任务中的设备故障预测问题。XGBoost模型的常见参数包括:

n_estimators:树的数量。

max_depth:每棵树的最大深度。

learning_rate:学习率,用于控制每棵树的贡献。

切分数据集为训练集和测试集。

XGBoost回归公式

  • XGBoost通过加权的决策树集成来做回归,损失函数为:

L(\\theta )=\\sum\\limits_{i=1}^{m}{\\left[ \\operatorname{loss}\\left( {​{y}_{i}},{​{​{\\hat{y}}}_{i}} \\right)+\\Omega (f) \\right]}

其中,\\text{loss}是回归损失函数,\\Omega(f)是树的复杂度(例如树的叶子数、分裂点的数量),m是样本数,\\hat{y}_i是预测值。

3.2 模型预测

模型训练完成后,我们可以使用测试集进行预测。

3.3 模型评估

使用 均方误差(MSE决定系数( 来评估回归模型的性能。

均方误差(MSE 衡量预测值与实际值之间的平均误差。

\\text{MSE}=\\frac{1}{m}\\sum\\limits_{i=1}^{m}{​{​{\\left( {​{y}_{\\text{true },i}}-{​{y}_{\\text{pred},i}} \\right)}^{2}}}

决定系数( 衡量模型对数据方差的解释能力。

{​{R}^{2}}=1-\\frac{\\sum\\limits_{i=1}^{m}{​{​{\\left( {​{y}_{\\text{true },i}}-{​{y}_{\\text{pred },i}} \\right)}^{2}}}}{\\sum\\limits_{i=1}^{m}{​{​{\\left( {​{y}_{\\text{true },i}}-\\bar{y} \\right)}^{2}}}}

3.4 模型性能分析

均方误差(MSE)越小,表示模型的预测误差越小。

 Score接近1时,表示模型能够很好地拟合数据,解释能力强;接近0则表示模型表现不佳

Python代码: 

import numpy as npimport pandas as pdfrom sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import StandardScalerfrom sklearn.impute import SimpleImputerfrom sklearn.metrics import mean_squared_error, r2_scoreimport xgboost as xgbimport seaborn as snsimport matplotlib.pyplot as pltfrom sklearn.feature_selection import RFEfrom sklearn.linear_model import LinearRegressionfrom scipy.stats import zscore# 数据加载data = pd.read_csv(\'train_data.csv\') # 用实际数据路径# 提取特征和目标变量X = data.drop(columns=[\'Failure_Within_7_Days\']) # 特征y = data[\'Failure_Within_7_Days\'] # 目标变量# 处理缺失值imputer = SimpleImputer(strategy=\'mean\')X_imputed = imputer.fit_transform(X)# 特征标准化scaler = StandardScaler()X_scaled = scaler.fit_transform(X_imputed)# 检查异常值(使用Z-score方法)Z = zscore(X_scaled)X_no_outliers = X_scaled[(Z < 3).all(axis=1)] # 删除异常值y_no_outliers = y[(Z < 3).all(axis=1)] # 删除对应的y# 切分数据集为训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X_no_outliers, y_no_outliers, test_size=0.2, random_state=42)# 相关性分析correlation_matrix = pd.DataFrame(X_scaled).corr()plt.figure(figsize=(12, 8))sns.heatmap(correlation_matrix, annot=True, cmap=\'coolwarm\')plt.show()# 递归特征消除(RFE)model = LinearRegression()selector = RFE(model, n_features_to_select=5)X_rfe = selector.fit_transform(X_train, y_train)# 输出选择的特征print(\"Selected features from RFE:\", X_train.columns[selector.support_])# 基于XGBoost的特征选择xgb_model = xgb.XGBRegressor(objective=\'reg:squarederror\', n_estimators=100, max_depth=6, learning_rate=0.1)xgb_model.fit(X_train, y_train)# 获取特征重要性importance = xgb_model.feature_importances_# 可视化特征重要性sns.barplot(x=importance, y=X.columns)plt.title(\"Feature Importance from XGBoost\")plt.show()# 使用XGBoost进行训练和预测xgb_model.fit(X_train, y_train)y_pred = xgb_model.predict(X_test)# 模型评估mse = mean_squared_error(y_test, y_pred)r2 = r2_score(y_test, y_pred)print(f\"Mean Squared Error: {mse}\")print(f\"R² Score: {r2}\")

 

后续都在“数模加油站”......