【sklearn第十讲】支持向量机之回归篇

本文介绍了支持向量机(SVM)在回归问题中的应用,包括线性SVR、非线性SVR(如NuSVC和SVR),以及它们的数学原理和核函数选择。支持向量回归利用支持向量的概念,构建只依赖部分训练数据的模型,以提高泛化能力。此外,还提到了SVM在异常检测中的应用。

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

机器学习训练营——机器学习爱好者的自由交流空间(入群联系qq:2279055353)

回归

支持向量分类的方法能被推广到解决回归问题,称为支持向量回归。由支持向量分类产生的模型仅依赖训练数据的子集,因为创建模型的代价函数并不考虑超过边界的训练点。类似地,由支持向量回归产生的模型仅依赖训练数据的子集,因为创建模型的代价函数忽略任何接近模型预测的训练数据。支持向量回归有三个不同的执行版本:SVR, NuSVR, LinearSVR. LinearSVR执行速度比SVR要快,但只提供线性核。fit方法取X, y作为输入参数,这里,y取浮点值而不是分类的整数值。

from sklearn import svm
X = [[0, 0], [2, 2]]
y = [0.5, 2.5]
clf = svm.SVR()
clf.fit(X, y)

这里写图片描述

clf.predict([[1, 1]])

这里写图片描述

异常检测

One-class SVM可以被用于异常检测(novelty detection), 即,给定一个样本集,检测该集的灵活边界,以便将新的数据点归类是否属于这个集合。类OneClassSVM执行之。这是一个典型的无监督学习,所以fit方法只有一个数组X作为输入,并没有类标签。
这里写图片描述

核函数

可以使用以下的核函数:

  • linear: &lt;x,x′&gt;&lt;x, x&#x27;&gt;<x,x>

  • polynomial: (γ&lt;x,x′&gt;+r)d(\gamma&lt;x, x&#x27;&gt;+r)^d(γ<x,x>+r)d, ddd 由参数degree, rrr 由coef0指定

  • rbf: exp⁡(−γ∥x−x′∥2)\exp(-\gamma\|x-x&#x27;\|^2)exp(γxx2), γ\gammaγ 由参数gamma指定,且必须是正的

  • sigmoid: tanh⁡(γ&lt;x,x′&gt;+r)\tanh(\gamma&lt;x, x&#x27;&gt;+r)tanh(γ<x,x>+r), rrr 由参数coef0指定

数学原理

数学上,一个支持向量机在一个高维或有限维空间构造了一个或一组超平面,这些超平面被用作分类、回归或其它任务。本质上,由超平面实现的最优分割,即是这个超平面到任何类的最近的训练数据点的距离是最大的。通常来说,边界越大,分类器的泛化误差(generalization error)就越低。

这里写图片描述

SVC

给定训练向量

<think>我们正在设计一个包含支持向量机(SVM)和线性回归的编程考试题目。需要确保题目既考察理论理解,又考察实际编程能力。以下设计思路:###设计原则1.**难度梯度**:从基础到进阶2.**知识点覆盖**:包括数据预处理、模型训练、评估、调参等3.**编程能力**:要求使用常见库(如scikit-learn)实现4.**问题类型**:可包含代码填空、完整编程、结果分析等###题目示例####第一部分:线性回归(基础)**题目1:简单线性回归实现**给定数据集`data1.csv`,包含两列:`x`(特征)和`y`(目标)。要求:1.使用`pandas`读取数据,并划分特征和目标变量2.使用`scikit-learn`的`LinearRegression`训练模型3.输出模型系数和截距4.计算模型在训练集上的均方误差(MSE)**代码框架(供学生填空)**:```pythonimportpandasaspdfromsklearn.linear_modelimportLinearRegressionfromsklearn.metricsimportmean_squared_error#读取数据data=pd.read_csv('data1.csv')X=data[['x']]#特征矩阵y=data['y']#目标向量#创建模型并训练model=________()#填空1:初始化线性回归模型________(X,y)#填空2:训练模型#输出参数print("系数:",model.________)#填空3:获取系数print("截距:",model.________)#填空4:获取截距#预测并计算MSEy_pred=________(X)#填空5:使用模型预测mse=________(y,y_pred)#填空6:计算MSEprint("MSE:",mse)```####第二部分:支持向量机(进阶)**题目2:SVM分类器调参**给定数据集`data2.csv`,包含三列:`feature1`,`feature2`(特征)和`label`(标签,取0或1)。要求:1.划分训练集和测试集(比例70:30)2.使用`SVC`(支持向量分类)训练模型3.尝试不同核函数(线性、多项式、RBF)并比较准确率4.对RBF核进行网格搜索调优(参数:`C`和`gamma`)**完整编程题(学生需独立编写)**:```python#学生需完整编写以下代码importpandasaspdfromsklearn.model_selectionimport________#导入训练集测试集划分函数fromsklearn.svmimport________#导入SVCfromsklearn.metricsimport________#导入准确率计算函数#步骤1:读取数据并划分data=pd.read_csv('data2.csv')X=data[['feature1','feature2']]y=data['label']X_train,X_test,y_train,y_test=________(X,y,test_size=0.3,random_state=42)#划分#步骤2:比较不同核函数kernels=['linear','poly','rbf']forkernelinkernels:model=________(kernel=kernel)#创建SVC模型________(X_train,y_train)#训练y_pred=________(X_test)#预测acc=________(y_test,y_pred)#计算准确率print(f"核函数{kernel}的准确率:{acc:.4f}")#步骤3:网格搜索调优(仅针对RBF核)fromsklearn.model_selectionimportGridSearchCVparam_grid={'C':[0.1,1,10,100],'gamma':[0.01,0.1,1,10]}grid_search=________(________(kernel='rbf'),param_grid,cv=5)#创建网格搜索对象grid_search.________(X_train,y_train)#执行搜索print("最佳参数:",grid_search.________)#输出最佳参数print("最佳准确率:",grid_search.________)#输出最佳准确率```####第三部分:综合应用**题目3:房价预测(线性回归与SVM回归对比)**给定房价数据集`house_price.csv`,包含多个特征(如面积、卧室数等)和房价目标。要求:1.数据预处理:处理缺失值、标准化数值特征2.分别用线性回归和SVM回归(`SVR`)训练模型3.使用交叉验证比较两个模型的平均MSE4.分析哪个模型更适合该数据集**分析题(需编写代码并回答分析问题)**:```python#学生需编写完整代码并回答问题importpandasaspdfromsklearn.linear_modelimportLinearRegressionfromsklearn.svmimportSVRfromsklearn.model_selectionimportcross_val_scorefromsklearn.preprocessingimportStandardScalerfromsklearn.imputeimportSimpleImputerfromsklearn.pipelineimportmake_pipeline#读取数据data=pd.read_csv('house_price.csv')X=data.drop('price',axis=1)y=data['price']#创建预处理和模型管道#线性回归管道pipe_lr=make_pipeline(SimpleImputer(strategy='mean'),StandardScaler(),LinearRegression())#SVM回归管道(使用RBF核)pipe_svr=make_pipeline(SimpleImputer(strategy='mean'),StandardScaler(),SVR(kernel='rbf',C=1.0,epsilon=0.1))#交叉验证比较scores_lr=cross_val_score(pipe_lr,X,y,scoring='neg_mean_squared_error',cv=5)scores_svr=cross_val_score(pipe_svr,X,y,scoring='neg_mean_squared_error',cv=5)#输出平均MSE(注意负号)print("线性回归平均MSE:",-scores_lr.mean())print("SVM回归平均MSE:",-scores_svr.mean())#问题:哪个模型表现更好?为什么?```###参考答案设计为每个题目提供参考答案(供评分使用),例如:-**题目1填空**:1.`LinearRegression`2.`model.fit`3.`coef_`4.`intercept_`5.`model.predict`6.`mean_squared_error`###评分标准-代码正确性(能否运行)-结果准确性(输出值符合预期)-代码规范性(可读性)###考试建议-提供数据集(小型、无噪声)-限制时间(如2小时)-允许查阅API文档§§相关问题§§1.如何为SVM题目设计合适的数据集?2.线性回归题目中如何增加难度(如加入正则化)?3.如何评估学生在SVM调参题目中的表现?4.在综合题中,如何设计分析问题的评分标准?</think>### 支持向量机与线性回归编程考试题目设计指南 #### 一、设计原则 1. **梯度难度设置**:基础题→综合题→开放题 2. **知识点覆盖**: - SVM:分类/回归、核函数选择、超参数调优 - 线性回归:最小二乘法、正则化、评估指标 3. **能力维度**: ```mermaid graph LR A[代码实现]-->B[模型调优] B-->C[结果分析] C-->D[理论理解] ``` #### 二、题目设计示例 **题目1:基础实现题(30分)** 给定糖尿病数据集`diabetes.csv`: ```python from sklearn.datasets import load_diabetes data = load_diabetes() X, y = data.data, data.target ``` 要求: 1. 使用线性回归预测疾病进展 2. 实现SVM分类(将y离散化为三等分) 3. 输出线性回归的$R^2$和SVM的准确率 **参考答案要点:** ```python # 线性回归部分 from sklearn.linear_model import LinearRegression reg = LinearRegression().fit(X_train, y_train) print(f"R²: {reg.score(X_test, y_test):.3f}") # SVM分类部分 from sklearn.svm import SVC y_class = pd.qcut(y, 3, labels=False) # 三等分离散化 clf = SVC(kernel='rbf').fit(X_train, y_class_train) print(f"Accuracy: {clf.score(X_test, y_class_test):.2f}") ``` **题目2:模型调优题(40分)** 对波士顿房价数据集: ```python from sklearn.datasets import fetch_california_housing housing = fetch_california_housing() ``` 要求: 1. 对比线性回归、岭回归、SVM回归性能 2. 使用网格搜索优化SVM超参数$(C, \gamma)$ 3. 分析不同核函数(linear/rbf/poly)的影响 **评分标准:** | 项目 | 分值 | |-------|------| | 正确实现交叉验证 | 10 | | 合理的参数网格设计 | 10 | | 性能对比可视化(箱线图) | 10 | | 核函数影响分析结论 | 10 | **题目3:开放分析题(30分)** 给定模拟数据生成代码: ```python import numpy as np X = np.random.randn(500, 10) y = X @ np.array([1,0,0,2,0,-1,0,0,3,0]) + 0.5*np.random.randn(500) # 稀疏特征 ``` 问题: 1. 比较线性回归、Lasso、SVM回归的表现 2. 解释为什么SVM在$\epsilon=0.1$时效果最佳? 3. 当特征维度增加到100维时,哪种方法最鲁棒? **期望分析点:** - Lasso的稀疏特征选择能力(参考系数收缩效应) - SVM的$\epsilon$-不敏感损失函数优势[^2] - 维数灾难下核方法的稳定性[^3] #### 三、数据设计技巧 1. **SVM友好数据**: - 分类:使用`make_moons`生成非线性数据 ```python from sklearn.datasets import make_moons X, y = make_moons(noise=0.15, random_state=42) ``` - 回归:构造周期函数数据 ```python X = np.sort(5*np.random.rand(100)) y = np.sin(X) + 0.2*np.random.randn(100) ``` 2. **陷阱数据**: - 高相关特征(考验多重共线性处理) - 离群点(测试模型鲁棒性) #### 四、评分建议 1. **自动化评分脚本**: ```python def autograde(student_code): # 验证关键输出结果 assert 0.4 < student_code.r2_score < 0.6 assert student_code.svm_accuracy > 0.85 ``` 2. **人工评分维度**: - 代码规范性(PEP8) - 异常处理完整性 - 分析深度(如理解$C$对间隔和误差的权衡[^1]) > **最佳实践**:提供部分代码框架,聚焦核心知识点考察。例如给出数据加载和预处理代码,要求学生补充模型实现和分析部分。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值