sklearn机器学习实战——基于AdaBoost完成乳腺癌分类(附完整代码和结果图)

sklearn机器学习实战——基于AdaBoost完成乳腺癌分类(附完整代码和结果图)


关于作者


作者:小白熊

作者简介:精通python、matlab、c#语言,擅长机器学习,深度学习,机器视觉,目标检测,图像分类,姿态识别,语义分割,路径规划,智能优化算法,数据分析,各类创新融合等等。

联系邮箱:xbx3144@163.com

科研辅导、知识付费答疑、个性化定制以及其他合作需求请联系作者~



一、前言

  在这篇博文中,我们将探讨如何使用机器学习中的集成学习算法——AdaBoost来构建一个分类模型,应用于乳腺癌数据集。我们将介绍从数据预处理到模型评估的各个步骤。

  AdaBoost(Adaptive Boosting)是一种基于Boosting思想的集成学习算法。Boosting通过将多个弱分类器(比如决策树桩)结合起来,形成一个强大的分类器。每个分类器在数据上进行训练时,关注那些之前被误分类的数据点。其核心思想是通过调整样本权重来增强模型的学习能力。AdaBoost的优点在于不容易过拟合且性能优异,尤其适用于中小型数据集。

机器学习



二、乳腺癌数据集

  在本文的实验中,我们使用了scikit-learn库中广泛使用的乳腺癌数据集(Breast Cancer Dataset)。这个数据集的全称是Wisconsin Breast Cancer Dataset,是一个经过整理的二分类数据集,主要用于肿瘤良恶性的预测。Wisconsin乳腺癌数据集是一个经典的医学数据集,最早由威斯康辛大学的医生和研究人员收集并发布。该数据集记录了患者肿瘤细胞核的特征,用于预测肿瘤是良性还是恶性。这对临床诊断具有重要意义,因为准确区分肿瘤的类型能够帮助医生采取合适的治疗方案。

  该数据集包含了569个样本,每个样本对应一个病人的肿瘤细胞核图像。每个样本有30个特征,这些特征是通过图像分析技术提取的,分别描述了肿瘤细胞核的几何形状、纹理、大小等特性。目标是预测肿瘤是良性(0)还是恶性(1)。

from sklearn.datasets import load_breast_cancer
import pandas as pd

data = load_breast_cancer()
df = pd.DataFrame(data.data, columns=data.feature_names)
df['Target'] = data.target



三、数据预处理

  在构建机器学习模型前,我们需要对数据进行预处理。包括缺失值检测数据标准化等步骤。

# 检测缺失值
missing_values = df.isnull().sum()
print("缺失值检测结果:\n", missing_values)

  该数据集中没有缺失值,因此可以直接使用。

  为了使不同量纲的特征对模型的影响均衡,我们对特征数据进行标准化处理。这将确保数据的均值为0,方差为1。

from sklearn.preprocessing import StandardScaler

X = df.drop('Target', axis=1)
y = df['Target']
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)



四、划分训练集和验证集

  使用train_test_split函数将数据集划分为训练集验证集,其中验证集占20%。

from sklearn.model_selection import train_test_split

X_train, X_val, y_train, y_val = train_test_split(X_scaled, y, test_size=0.2, random_state=42)



五、构建模型

  我们使用AdaBoostClassifier作为分类器。通过KFold进行十折交叉验证,以评估模型的稳定性和泛化能力。

from sklearn.ensemble import AdaBoostClassifier
from sklearn.model_selection import KFold, cross_val_score

model = AdaBoostClassifier()
kf = KFold(n_splits=10, shuffle=True, random_state=42)
cv_scores = cross_val_score(model, X_train, y_train, cv=kf, scoring='accuracy')
print(f"平均准确率: {np.mean(cv_scores)}")

  交叉验证可以避免因数据划分不同而导致模型评估不一致的问题,是评估模型稳定性的一种常用方法。



六、模型训练与预测

  模型训练完成之后,利用训练好的模型对验证集进行预测,并计算混淆矩阵以及各类评估指标。

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

# 模型预测
y_val_pred = model.predict(X_val)



七、模型评估

  为了全面评估模型的性能,我们计算了准确率精确率召回率F1分数等指标,并绘制了混淆矩阵

from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix

accuracy_val = accuracy_score(y_val, y_val_pred)
precision_val = precision_score(y_val, y_val_pred, average='weighted')
recall_val = recall_score(y_val, y_val_pred, average='weighted')
f1_val = f1_score(y_val, y_val_pred, average='weighted')

print(f"准确率: {accuracy_val}")
print(f"精确率: {precision_val}")
print(f"召回率: {recall_val}")
print(f"F1分数: {f1_val}")

通过这些指标,我们可以从不同角度衡量模型的表现。其中:

  • 准确率表示所有预测中,预测正确的比例。
  • 精确率表示所有被预测为正类的样本中,实际为正类的比例。
  • 召回率则表示所有实际为正类的样本中,被正确预测为正类的比例。
  • F1分数是精确率和召回率的调和平均数,平衡了二者之间的关系。

此外,通过绘制混淆矩阵,我们可以直观地看到模型在分类中的表现,包括预测正确和错误的样本数。

import seaborn as sns
import matplotlib.pyplot as plt

conf_matrix = confusion_matrix(y_val, y_val_pred)
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=data.target_names, yticklabels=data.target_names)
plt.title(f'混淆矩阵')
plt.xlabel("预测值")
plt.ylabel("真实值")
plt.show()

混淆矩阵



八、完整代码

import numpy as np
import pandas as pd
from sklearn.ensemble import AdaBoostClassifier
from sklearn.model_selection import train_test_split, cross_val_score, KFold
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix
import seaborn as sns
from sklearn.datasets import load_breast_cancer
import matplotlib.pyplot as plt
import warnings

warnings.filterwarnings("ignore")

# 设置中文字体为SimHei
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False


# 加载数据集
data = load_breast_cancer()

# 数据转换
df = pd.DataFrame(data.data, columns=data.feature_names)
df['Target'] = data.target

# 缺失值检测
missing_values = df.isnull().sum()
print("缺失值检测结果:\n", missing_values)

# 数据提取
X = df.drop('Target', axis=1)
y = df['Target']

# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 划分训练集和验证集
X_train, X_val, y_train, y_val = train_test_split(X_scaled, y, test_size=0.2, random_state=42)

# 构建模型
model = AdaBoostClassifier()

# 十折交叉验证
kf = KFold(n_splits=10, shuffle=True, random_state=42)

cv_scores = cross_val_score(model, X_train, y_train, cv=kf, scoring='accuracy')
print(f"平均准确率: {np.mean(cv_scores)}")

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

# 模型预测
y_val_pred = model.predict(X_val)

# 计算混淆矩阵
conf_matrix = confusion_matrix(y_val, y_val_pred)

# 计算分类评估指标
accuracy_val = accuracy_score(y_val, y_val_pred)
precision_val = precision_score(y_val, y_val_pred, average='weighted')
recall_val = recall_score(y_val, y_val_pred, average='weighted')
f1_val = f1_score(y_val, y_val_pred, average='weighted')


print(f"准确率: {accuracy_val}")
print(f"精确率: {precision_val}")
print(f"召回率: {recall_val}")
print(f"F1分数: {f1_val}")

# 可视化混淆矩阵
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=data.target_names, yticklabels=data.target_names)
plt.title(f'混淆矩阵')
plt.xlabel("预测值")
plt.ylabel("真实值")
plt.show()



九、总结

  在本次实验中,我们使用AdaBoost算法成功地构建了一个乳腺癌分类器,并通过多种指标对模型的性能进行了评估。AdaBoost通过组合多个弱分类器来提高整体模型的预测能力,展示了其强大的分类效果。

  最终,得益于良好的数据处理和交叉验证,模型的平均准确率达到了较高水平,并且在验证集中也表现出了良好的性能。混淆矩阵可视化进一步帮助我们了解模型在具体分类任务中的表现。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白熊_XBX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值