首页 > 编程语言 >Python-多种机器学习算法-二分类—多指标展示-雷达图-热图-柱状图

Python-多种机器学习算法-二分类—多指标展示-雷达图-热图-柱状图

时间:2024-12-10 18:27:30浏览次数:14  
标签:plt Python results df 柱状图 train test model 热图

旨在利用多种机器学习算法实现对乳腺癌的诊断。并使用准确率、精确率、召回率、F1—score和ROC-AUC等指标进行评价。并使用雷达图、柱状图等进行展示。

 废话不多说先上结果图:

 本人代码是使用notebook编写的,这里直接放上总代码!!!

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score
from adjustText import adjust_text

from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from xgboost import XGBClassifier
from catboost import CatBoostClassifier
from sklearn.svm import SVC
from sklearn.neighbors import KNeighborsClassifier

plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['axes.unicode_minus'] = False



df = pd.read_csv(r'C:\Users\lenovo\Desktop\blog\data_2_class.csv')
# 划分特征和目标变量
X = df.drop(['diagnosis'], axis=1)
y = df['diagnosis']


# 初始化标准化器
scaler = StandardScaler()

# 对特征数据进行标准化
X = scaler.fit_transform(X)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2,
                                                    random_state=42, stratify=df['diagnosis'])
# 初始化结果存储
results = []

# 定义函数计算并保存指标
def evaluate_model(model_name, model, X_test, y_test):
    y_pred = model.predict(X_test)
    y_prob = model.predict_proba(X_test)[:, 1] if hasattr(model, "predict_proba") else None

    # 计算指标
    accuracy = accuracy_score(y_test, y_pred)
    precision = precision_score(y_test, y_pred, average='weighted')
    recall = recall_score(y_test, y_pred, average='weighted')
    f1 = f1_score(y_test, y_pred, average='weighted')
    roc_auc = roc_auc_score(y_test, y_prob, multi_class='ovr') if y_prob is not None else np.nan

    # 存储结果
    results.append({
        "Accuracy": accuracy,
        "Precision": precision,
        "Recall": recall,
        "F1-score": f1,
        "ROC-AUC": roc_auc,
        "Model": model_name
    })



# Decision Tree
dt = DecisionTreeClassifier(random_state=42)
dt.fit(X_train, y_train)
evaluate_model("DT", dt, X_test, y_test)

# CatBoost
cat = CatBoostClassifier(verbose=0, random_state=42)
cat.fit(X_train, y_train)
evaluate_model("catBoost", cat, X_test, y_test)


# XGBoost
xgb = XGBClassifier(use_label_encoder=False, eval_metric='logloss', random_state=42)
xgb.fit(X_train, y_train)
evaluate_model("XGBoost", xgb, X_test, y_test)

# Random Forest
rf = RandomForestClassifier(random_state=42)
rf.fit(X_train, y_train)
evaluate_model("RF", rf, X_test, y_test)

# SVM
svm = SVC(probability=True, random_state=42)
svm.fit(X_train, y_train)
evaluate_model("SVM", svm, X_test, y_test)

# KNN
knn = KNeighborsClassifier()
knn.fit(X_train, y_train)
evaluate_model("KNN", knn, X_test, y_test)


# 转为 DataFrame 并显示
results_df = pd.DataFrame(results)
# 将DataFrame保存为Excel文件
results_df.to_excel('results.xlsx', index=False)
results_df



#-----雷达图----
metrics = ["Accuracy", "Precision", "Recall", "F1-score", "ROC-AUC"]
categories = results_df["Model"].tolist()
angles = np.linspace(0, 2 * np.pi, len(categories), endpoint=False).tolist()
angles += angles[:1]

# 调整figsize以减小雷达图的大小
fig, axs = plt.subplots(2, 3, figsize=(14, 10), subplot_kw=dict(polar=True))
axs = axs.flatten()

for i, metric in enumerate(metrics):
    values = results_df[metric].tolist()
    values += values[:1]  # Close the radar
    axs[i].fill(angles, values, alpha=0.25, label=metric)
    axs[i].plot(angles, values, marker='o')
    axs[i].set_ylim(0, 1.001)
    axs[i].set_xticks(angles[:-1])
    # 增加字体大小
    axs[i].set_xticklabels(categories, fontsize=12)  # 原来是10,现在改为12
    axs[i].set_title(metric, pad=20)
    # 增加标题的字体大小
    axs[i].title.set_fontsize(14)  # 增加标题字体大小
    axs[i].set_yticklabels([])

# 删除最后一个子图
fig.delaxes(axs[-1])
plt.savefig("rader_plt.pdf", format='pdf', bbox_inches='tight', dpi=1200)
# 调整子图间距,确保字体变大后不会重叠
plt.subplots_adjust(hspace=1.4, wspace=1.4)
plt.tight_layout()
plt.show()


#-----柱状图------
# 模型名称和评价指标
models = results_df['Model']
metrics = results_df.iloc[:, :-1].columns

# 绘图
fig, ax = plt.subplots(figsize=(16, 7))
width = 0.14  # 每个柱子的宽度
x = np.arange(len(metrics))  # 评价指标的位置

# 绘制每个模型的柱状图(竖直排列)
for i, model in enumerate(models):
    bars = ax.bar(x + (i - 2.5) * width, results_df.iloc[i, :-1], width=width, label=model)

    # 标注每个柱子的数值
    for bar in bars:
        yval = bar.get_height()  # 获取柱子的高度
        ax.text(bar.get_x() + bar.get_width() / 2, yval + 0.02,  # 设置文本位置(在柱子上方)
                f'{yval:.3f}',  # 显示数值,保留两位小数
                ha='center', va='bottom', fontsize=8, color='black')  # 文本位置和格式

# 设置X轴标签和Y轴标签
ax.set_xticks(x)
ax.set_xticklabels(metrics)
ax.set_ylabel('Performance Metric Values')
ax.set_title('Performance Metrics for Each Model')

# 图例位置
ax.legend(title='Models', loc='center right', bbox_to_anchor=(1.1, 0.5))  # 前面的1.1为偏移量(向右),0.5为上下居中

# 保存图像为PDF
plt.tight_layout()
plt.savefig("stylolitic.pdf", format='pdf', bbox_inches='tight', dpi=300)
plt.show()

#-----热图------
import seaborn as sns
# 创建一个包含所有指标数据的 DataFrame
heatmap_data = results_df[metrics].set_index(results_df["Model"])

# 设置绘图样式
plt.figure(figsize=(10, 6))

# 绘制热力图
sns.heatmap(heatmap_data, annot=True, cmap='coolwarm', fmt='.3f', linewidths=0.5)

# 添加标题
plt.title('Heatmap of Model Performance', fontsize=16)

plt.savefig("heatmap.pdf", format='pdf', bbox_inches='tight', dpi=1200)
# 显示图形
plt.tight_layout()
plt.show()

标签:plt,Python,results,df,柱状图,train,test,model,热图
From: https://blog.csdn.net/weixin_68453343/article/details/144374095

相关文章

  • Python调用海康威视工业相机
    使用的MVS版本为3.4.1,python的版本为3.9,MVS可以自行去官网下载。MVS在安装的过程中要记一下安装路径,一会儿是要进去拿文件的。安装完成后,进入到这个路径安装的盘\MVS\Development\Samples\Python,把里面的文件复制到你想使用的项目中去。参考的代码来源在这里:https://bl......
  • Python遍历文件夹及子文件夹
    importos#列出一个文件夹里的所有文件,文件夹defscan_dir_files(files):ifos.path.exists(files):#os.path.exists()判断文件或文件夹是否存在lst=os.listdir(files)print(lst)scan_dir_files('.')#执行函数#输出所有文件夹defdir_path......
  • Python网络爬虫技术详解与实践案例
    Python网络爬虫技术详解与实践案例在大数据时代,数据是驱动业务发展的重要资源。如何高效地获取数据,成为许多开发者关注的重要课题。Python网络爬虫作为一种自动化数据抓取工具,在数据采集领域扮演着重要角色。本文将详细介绍Python网络爬虫的基础知识、进阶技巧,并通过实际案......
  • python中if条件语句对于布尔值和非布尔值的判断结果
    Python中,if条件语句可以接受非布尔值的表达式。Python会根据对象的真值(truthiness)来判断条件是否成立以下对象被视为假(False):NoneFalse数字类型中的零(如0、0.0)空序列(如''、[]、())空字典(如{})空集合(如set())其他所有值都被视为真(True)。#空列表(空序列)my_object=[]......
  • 手把手教你用python一键抢12306火车票(附代码)
    源码直接在pycharm里面打开即可用github链接:w1a2b3c/123061:12306抢票脚本,学生票,为了买票纯手写gitee链接:eric/12306抢票脚本,学生票,为了买票纯手写哈喽,哈喽~,一年一度的抢火车票大战正式拉开序幕…然饿大多数人碰到的是这种情况:当你满心期待摩拳擦掌准备抢票的时候,你会发现......
  • python毕设 少儿艺术培训管理系统论文+程序
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于少儿艺术培训管理的研究,现有研究主要以传统管理模式以及通用性管理系统为主,专门针对少儿艺术培训领域的个性化管理系统研究较少。......
  • python毕设 咖啡学院平台系统程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于咖啡学院平台系统的研究,现有研究主要以传统线下咖啡教学或一般性在线教育平台为主,专门针对咖啡学院这种具有特定课程体系(如咖啡相......
  • Python爬虫淘宝天猫商品详情页面数据接口
    以下是使用Python尝试爬取淘宝天猫网站商品详情数据的一般思路及相关要点,不过要强调的是,在进行网络爬虫操作时,需确保符合平台的相关使用条款以及法律法规要求,避免违规爬取:1.分析页面结构与接口情况首先通过浏览器(比如Chrome浏览器按F12键打开开发者工具)访问平台的商品......
  • 渗透利器-kali工具 (第四章-1) Python环境安装与基本语法
    学习python环境安装和基础语法[变量、函数]为什么要学习Python?提高工作效率,payload、exp、爬虫、fuzz等。1,安装python环境和编码工具:1.python2还是python3:很多都会纠结应该选择python2,还是python3版本的问题。我觉的世界的变化的速度在变得更快,语......
  • 渗透利器-kali工具 (第四章-2) python循环判断分支语句与异常处理
    学习循环语句和判断依据加异常处理1,逻辑控制与循环:逻辑判断---True&False:布尔类型[boolean]的数据只有两种,True和False[需要注意的是首字母大写]。人类以真伪来判断事实,而在计算机世界中真伪对应着的则是1和0。我们每输入一行代码就会立即得......