基于乳腺癌的预测(SVM实战项目)
2024.2.26
今天,我在学习机器学习重要的知识点——SVM(支持向量机)
首先,我利用sklearn库中自带的数据集练手
点击查看代码
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.decomposition import PCA
from sklearn.metrics import classification_report, confusion_matrix
为了获取到数据集中的大概信息,利用cancer.key()函数获取数据集中的键列表,包括dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename', 'data_module'])
然后利用pd.DataFrame()函数将cancer['data']中的数据转化为DataFrame格式,指定列名,并查看一部分数据,检查缺失值
点击查看代码
cancer = load_breast_cancer()
print(cancer.keys())
df_feat = pd.DataFrame(cancer['data'],columns=cancer['feature_names'])
df_feat.info
df_feat.isnull().sum()
接下来,将特征数据存储在x中,将target标签存储在y中
df_feat 是一个 DataFrame,包含了 breast cancer 数据集中的特征数据。
cancer['target'] 包含了 breast cancer 数据集中每个样本的标签,即目标变量,通常用来表示肿瘤是良性(benign)还是恶性(malignant)。
今天新学到了train_test_split()函数,将数据集分割成训练集和测试集。为了保证结果的可复现性,这里设置了随机种子random_state,以确保每次运行时分割结果的一致性
为了对分类模型进行合理评估,引入一些评估指标,以本数据集为例:
Precision(精确率):指的是预测为正类别的样本中,有多少比例是真正的正类别。对于类别 0 和 1,分别为 0.98 和 0.96。这意味着对于被预测为类别 0 的样本,有 98% 是真正的类别 0;对于被预测为类别 1 的样本,有 96% 是真正的类别 1。
Recall(召回率):指的是真正的正类别样本中,有多少比例被预测为正类别。对于类别 0 和 1,分别为 0.93 和 0.99。这意味着在所有实际为类别 0 的样本中,有 93% 被正确地预测为类别 0;在所有实际为类别 1 的样本中,有 99% 被正确地预测为类别 1。
F1-score(F1 值):精确率和召回率的调和平均数,它综合考虑了模型的准确性和召回率。对于类别 0 和 1,分别为 0.96 和 0.97。
Support(支持数):指的是在测试集中每个类别的样本数量。对于类别 0 和 1,分别为 46 和 68。
Accuracy(准确率):指的是模型在整个测试集上的分类准确率,即正确分类的样本数占总样本数的比例。在这个报告中,准确率为 0.96,意味着模型正确分类了 96% 的样本。
Macro average(宏平均):对所有类别的精确率、召回率和 F1 值取平均。在这个报告中,宏平均精确率、召回率和 F1 值均为 0.97。
Weighted average(加权平均):对所有类别的精确率、召回率和 F1 值进行加权平均,其中权重是每个类别在测试集中的样本数量占总样本数量的比例。在这个报告中,加权平均精确率、召回率和 F1 值均为 0.97。
接着,建立一个分类器SVC,然后将训练数据x_train,y_train喂给模型,最后用测试机x_test预测,将混淆矩阵打印输出,并打印一份该分类器的性能分析:
点击查看代码
model = SVC()
model.fit(x_train, y_train)
predicted_result = model.predict(x_test)
print(confusion_matrix(y_test, predicted_result))
print(classification_report(y_test, predicted_result))
利用PCA(主成分分析),对该数据集进行降维,指定只要两个特征数据;对特征数据 df_feat 进行 PCA 拟合,以找到最佳的主成分(即特征的线性组合),从而实现降维。使用拟合好的 PCA 模型将原始特征数据转换为新的二维特征空间。转换后的结果保存在 xx 变量中。
点击查看代码
pca = PCA(n_components=2)
pca.fit(df_feat)
xx = pca.transform(df_feat)
xx
使用 train_test_split() 函数将经过 PCA 降维后的特征数据 xx 以及目标数据 y 分割成训练集和测试集。
创建了一个支持向量机(SVM)分类器模型 model。
使用训练集数据 x_train 和 y_train 对 SVM 模型进行训练,即调用 model.fit(x_train, y_train) 方法。
使用训练好的模型对测试集数据 x_test 进行预测,得到预测结果 predicted_result。
点击查看代码
x_train, x_test, y_train, y_test = train_test_split(xx, y, test_size=0.2, random_state=666)
model = SVC()
model.fit(x_train, y_train)
predicted_result = model.predict(x_test)
print(confusion_matrix(y_test, predicted_result))
print(classification_report(y_test, predicted_result))
网格搜索(GridSearchCV)
定义了一个网格搜索的参数空间 tuned_parameters,用于寻找支持向量机(SVM)模型的最佳超参数组合。具体来说,参数空间包括了以下参数组合:
'kernel': SVM 核函数的选择,包括 'rbf' 和 'linear' 两种。
'gamma': 核函数的系数,控制模型的复杂度。
'C': SVM 惩罚参数,控制分类间隔的大小。
这段代码中给出了两个参数组合的列表,每个参数组合都是一个字典,包含了 'kernel'、'gamma' 和 'C' 这三个超参数的不同取值。第一个参数组合是针对 'rbf' 和 'linear' 两种核函数的不同组合。
通过网格搜索,可以在给定的参数空间中尝试所有可能的参数组合,并通过交叉验证来评估每个参数组合的性能,最终选择出最佳的超参数组合。
点击查看代码
from sklearn.model_selection import GridSearchCV
tuned_parameters = [
{
'kernel':['rbf', 'linear'],
'gamma':[1e-3,1e-4,1e-5],
'C':[1,10,100,1000]
},
]
scores = ['prediction', 'recall']
svc = SVC()
grid_search = GridSearchCV(svc, tuned_parameters, n_jobs=-1,verbose=2)
grid_search.fit(xx,y)
最后输出最佳参数和评分:
点击查看代码
grid_search.best_params_
grid_search.best_score_
{'C': 1, 'gamma': 0.0001, 'kernel': 'rbf'}
0.927930445582984
tuned_parameters
当我们使用网格搜索(Grid Search)时,我们希望通过在预定义的参数空间中尝试不同的参数组合来找到模型的最佳超参数。tuned_parameters 就是用来定义这个参数空间的。
让我详细解释一下 tuned_parameters 中的每个部分:
'kernel': 这是支持向量机(SVM)模型中的一个重要参数,它定义了 SVM 中所使用的核函数。在这个参数空间中,我们尝试了 'rbf' 和 'linear' 两种核函数。
'gamma': 这是 SVM 模型中核函数的系数,它控制着模型的复杂度。gamma 的值越大,模型越复杂,可能会导致过拟合。在这个参数空间中,我们尝试了三个不同的 gamma 值:1e-3、1e-4 和 1e-5。
'C': 这是 SVM 中的惩罚参数,它控制着分类间隔的大小。C 的值越大,分类器将会尝试更好地拟合训练数据,可能导致过拟合。在这个参数空间中,我们尝试了四个不同的 C 值:1、10、100 和 1000。
通过定义这样一个参数空间,我们可以使用网格搜索算法来在这些参数的组合中进行搜索,找到在验证集上性能最优的模型超参数组合。
为了可视化特征之间的相关性,创建了一个热力图
corr = df_feat.corr(): 这一行计算了特征数据 df_feat 中特征之间的相关系数矩阵。
plt.figure(figsize=(29,29)): 这一行创建了一个新的图形,并指定了图形的大小为 29x29 英寸。
sns.heatmap(): 这是 Seaborn 库中用于绘制热力图的函数。它接受许多参数来自定义图形的外观和显示内容。在这里,我们传递了以下参数:
corr: 相关系数矩阵,用于绘制热力图。
cbar=True: 显示颜色条。
square=True: 将图形设置为正方形,使得每个单元格的大小相等。
annot=True: 在每个单元格中显示相关系数的数值。
fmt='.2f': 数值格式,保留两位小数。
annot_kws={'size':15}: 设置注释文本的字体大小为 15。
xticklabels 和 yticklabels: 指定 x 轴和 y 轴刻度的标签,这里使用了 breast cancer 数据集中的特征名。
cmap='coolwarm': 指定颜色映射,这里使用了 'coolwarm' 调色板。
点击查看代码
corr = df_feat.corr()
plt.figure(figsize=(29,29))
sns.heatmap(corr,cbar=True,square=True,annot=True, fmt='.2f',annot_kws={'size':15},
xticklabels=cancer['feature_names'],
yticklabels=cancer['feature_names'],cmap='coolwarm')
之后,我手动删除了一部分特征数据,然后建立新的相关矩阵,并进行可视化。
点击查看代码
df_new = df_feat.drop(['mean perimeter', 'mean area', 'worst radius', 'worst perimeter', 'worst area', 'worst texture', 'mean concave points', 'perimeter error', 'area error', 'fractal dimension error', 'worst concavity', 'worst concave points', 'worst fractal dimension', 'worst smoothness', 'worst compactness'], axis=1)
corr = df_new.corr()
plt.figure(figsize=(15,15))
sns.heatmap(corr, cbar=True, square=True, annot=True, fmt='.2f', annot_kws={'size':15},
xticklabels=list(df_new.columns),
yticklabels=list(df_new.columns), cmap='coolwarm')
最后,利用新的df_new作为x,再此预测y,并给出报告
点击查看代码
x = df_new
y = cancer['target']
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=666)
model = SVC()
model.fit(x_train,y_train)
predicted_result = model.predict(x_test)
print(confusion_matrix(y_test, predicted_result))
print(classification_report(y_test, predicted_result))
[[38 8]
[ 0 68]]
precision recall f1-score support
0 1.00 0.83 0.90 46
1 0.89 1.00 0.94 68
accuracy 0.93 114
macro avg 0.95 0.91 0.92 114
weighted avg 0.94 0.93 0.93 114
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效