✨ 欢迎关注Python机器学习AI ✨
本节介绍: Python实现逻辑回归列线图绘制与模型预测阈值显示 。数据采用模拟数据,作者根据个人对机器学习的理解进行代码实现与图表输出,细节并不保证与原文一定相同,仅供参考。 详细数据和代码、文献将在稍后上传至交流群,付费成员可在交流群中获取下载。需要的朋友可关注公众文末提供的购买方式。 购买前请咨询,避免不必要的问题。
✨ 论文原图 ✨
列线图的作用是通过将多个预测因子的权重和评分可视化,帮助直观地评估不同变量对最终风险的影响,并基于该评分计算预测风险
✨ 仿图 ✨
✨ 代码实现 ✨
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['axes.unicode_minus'] = False
import warnings
# 忽略所有警告
warnings.filterwarnings("ignore")
path = r"Dataset.csv"
df = pd.read_csv(path)
from sklearn.model_selection import train_test_split
# 划分特征和目标变量
X = df.drop(['target'], axis=1)
y = df['target']
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
X,
y,
test_size=0.3,
random_state=42,
stratify=df['target']
)
from sklearn.linear_model import LogisticRegression
log_reg = LogisticRegression(random_state=42)
log_reg.fit(X_train, y_train)
y_pred = log_reg.predict(X_test)
使用逻辑回归模型对一个数据集进行训练,首先通过划分训练集和测试集来准备数据,然后用训练集训练逻辑回归模型,并用测试集进行预测。接下来,可以用该模型来绘制 列线图
# 输出模型的系数和截距
coefficients = log_reg.coef_
intercept = log_reg.intercept_
# 获取模型的训练精度
train_accuracy = log_reg.score(X_train, y_train)
# 获取模型的测试精度
test_accuracy = log_reg.score(X_test, y_test)
print("Logistic Regression Model Detailed Information:")
print(f"Intercept: {intercept}")
print(f"Coefficients: {coefficients}")
print("\nModel Evaluation:")
print(f"Train Accuracy: {train_accuracy:.4f}")
print(f"Test Accuracy: {test_accuracy:.4f}")
输出逻辑回归模型的详细信息,包括截距和系数,及其在训练集和测试集上的准确度。截距和系数提供了模型如何根据每个特征做出预测的详细信息,而训练和测试精度则帮助评估模型在不同数据集上的表现,验证其泛化能力
接下来,整理模型的截距值和系数,以便用于绘制列线图,直观展示每个特征对预测结果的贡献
# 创建特征名列表,包含截距和其他特征
features = ['intercept'] + X.columns.tolist()
# 获取模型的系数,包括截距
coefficients = [log_reg.intercept_[0]] + list(log_reg.coef_[0])
# 获取每个特征的min和max值,截距没有min和max值,所以设置为空
min_values = [''] + list(X.min())
max_values = [''] + list(X.max())
# 将新列添加到原始DataFrame
df_features = pd.DataFrame({
'feature': features,
'coef': coefficients,
'min': min_values,
'max': max_values,
})
# 定义分类型特征
categorical_features = ['sex', 'cp', 'fbs', 'restecg', 'exang', 'slope', 'ca', 'thal']
# 自动识别每个特征的数据类型
feature_types = [''] + ['nominal' if feature in categorical_features else 'continuous' for feature in X.columns]
# 将新列添加到原始DataFrame
df_features = pd.DataFrame({
'feature': features,
'coef': coefficients,
'min': min_values,
'max': max_values,
'type': feature_types,
})
df_features['position'] = [''] * len(df_features) # 用空字符串填充所有行
df_features
这段代码就具体的整理了逻辑回归模型的截距值、系数、特征的最小值和最大值,并根据特征的类型(分类型或连续型)自动标记每个特征的数据类型
# 创建 'threshold' 行,系数为 0.5
threshold_row = pd.DataFrame({
'feature': ['threshold'],
'coef': [0.5],
'min': [''],
'max': [''],
'type': [''],
'position':['']
})
# 找到 'intercept' 行的索引
intercept_index = df_features[df_features['feature'] == 'intercept'].index[0]
# 将 'threshold' 行插入到 'intercept' 行之后
df_features = pd.concat([df_features.iloc[:intercept_index+1], threshold_row, df_features.iloc[intercept_index+1:]]).reset_index(drop=True)
df_features
在数据框中插入一个名为 threshold 的新行,并将其位置设置在 intercept 行之后,系数为 0.5。这个阈值行展示了分类模型的预测概率阈值,通常用于确定预测结果为正类的判定标准,默认情况下,对于分类模型,阈值通常为 0.5,后续将在列线图中呈现这个预测概率阈值,这也是这个列线图可视化的一个特点
最终将这些信息存储在一个DataFrame中,以便用于后续的列线图绘制(这也是接下来采用函数接收的数据格式)
import simpleNomo as sn
import warnings
# 忽略所有警告
warnings.filterwarnings("ignore")
# 将特征数据框保存为Excel文件
df_features.to_excel('template.xlsx', index=False)
# 设定路径和绘图
path = "template.xlsx" # 读取输入文件的路径,这里是存储特征的Excel文件
# 调用 simpleNomo 库中的 nomogram 函数,生成列线图
fig = sn.nomogram(
path=path, # 数据文件路径
result_title="Risk", # 图表标题
fig_width=10, # 图表宽度(单位:英寸)
single_height=0.45, # 每个单元(特征)的高度(单位:英寸)
dpi=1200, # 图表分辨率,DPI越高图像越清晰,适合打印时使用
ax_para={
"c": "black", # 坐标轴的颜色,"black"表示黑色
"linewidth": 1.3, # 坐标轴线条的宽度
"linestyle": "-" # 坐标轴线条的样式,"-"表示实线
},
tick_para={
"direction": 'in', # 刻度的方向,'in'表示刻度指向内侧
"length": 3, # 刻度的长度,3表示长度为3个单位
"width": 1.5 # 刻度的宽度,1.5表示宽度为1.5个单位
},
xtick_para={
"fontsize": 10, # x轴刻度标签的字体大小
"fontfamily": "Times New Roman", # x轴刻度标签的字体,"Times New Roman"
"fontweight": "bold" # x轴刻度标签的字体加粗
},
ylabel_para={
"fontsize": 12, # y轴标签的字体大小
"fontname": "Times New Roman", # y轴标签的字体,"Times New Roman"
"labelpad": 100, # y轴标签与图表的距离,100表示相对较大的间距
"loc": "center", # y轴标签位置,"center"表示居中
"color": "black", # y轴标签颜色,"black"表示黑色
"rotation": "horizontal" # y轴标签的旋转角度,"horizontal"表示水平显示
},
total_point=100 # 设置nomogram的总分值为100
)
# 保存为PDF
fig.savefig('nomogram_output_1.pdf', format='pdf', dpi=1200) # 将图表保存为PDF文件,分辨率为1200 DPI
使用simpleNomo库生成一个带有模型预测概率阈值的列线图,直观展示了各特征对最终预测结果的贡献,并将图表保存为PDF文件,图表样式包括坐标轴、刻度、标签字体等的定制设置
上面展示的列线图是默认的预测阈值,接下来可以进一步通过计算约登指数(TSS)来确定最优的预测概率阈值,优化分类模型的预测效果
根据该模型,通过计算约登指数,确定了最优的预测阈值为0.46,并将其可视化到列线图上,以便直观展示该阈值在预测结果中的作用
✨ 该文章案例 ✨
在上传至交流群的文件中,像往期文章一样,将对案例进行逐步分析,确保读者能够达到最佳的学习效果。内容都经过详细解读,帮助读者深入理解模型的实现过程和数据分析步骤,从而最大化学习成果。
同时,结合提供的免费AI聚合网站进行学习,能够让读者在理论与实践之间实现融会贯通,更加全面地掌握核心概念。
✨ 购买介绍 ✨
本节介绍到此结束,有需要学习数据分析和Python机器学习相关的朋友欢迎到淘宝店铺:Python机器学习AI,或添加作者微信deep_ML联系,购买作者的公众号合集。截至目前为止,合集已包含200多篇文章,购买合集的同时,还将提供免费稳定的AI大模型使用,包括但不限于ChatGPT、Deepseek、Claude等。
更新的内容包含数据、代码、注释和参考资料。 作者仅分享案例项目,不提供额外的答疑服务。项目中将提供详细的代码注释和丰富的解读,帮助您理解每个步骤 。 购买前请咨询,避免不必要的问题。
✨ 群友反馈 ✨
✨ 淘宝店铺 ✨
请大家打开淘宝扫描上方的二维码,进入店铺,获取更多Python机器学习和AI相关的内容,或者添加作者微信deep_ML联系 避免淘宝客服漏掉信息 ,希望能为您的学习之路提供帮助!
往期推荐
Frontiers in Oncology:利用生存机器学习RSF模型预测患者预后模拟实现
期刊配图:通过SHAP组图解读模型探索不同类型特征和分组对模型的影响
机器学习在临床数据分析中的应用:从数据预处理到Web应用实现的完整流程教学
Psychiatry Research基于SHAP可解释性的机器学习模型构建与评估:混淆矩阵、ROC曲线、DCA与校准曲线分析
nature communications:基于Light GBM与随机森林结合的多模型特征选择方法
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考