解题思路
使用scikit−learn中的Pipeline把StandardScaler和线性SVM组合起来,保证交叉验证时每一折都只在当前训练折上进行标准化拟合,避免数据泄漏。
核心步骤如下:
- 将训练数据拆分为特征X和标签y。
- 使用StandardScaler进行特征标准化。
- 使用SVC,固定kernel="linear",randomstate=42。
P4976.第3题-SVM网格搜索
题目内容
请在仅依赖 numpy / pandas / scikit-learn 的前提下,实现一个线性支持向量机(SVM)分类器,并通过 Stratified 3-Fold 交叉验证 + 网格搜索自动选择最佳惩罚系数 C。完成后对给定测试样本输出类别预测。
- 读取数据
- train:二维列表,最后一列为标签 y∈{0,1},前 m 列为数值特征。
- test:二维列表,仅包含特征(与训练集同维度)。
- 建模管线
- 预处理:StandardScaler(仅在训练集 fit,再 transform)。
- 基础模型使用 SVC,参数固定值:kernel = "linear", random_state = 42。
- 网格:C∈{0.1,1.0,10.0}。
- Stratified 3-Fold 交叉验证参数固定值:n_splits = 3,shuffle = True,random_state = 42。
- 评估指标:scoring = "accuracy"。
- 使用 GridSearchCV 组合以上要素;当多组参数获得相同最高分,GridSearchCV 会按参数字典序选择最先出现的那组(即较小的 C 值)。
-
模型训练与预测
在完整训练集上用最佳参数 refit = True 重新训练;对 test 直接预测得到标签序列。
-
结果输出
仅输出 test 部分的预测标签(0 / 1)。
输入描述
第一行输入两个整数 n,m(20≤n≤200,2≤m≤10),分别表示训练样本数和特征维度。
接下来 n 行,每行包含 m+1 个浮点数,前 m 个为特征,最后一个为整数标签 y∈{0,1}。
接下来一行输入一个整数 q(1≤q≤100),表示测试样本数。
接下来 q 行,每行包含 m 个浮点数,表示一个测试样本的特征。
输出描述
输出 q 行,每行一个整数(0 或 1),表示对应测试样本的预测标签。
样例1
输入
20 2
-1.20 -0.40 0
-0.80 -1.10 0
-1.30 -0.90 0
-0.70 -0.60 0
-1.50 -0.30 0
-0.90 -1.40 0
-0.50 -0.80 0
-1.10 -0.20 0
-0.60 -1.30 0
-1.40 -0.70 0
1.20 0.40 1
0.80 1.10 1
1.30 0.90 1
0.70 0.60 1
1.50 0.30 1
0.90 1.40 1
0.50 0.80 1
1.10 0.20 1
0.60 1.30 1
1.40 0.70 1
3
1.00 1.00
-1.00 -1.00
0.50 0.50
输出
1
0
1
说明
训练集共 20 个样本,前 10 个标签为 0 分布在第三象限,后 10 个标签为 1 分布在第一象限。经 GridSearchCV 在 C∈{0.1,1.0,10.0} 中网格搜索后选出最佳 C,对测试集预测:第 1 个样本 (1.00,1.00) 落在正类区域得到 1;第 2 个样本 (−1.00,−1.00) 落在负类区域得到 0;第 3 个样本 (0.50,0.50) 距离决策超平面靠近正类侧得到 1。