发动机剩余使用寿命预测(6)|SVR

职场   2025-01-26 15:23   四川  
SVR(Support Vector Regression,支持向量回归)是一种基于支持向量机(SVM)理论的回归算法。SVM最初是为了解决分类问题设计的,目的是寻找一个最优超平面来最大化不同类别之间的间隔。而SVR的目标是找到一个函数,使得预测值和实际值之间的误差都小于ε,并且尽可能平坦。如果数据是线性可分的,SVR会尝试找到一条直线(或超平面),使得所有数据点都落在该直线ε距离的管道内;如果数据是非线性,SVR会使用核函数将数据映射到高维空间,然后在高维空间中找到一个线性超平面。
上图中的粉色区域就是ε管,也称为ε-不敏感损失函数。你可以想象它是以实际值为中心,宽度为2ε的带状区域(ε-insensitive tube)。该损失函数当预测值与实际值之差小于ε时,不计算损失;超出部分的损失为误差减去ε:
为了平衡回归误差与模型复杂度,SVR的原始优化问题可以写成最小化以下目标函数:

其中,第一项是正则化项,控制模型复杂度;第二项是惩罚项,控制对误差的惩罚;C是惩罚参数,用于权衡误差和复杂度。 和  是松弛变量,用于表示超过 ε 的误差。

约束条件为:

将上述约束条件通过拉格朗日乘数法结合到目标函数中,再将问题转化为对偶形式求解,构造最终预测函数为:

其中,K是核函数(Kernel Function),用于处理非线性问题。是拉格朗日乘子。

具体推导过程,这里就不详细写了。说实话,学习一个算法,以我个人肤浅的理解,不一定要做到能手推出数学公式。这对绝大多数人来说,都不太友好了。尤其像我这种航空维修专业,已经工作了10多年,半路学习机器学习算法的大龄工程师,这个过程太枯燥了!我们其实只要搞清楚算法的大概原理,知道它的输入输出格式,每个参数的含义又是什么?再对照网上的案例,自己手敲一遍代码,尝试调一下超参数看最终的预测结果会有什么差异就可以了。所以真正的大佬,看到我写的文章就立马知道我只是菜鸡水平了。因为很多知识点我都是浅尝辄止,不敢太深入。在知乎上也看到这样一种说法:90%的人只会调包调参数,9%的人会改模型但也只瞎改,只有1%的人才会从数学角度推理论证模型的设计”。所以,对于90%的人而言,只要知道SVR的这几个关键参数就行了:C控制正则化强度;ε控制误差容忍范围;核函数kernel类型控制映射到高维空间的特征表示。而我,那就努力成为那9%吧

废话说得有点多,可考虑到核函数在机器学习中是一个比较重要的概念,这里还得再啰嗦几句。核函数是一种将数据从原始空间映射到高维特征空间的技术。通过核函数,我们可以在原始的输入空间中进行计算,但得到的结果相当于是在高维空间中计算的。举个简单的例子,在二维空间中,下图是一张无法线性分割的环形数据。

通过高斯核将数据映射到三维空间后,我们可以看到数据被拉伸分离,变得线性可分了:

机器学习库scikit-learn中提供了现成的SVR实现,我们可以使用内置的核函数,并通过交叉验证在不同的核函数与参数组合中找到最适合数据集训练的最佳模型。我们还是以发动机剩余寿命预测案例为例,具体方法如下:

import random
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.svm import SVR
from sklearn.model_selection import KFold
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
from tqdm import tqdm
from scipy.stats import uniform

# 定义超参数分布
param_distributions = {
    'C': uniform(loc=0.1, scale=10),  
    'epsilon': uniform(loc=0.01, scale=0.5),  
    'gamma': ['scale''auto'] + list(uniform(loc=0.001, scale=0.1).rvs(size=10)),  
    'kernel': ['linear''poly''rbf''sigmoid']
}

# 初始化 SVR 模型
model = SVR()

# 手动进行超参数随机搜索
param_list = []
for _ in range(50):  # 随机采样 50 组参数组合
    param_list.append({
        'C': param_distributions['C'].rvs(),
        'epsilon': param_distributions['epsilon'].rvs(),
        'gamma': random.choice(param_distributions['gamma']),
        'kernel': random.choice(param_distributions['kernel'])
    })
    
# 设置交叉验证
cv_splitter = KFold(n_splits=3, shuffle=True, random_state=42)

# 执行随机搜索并显示进度条
results = []
with tqdm(total=len(param_list), desc="Random Search Progress") as pbar:
    for params in param_list:  
        model.set_params(**params)  # 更新模型参数
        scores = []
        for train_idx, val_idx in cv_splitter.split(flat_seq_array, label_array.ravel()):
            # 在训练集上训练模型
            model.fit(flat_seq_array[train_idx], label_array.ravel()[train_idx])
            # 在验证集上预测并计算误差
            preds = model.predict(flat_seq_array[val_idx])
            score = mean_squared_error(label_array.ravel()[val_idx], preds)
            scores.append(score)
        avg_score = np.mean(scores)  
        results.append({'params': params, 'mean_test_score': avg_score})  
        pbar.update(1)  
由于scikit-learn 的 SVR 实现并不支持 GPU,所以这个训练过程可能会很慢!不同的核函数适用于不同的数据类型核问题,如果你知道数据的大致分布和特征,大可不必像我上面的代码将所有的核函数都罗列出来,这样的计算量太大了!光是搜索最优参数组合就花了47小时
以下是几种常见的核函数:
线性核(linear):适用于线性可分的数据,不进行任何非线性映射,数据直接保持原有特征空间。
多项式核(poly):将原始特征组合成高次项,例如:输入x=[x1, x2],可能映射成:[x12, x22, x1x2, x1, x2, 1]。可以模拟复杂的非线性关系。
径向基核(rbf):也称为高斯核,适用于绝大多数非线性问题,是最常用的核函数,它能将数据隐式地映射到无限维空间。
sigmoid核(sigmoid):适用于神经网络中的激活函数。
经过漫长的等待后,最佳参数组合如下:
'C': np.float64(2.7986), 
'epsilon': np.float64(0.4045), 
'gamma': np.float64(0.0982), 
'kernel': 'poly'
使用最佳参数重新训练模型后,最终的预测结果估计在过年前是出不来了。3天了,进度才9% 

我这破电脑,性能真是感人啊。本来想等出结果了再发出来,但是电脑太卡了,就这样吧。最后再小结一下:支持向量回归算法通过引入 ε-不敏感损失函数,避免了对小误差的敏感性,提升了模型的泛化能力。尤其在引入核函数后,可以处理非线性回归问题,非常适合处理复杂数据集,但这也同时增加了算法的复杂性核计算开销。因此在应用中,理解数据的特性并选择合适的核函数至关重要!


感谢大家对机务论坛的支持,关注机务论坛,倾听机务心声!航企优秀的方面必定宣传,不足的地方也必须指出,让领导们重视问题,解决问题,营造更好的机务维修环境。

征稿:
所见所闻,个人感悟,个人成长历程及感人故事。
特别征稿:我师傅的故事!
同时,征集劳动仲裁案例,分享案例,让更多的小伙伴能了解劳动纠纷的解决方式,通过劳动仲裁维护自己的合法权益。



评论区留言,同意的点赞
扫码添加小编微信
匿名爆料

minhangjiwuluntan


民航机务论坛微信公众平台
改名为:机务论坛
发布最新行业动向 深入解读政策法规
开辟维修工程专栏 交流飞机排故经验
分享前沿技术应用 预测职业发展前景
行业大咖讲经布道 业界专家授业解惑
致力打造一流的民航机务朋友圈----机务论坛
关注机务论坛,倾听机务心声!
投稿邮箱:duanwei0615@163.com

机务论坛
民航机务论坛改名为:机务论坛 发布最新行业动向 深入解读政策法规 开辟维修工程专栏 交流飞机排故经验 分享前沿技术应用 预测职业发展前景 行业大咖讲经布道 业界专家授业解惑 致力打造一流的民航机务朋友圈----机务论坛
 最新文章