SVM中如何防止过拟合

本文探讨了支持向量机(SVM)中的过拟合问题,包括其表现形式及原因,特别是异常点如何影响SVM的分类超平面。文中提出了通过引入松弛变量来解决过拟合的方法,并解释了该方法的原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在前面的博客中,我们已经详细讲述过了,什么是过拟合问题。
过拟合(overfitting)表现为模型在训练集上预测效果好,在测试集上预测效果差。

数据中的异常点会导致过拟合,这些异常点,严重偏离正常位置。
在SVM中,最优分类超平面恰恰是那些占少数的支持向量,如果支持向量中碰巧存在异常点,那么我们傻傻地让SVM去拟合这样的数据,最后的超平面就不是最优的了。

具体例子:(参考:https://www.jianshu.com/p/9b03cac58966)
如下图所示,深红色线表示我们希望训练得到的最优分类超平面,黑色虚线表示由于过拟合得到的较差的分类面。这是由于蓝色数据中有一个异常点,即图中的那个黑圈蓝点,使得我们的SVM去将就配合它,导致最后得到的分类面(粗黑色虚线)不尽如人意。从间隔可以看出,黑色虚线两边的间隔要比红色线两边的间隔要狭窄,也就是黑色虚线的分类效果比较差
在这里插入图片描述
解决过拟合的办法是为SVM引入了松弛变量ξ(slack variable),将SVM公式的约束条件改为:
在这里插入图片描述

从下可以看到,引入松弛变量使SVM能够容忍异常点的存在

为什么?

因为引入松弛变量后,所有点到超平面的距离约束不需要大于等于1了,而是大于0.8就行了(如果ξ=0.2的话),那么异常点就可以不是支持向量了,它就作为一个普通的点存在,我们的支持向量和超平面都不会受到它的影响。
在这里插入图片描述
我们知道,事物都有两面性,对异常点太容忍会导致任意超平面都可以是“最优”超平面,SVM就失去意义了。因此SVM公式中的目标函数也需要相应修改,我们加上松弛变量的平方和,并求最小值。这样就达到一个平衡:既希望松弛变量存在以解决异常点问题,又不希望松弛变量太大导致分类解决太差。

总结:svm中解决过拟合问题.
(1)数据扩增(前面说过)
(2)减少特征维度,维度太高,进行降维
(3)引入松弛变量,SVM特有的(类似于正则化?还在研究中。。。)

注:SVM中还有很多知识需要学习,一点一点啃。

以上内容,如有错误,望留言指正。

引用和参考:

https://www.jianshu.com/p/9b03cac58966

http://www.blogjava.net/zhenandaci/archive/2009/03/15/259786.html

https://www.zhihu.com/question/20178589

https://www.zhihu.com/question/30230784

仅用来个人学习和分享,如若侵权,留言立删。

尊重他人知识产权,不做拿来主义者!

喜欢的可以关注我哦QAQ,

你的关注就是我write博文的动力。

SVM(Support Vector Machine)是一种非常强大的分类算法,但有时候在使用过程中会出现过拟合的问题。如果我们在训练SVM模型时,数据量较小,而特征数量较多,或者选择的核函数过于复杂,都可能导致模型出现过拟合的情况。 针对SVM过拟合的问题,我们可以采取一些方法来解决。首先,我们可以尝试减小特征数量,通过特征选择或者降维的方法来降低模型的复杂度,从而减少过拟合的可能性。其次,可以尝试调整SVM模型的超参数,如惩罚系数C、核函数的参数等,来降低模型的复杂度,减少过拟合的风险。 接下来,我将给出一个简单的Python代码示例,演示如何使用SVM解决一个分类问题,并防止过拟合的发生。 ```python from sklearn import svm from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.datasets import load_iris # 加载数据 iris = load_iris() X, y = iris.data, iris.target # 数据预处理 scaler = StandardScaler() X = scaler.fit_transform(X) # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 创建SVM模型 clf = svm.SVC(kernel='rbf', C=1, gamma='auto') # 训练模型 clf.fit(X_train, y_train) # 预测 train_score = clf.score(X_train, y_train) test_score = clf.score(X_test, y_test) print("训练集准确率: {:.2f}%".format(train_score * 100)) print("测试集准确率: {:.2f}%".format(test_score * 100)) ``` 在这个示例中,我们使用了鸢尾花数据集,通过SVM模型进行分类,并使用数据预处理和训练集测试集划分来防止过拟合的问题。并且通过调节SVM模型的超参数,如C和核函数的参数来尽量避免模型出现过拟合的情况。希望这个例子能够帮助你更好地理解如何防止SVM模型出现过拟合的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值