逻辑回归-乳腺癌肿瘤预测

embedded/2025/3/4 14:40:17/
  1. 查看数据集基本信息,去掉异常符号。

import numpy as np
import pandas as pd
from sklearn.datasets import load_breast_cancer# 导入乳腺癌肿瘤预测数据集
data = load_breast_cancer()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = pd.Series(data.target, name='target')# 查看数据集基本信息
print("数据集基本信息:")
print(X.info())# 去掉异常符号
X.replace(to_replace='?', value=np.nan, inplace=True)
X.dropna(axis=0, inplace=True)# 打印处理后的数据集基本信息
print("\n处理后的数据集基本信息:")
print(X.info())

输出结果:

  1. 借助LogisticRegression函数和LogisticRegressionCV函数实现回归>逻辑回归

from sklearn.model_selection import train_test_splitfrom sklearn.linear_model import LogisticRegression, LogisticRegressionCVfrom sklearn.metrics import accuracy_score, precision_score, recall_score, precision_recall_curve,f1_score,classification_reportimport warningsfrom sklearn.exceptions import ConvergenceWarning# 忽略收敛警告warnings.filterwarnings("ignore", category=ConvergenceWarning)# 导入乳腺癌肿瘤预测数据集data = load_breast_cancer()X = pd.DataFrame(data.data, columns=data.feature_names)y = pd.Series(data.target, name='target')# 将数据集拆分为训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 初始化LogisticRegression模型并训练lr_model = LogisticRegression()lr_model.fit(X_train, y_train)# 使用测试集进行预测y_pred_lr = lr_model.predict(X_test)# 输出测试数据个数和预测正确个数test_data_count = len(y_test)correct_predictions_lr = accuracy_score(y_test, y_pred_lr, normalize=False)f1_lr = f1_score(y_test, lr_model.predict(X_test))positive_count = pd.Series(y_pred_lr).value_counts()[1]negative_count = pd.Series(y_pred_lr).value_counts()[0]y_true = y_test  # 在实际情况中,这应该是真实的标签# 生成分类报告report = classification_report(y_true, y_pred_lr, target_names=['class 0', 'class 1'], output_dict=True)# 提取加权平均和算数平均weighted_precision_avg = report['weighted avg']['precision']weighted_recall_avg = report['weighted avg']['recall']weighted_f1_avg = report['weighted avg']['f1-score']macro_precision_avg = report['macro avg']['precision']macro_recall_avg = report['macro avg']['recall']macro_f1_avg = report['macro avg']['f1-score']print("Logistic Regression模型:")print(f"测试数据个数: {test_data_count}")print(f"预测正确个数: {correct_predictions_lr}")print(f"权重: {lr_model.coef_}")print(f"预测结果: {y_pred_lr}")print(f"准确率: {accuracy_score(y_test, y_pred_lr)}")print(f"查准率与查重率:      查准率               查全率               F1_score               support")print(f"   良性          {precision_score(y_test, y_pred_lr,pos_label=1)}   ,  {recall_score(y_test, y_pred_lr,pos_label=1)}   ,  {f1_score(y_test, lr_model.predict(X_test),pos_label=1)}  ,   {positive_count}")print(f"   恶性          {precision_score(y_test, y_pred_lr,pos_label=0)}  ,   {recall_score(y_test, y_pred_lr,pos_label=0)}  ,   {f1_score(y_test, lr_model.predict(X_test),pos_label=0)}   ,  {negative_count}")print(f"   accuracy                                                      {recall_score(y_test, y_pred_lr)}   ,  {len(X_test)}")print(f"   macro avg     {macro_precision_avg}   ,  {macro_recall_avg}   ,  {macro_f1_avg}   ,  {len(X_test)}")print(f"weighted avg     {weighted_precision_avg}  ,   {weighted_recall_avg}   ,  {weighted_f1_avg}  ,  {len(X_test)}")# 初始化LogisticRegressionCV模型并训练lrcv_model = LogisticRegressionCV()lrcv_model.fit(X_train, y_train)# 使用测试集进行预测y_pred_lrcv = lrcv_model.predict(X_test)# 输出测试数据个数和预测正确个数correct_predictions_lrcv = accuracy_score(y_test, y_pred_lrcv, normalize=False)correct_predictions_lrcv = accuracy_score(y_test, y_pred_lr, normalize=False)f1_lrcv = f1_score(y_test, lr_model.predict(X_test))positive_count = pd.Series(y_pred_lrcv).value_counts()[1]negative_count = pd.Series(y_pred_lrcv).value_counts()[0]y_true = y_test  # 在实际情况中,这应该是真实的标签# 生成分类报告report = classification_report(y_true, y_pred_lrcv, target_names=['class 0', 'class 1'], output_dict=True)# 提取加权平均和算数平均weighted_precision_avg = report['weighted avg']['precision']weighted_recall_avg = report['weighted avg']['recall']weighted_f1_avg = report['weighted avg']['f1-score']macro_precision_avg = report['macro avg']['precision']macro_recall_avg = report['macro avg']['recall']macro_f1_avg = report['macro avg']['f1-score']print('\n')print("Logistic RegressionCV模型:")print(f"测试数据个数: {test_data_count}")print(f"预测正确个数: {correct_predictions_lrcv}")print(f"权重: {lrcv_model.coef_}")print(f"预测结果: {y_pred_lrcv}")print(f"准确率: {accuracy_score(y_test, y_pred_lrcv)}")print(f"查准率与查重率:      查准率               查全率               F1_score               support")print(f"   良性          {precision_score(y_test, y_pred_lrcv,pos_label=1)}   ,  {recall_score(y_test, y_pred_lrcv,pos_label=1)}   ,  {f1_score(y_test, lrcv_model.predict(X_test),pos_label=1)}  ,   {positive_count}")print(f"   恶性          {precision_score(y_test, y_pred_lrcv,pos_label=0)}  ,                {recall_score(y_test, y_pred_lrcv,pos_label=0)}  ,   {f1_score(y_test, lrcv_model.predict(X_test),pos_label=0)}   ,  {negative_count}")print(f"   accuracy                                                      {recall_score(y_test, y_pred_lr)}   ,  {len(X_test)}")print(f"   macro avg     {macro_precision_avg}   ,  {macro_recall_avg}   ,  {macro_f1_avg}   ,  {len(X_test)}")print(f"weighted avg     {weighted_precision_avg}  ,   {weighted_recall_avg}   ,  {weighted_f1_avg}  ,  {len(X_test)}")

打印测试数据个数和预测正确个数,打印权重、准确率、预测结果和查准率与查重率:

输出结果:

4.使用不同参数C(正则化强度倒数)的LogisticRegression函数进行实验,设置C=0.1和0.01进行实验。

打印结果:

C=0.1

C=0.01

5.绘制ROC曲线:

from sklearn.model_selection import train_test_splitfrom sklearn.linear_model import LogisticRegressionfrom sklearn.metrics import roc_curve, aucimport matplotlib.pyplot as plt# 导入乳腺癌肿瘤预测数据集data = load_breast_cancer()X = pd.DataFrame(data.data, columns=data.feature_names)y = pd.Series(data.target, name='target')# 将数据集拆分为训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 初始化LogisticRegression模型并训练lr_model = LogisticRegression(C=0.1)lr_model.fit(X_train, y_train)# 使用测试集进行预测y_scores = lr_model.decision_function(X_test)# 计算ROC曲线的参数fpr, tpr, thresholds = roc_curve(y_test, y_scores)# 计算AUC(Area Under the Curve)roc_auc = auc(fpr, tpr)# 绘制ROC曲线plt.figure(figsize=(8, 6))plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (area = {:.2f})'.format(roc_auc))plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')plt.xlim([0.0, 1.0])plt.ylim([0.0, 1.05])plt.xlabel('False Positive Rate')plt.ylabel('True Positive Rate')plt.title('Receiver Operating Characteristic (ROC) Curve')plt.legend(loc='lower right')plt.show()

运行结果:

6.进行十折交叉验证。

from sklearn.model_selection import train_test_split,cross_val_scorefrom sklearn.linear_model import LogisticRegressionfrom sklearn.metrics import roc_curve, aucimport warningsfrom sklearn.exceptions import ConvergenceWarning# 忽略收敛警告warnings.filterwarnings("ignore", category=ConvergenceWarning)# 导入乳腺癌肿瘤预测数据集data = load_breast_cancer()X = pd.DataFrame(data.data, columns=data.feature_names)y = pd.Series(data.target, name='target')# 将数据集拆分为训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 初始化LogisticRegression模型并训练lr_model = LogisticRegression(C=0.1)lr_model.fit(X_train, y_train)# 进行十折交叉验证cv_scores = cross_val_score(lr_model, X, y, cv=10, scoring='accuracy')# 输出每折交叉验证的准确率print("每折交叉验证的准确率:")for i, score in enumerate(cv_scores, start=1):print(f"折数 {i}: {score}")# 输出平均准确率print(f"\n平均准确率: {np.mean(cv_scores)}")

运行结果:

从上述实验中我们可以看出,在数据集比较小的时候,LogisticRegression模型的分类效果是比LogisticRegressionCV略好的;正则化参数C=0.1时的模型分类结果要好于C=0.01时的结果。

LogisticRegression 是用于二分类问题的线性模型。它通过使用逻辑函数(sigmoid函数)将线性组合的输入映射到0和1之间的概率。训练时,使用最大似然估计来拟合模型的参数,其中损失函数是对数损失。

LogisticRegressionCV 是在交叉验证的框架下执行对回归>逻辑回归的超参数(正则化强度 C)进行自动调优的类。它通过指定一组 Cs 值(正则化强度的倒数)以及交叉验证的折数来寻找最佳的超参数。

两个模型最大的区别就是LogisticRegression是需要手动调参的,而LogisticRegressionCV是自动寻优的,但这并不代表LogisticRegressionCV模型的训练结果就一定比LogisticRegression好,比如本次实验中,由于数据集较小,特征较少,交叉验证结果并不明显,还可能导致过拟合现象。

具体来说,我们可以看到LogisticRegression的分类准确率为0.9649,查准率和查全率分别为0.9672和0.9580;而LogisticRegressionCV的分类准确率为0.9561,查准率和查全率分别为0.9604和0.9464。而且它们分类正确的数据都是110个,所以实际上两个模型的差别并不是很大。

当正则化参数C变化的时候,C=0.1时模型分类正确率为0.96,而C=0.01时模型分类正确率为0.94,显然C=0.1更适合作为当前数据集下的回归>逻辑回归正则化参数,而C=0.01则有点过小了,使得模型有些过拟合。


http://www.ppmy.cn/embedded/169492.html

相关文章

docker简介-学习与参考

docker Docker 是一个开源的应用容器引擎,基于 Go 语言并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 容器是完全使用沙箱…

DeepSeek-R1-671B大模型满血版私有化部署高可用教程-SparkAi系统集成图文教程

DeepSeek官网服务器繁忙的主要原因是由于用户数量激增导致的服务器资源紧张。‌为了解决这一问题,DeepSeek团队已经暂停了API服务充值,以避免对用户造成业务影响。目前,存量充值金额仍可继续调用,但充值功能暂时不可用‌。 DeepSe…

Vue.js 学习笔记

文章目录 前言一、Vue.js 基础概念1.1 Vue.js 简介1.2 Vue.js 的特点1.3 Vue.js 基础示例 二、Vue.js 常用指令2.1 双向数据绑定(v-model)2.2 条件渲染(v-if 和 v-show)2.3 列表渲染(v-for)2.4 事件处理&am…

electron-builder打包时github包下载失败【解决办法】

各位朋友们,在使用electron开发时,选择了electron-builder作为编译打包工具时,是否经常遇到无法从github上下载依赖包问题,如下报错: Get "https://github.com/electron/electron/releases/download/v6.1.12/ele…

win11本地部署deepseek大模型(安装ollama+docker+open-webui)最终实现自己的项目可通过API调用投喂数据后的模型

硬件配置:笔记本win11,内存32G,CPU锐龙7 ,无独显;只能考虑deepseek-r1:1.5b模型。 第一步:安装Ollama 此处不过多累赘了,https://ollama.com/官网选择对应的系统版本下载即可。 需要注意的是…

计算机网络——详解TCP三握四挥

文章目录 前言一、三次握手1.1 三次握手流程1.2 tcp为什么需要三次握手建立连接? 二、四次挥手2.1 四次挥手流程2.2 为什么是四次,不是三次?2.3 为什么要等待2msl?2.4 TCP的保活计时器 前言 TCP和UDP是计算机网络结构中运输层的两…

半导体制造工艺(二)光刻工艺—掩模版

在上文中我们已经简单概述了光刻工艺的大致流程。接下来将会介绍在光刻工艺中所需用到的必备材料以及设备。例如掩模版、光刻胶、匀胶机、光刻机等等。由于需要保持讲述工艺的完整性以及流畅,每一个都需要涉及,所以每次仅是侧重点不同。此篇主要讲述的是…

【开源免费】基于SpringBoot+Vue.JS医院药品管理系统(JAVA毕业设计)

本文项目编号 T 221 ,文末自助获取源码 \color{red}{T221,文末自助获取源码} T221,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…