头歌·机器学习第2关线性支持向量机

任务描述
本关任务:使用sklearn实现线性支持向量机,并通过癌细胞数据中训练集对模型进行训练,再对测试集癌细胞数据进行识别。

相关知识
为了完成本关任务,你需要掌握:1.软间隔,2.LinearSVC。

数据集介绍
乳腺癌数据集,其实例数量是569,实例中包括诊断类和属性,帮助预测的属性一共30个,各属性包括为radius 半径(从中心到边缘上点的距离的平均值),texture 纹理(灰度值的标准偏差)等等,类包括:WDBC-Malignant 恶性和 WDBC-Benign 良性。用数据集的80%作为训练集,数据集的20%作为测试集,训练集和测试集中都包括特征和诊断类。

想要使用该数据集可以使用如下代码:

import pandas as pd
#获取训练数据
train_data = pd.read_csv('./step1/train_data.csv')
#获取训练标签
train_label = pd.read_csv('./step1/train_label.csv')
train_label = train_label['target']
#获取测试数据
test_data = pd.read_csv('./step1/test_data.csv')

#encoding=utf8
from sklearn.svm import LinearSVC

def linearsvc_predict(train_data,train_label,test_data):
    '''
    input:train_data(ndarray):训练数据
          train_label(ndarray):训练标签
    output:predict(ndarray):测试集预测标签
    '''
    #********* Begin *********# 
    clf = LinearSVC(dual=False)
    clf.fit(train_data,train_label)
    predict = clf.predict(test_data)

    #********* End *********# 
    return predict

### 线性可分支持向量机 SVM 的理论基础 线性可分支持向量机是一种用于二分类问题的监督学习方法,其目标是在特征空间中找到一个最佳的超平面来分割两类数据点。该超平面对应于最大化类别间间隔的同时最小化错误率。 #### 数据表示与假设条件 对于给定的训练集 \( T=\{(x_1, y_1), (x_2, y_2), \ldots, (x_N, y_N)\} \),其中 \( x_i \in X \subseteq R^n \) 表示第 i 个样本的特征向量,\( y_i \in Y =\{-1, +1\}\) 是对应的标签[^2]。假定这些数据线性意义上是可以完全分开的,则存在一个超平面能够将正类 (\(y_i=+1\)) 和负类 (\(y_i=-1\)) 完全区分开。 #### 构造优化问题 为了寻找这个最优超平面,需解决如下约束最优化问题: \[ \min_{w,b} \frac{1}{2} ||w||^2 \] 受制于以下不等式约束: \[ y_i(w^\top x_i+b) \geqslant 1,\quad i=1,...,N. \] 这里的目标是最小化权重向量 w 的 L2 范数平方的一半,这相当于最大化两个最近的数据点到超平面的距离(即所谓的“间隔”),从而提高泛化能力。 #### 解决过程概述 上述二次规划可以通过引入拉格朗日乘子法转化为对偶形式求解。最终得到的支持向量仅由那些使得 α>0 的样本决定,其余样本不影响最后的结果。 ### Python 实现方式 基于 Scikit-Learn 库可以非常方便地构建和支持向量机模型。以下是具体代码展示如何创建练一个简单的线性 SVC 模型: ```python from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.svm import LinearSVC # 加载鸢尾花数据集作为例子 iris = datasets.load_iris() X = iris.data[:, :2] # 只取前两维便于可视化 y = iris.target # 过滤成只有两种类型的简单情况 X = X[y != 2] y = y[y != 2] # 划分训练集测试集 X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.3, random_state=42) scaler = StandardScaler().fit(X_train) X_train_std = scaler.transform(X_train) X_test_std = scaler.transform(X_test) svc_model = LinearSVC(C=1.0, loss="hinge", max_iter=5000) svc_model.fit(X_train_std, y_train) print(f'Accuracy on the training subset: {svc_model.score(X_train_std, y_train):.3f}') print(f'Accuracy on the testing subset: {svc_model.score(X_test_std, y_test):.3f}') ``` 此脚本展示了标准流程:加载数据 -> 预处理标准化 -> 建立模型 -> 练评估性能[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值