SVM 数据分类肿瘤数据

1.数据来源

        本文中数据来源是一组肿瘤数据分为良性(B)和恶性(M),数据内容大概如下

 

2.环境

编程语言:Python

主要库:scikit-learn, pandas

  1. pandas
    • 功能: 用于数据处理和分析。
    • 作用: 通过 pd.read_excel 读取 Excel 文件中的数据,并使用 DataFrame 进行数据处理和切片。
  2. scikit-learn
    • 功能: 提供了各种机器学习算法和工具。
    • 作用: 使用 train_test_split 函数划分训练集和测试集,导入了 SVC(Support Vector Classification)模型用于构建支持向量机分类器,同时使用了准确度、灵敏度、特效性等性能评估指标。

3.代码实现:

  • 导入库:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, recall_score, precision_score

        pandas:用于数据处理和读取Excel文件。

        train_test_split:用于划分训练集和测试集。

        SVC:支持向量机的实现,用于构建分类模型。

        accuracy_score、recall_score、precision_score:用于评估模型性能的指标。

  • 读取数据集:
读取 Excel 文件

data = pd.read_excel(r'C:\Users\86132\Downloads\分类作业数据集.xlsx')

        通过pandas读取Excel文件,获取数据集。(记得路径替代成自己的文件路径)

  • 划分训练集和测试集:
# 划分训练集和测试集

train_data, test_data = train_test_split(data, test_size=0.4, random_state=42)

        使用train_test_split函数将数据集划分为训练集和测试集,其中40%的数据用于测试,random_state用于保证划分的随机性可重现。

  • 提取特征和标签:
# 提取特征和标签

X_train = train_data.drop(['ID', '类型'], axis=1)

y_train = train_data['类型']

X_test = test_data.drop(['ID', '类型'], axis=1)

y_test = test_data['类型']

        从数据集中提取特征(X_trainX_test)和标签(y_trainy_test)。

  • 构建SVM模型:
 model = SVC(kernel=kernel)

# 在训练集上训练模型

model.fit(X_train, y_train)



# 在测试集上进行预测

y_pred = model.predict(X_test)



# 计算准确度、灵敏度和特效性

accuracy = accuracy_score(y_test, y_pred)

recall = recall_score(y_test, y_pred, pos_label='B')

precision = precision_score(y_test, y_pred, pos_label='B')

        通过循环尝试不同的核函数(线性、多项式、径向基核),创建SVC模型并在训练集上进行训练。使用训练好的模型在测试集上进行预测,并计算准确度、灵敏度和特效性

        Linear Kernel(线性核函数):

        'linear' 表示线性核函数。

        公式:

        线性核函数在原始特征空间中进行计算,适用于线性可分的数据集。当数据集在原始特征空间中是线性可分的时候,使用线性核函数是一个简单而有效的选择。

        Polynomial Kernel(多项式核函数):

        'poly' 表示多项式核函数。

        公式:​

​​​​​​

        多项式核函数引入了多项式的概念,通过升高特征到更高次数的映射,使得模型能够处理非线性关系。参数 d 表示多项式的次数,参数 r 表示截距项。

        Radial Basis Function (RBF) Kernel(径向基核函数):

        'rbf' 表示径向基核函数。

        公式:

        RBF核函数通过将数据映射到无穷维的特征空间,可以处理更加复杂的非线性关系。参数 γ 控制了RBF核函数的宽度,较小的 γ 会使得决策边界更加平滑,较大的 γ 会使得决策边界更加关注单个数据点。

4.数据处理与分析 

        当类型B为正类别时 

 

线性核函数:

        准确度(Accuracy):约为 93.86%。这表示模型在整个数据集上正确预测的样本比例较高。

        灵敏度(Recall):约为 95.95%。这表示模型对于 'B' 类别(良性肿瘤)的识别能力较高。

        特效性(Precision):约为 94.67%。这表示模型在预测为 'B' 类别时的准确性较高。

多项式核函数:

        准确度:约为 89.91%。这表示模型整体性能较好,但相较于线性核函数稍有下降。

        灵敏度:约为 100%。这表示模型对于 'B' 类别的识别能力很强,但也可能因为过度关注灵敏度而降低了特效性。

        特效性:约为 86.55%。这表示在预测为 'B' 类别时的准确性较高,但相较于线性核函数略有下降。

RBF 核函数:

        准确度:约为 89.91%。与多项式核函数相似,整体性能较好。

        灵敏度:约为 100%。与多项式核函数相同,对于 'B' 类别的识别能力很强。

        特效性:约为 86.55%。与多项式核函数相同,对于预测为 'B' 类别的准确性较高。

        当类型M为正类别时

 

线性核函数:

        准确度(Accuracy):约为 93.86%。这表示模型在整个数据集上正确预测的样本比例较高。

        灵敏度(Recall):约为 90%。这表示模型对于 "M" 类别(恶性肿瘤)的识别能力较高。

        特效性(Precision):约为 92.31%。这表示模型在预测为 "M" 类别时的准确性较高。

多项式核函数:

        准确度:约为 89.91%。这表示模型整体性能较好,但相较于线性核函数稍有下降。

        灵敏度:约为 71.25%。这表示模型对于 "M" 类别的识别能力下降,可能对恶性肿瘤的检测不够敏感。

        特效性:约为 100%。这表示在预测为 "M" 类别时的准确性很高,但也可能因为特别看重特效性而忽略了一些真正例。

RBF 核函数:

        准确度:约为 89.91%。与多项式核函数相似,整体性能较好。

        灵敏度:约为 71.25%。与多项式核函数相同,可能对 "M" 类别的识别不够敏感。

        特效性:约为 100%。与多项式核函数相同,对于预测为 "M" 类别的准确性较高。

5.代码 

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, recall_score, precision_score

# 读取 Excel 文件
data = pd.read_excel(r'C:\Users\86132\Downloads\分类作业数据集.xlsx')

# 划分训练集和测试集
train_data, test_data = train_test_split(data, test_size=0.4, random_state=42)

# 提取特征和标签
X_train = train_data.drop(['ID', '类型'], axis=1)
y_train = train_data['类型']
X_test = test_data.drop(['ID', '类型'], axis=1)
y_test = test_data['类型']

# 定义三种核函数的SVM模型
kernels = ['linear', 'poly', 'rbf']  # 可以添加其他核函数

for kernel in kernels:
    # 创建SVM模型
    model = SVC(kernel=kernel)

    # 在训练集上训练模型
    model.fit(X_train, y_train)

    # 在测试集上进行预测
    y_pred = model.predict(X_test)

    # 计算准确度、灵敏度和特效性
    accuracy = accuracy_score(y_test, y_pred)
    recall = recall_score(y_test, y_pred, pos_label='M')
    precision = precision_score(y_test, y_pred, pos_label='M')

    # 打印结果
    print(f"核函数: {kernel}")
    print(f"准确度: {accuracy}")
    print(f"灵敏度: {recall}")
    print(f"特效性: {precision}")
    print("\n")

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值