1.数据来源
本文中数据来源是一组肿瘤数据分为良性(B)和恶性(M),数据内容大概如下
2.环境
编程语言:Python
主要库:scikit-learn, pandas
- pandas:
- 功能: 用于数据处理和分析。
- 作用: 通过 pd.read_excel 读取 Excel 文件中的数据,并使用 DataFrame 进行数据处理和切片。
- 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_train和X_test)和标签(y_train和y_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")