当前位置: 首页> 财经> 金融 > 一键生成房屋设计图_建筑网课回放_一键生成原创文案_东莞搜索优化

一键生成房屋设计图_建筑网课回放_一键生成原创文案_东莞搜索优化

时间:2025/7/13 13:46:21来源:https://blog.csdn.net/skyskytotop/article/details/145751810 浏览次数:0次
一键生成房屋设计图_建筑网课回放_一键生成原创文案_东莞搜索优化

开发列线图用于线性模型的解释工具(数据计算)

在这里插入图片描述

鉴于大家对昨天的想法比较感兴趣,今天把想法付诸实践,尝试用列线图来解释线性模型(逻辑回归模型、cox模型,甚至立方样条模型?),总体上是类比SHAP分析,希望能实现全局解释,即比较变量之间的重要性和局部解释,即展示变量当前值对预测结果的贡献。

理论上,全局性解释和局部解释都是可以实现的,但是要真正像SHAP分析那样发挥作用,恐怕还有一些的弯路要走。

今天完成的是第一步:列线图数据的计算,并且形成一个函数,输入输出可以看函数的解释,用这些数据就可以绘制列线图了,绘图部分也想着能整理成一个绘图函数。

不过,以模型解释为目的,列线图不是唯一的选择,meta_df中的值是带正负号的值,类似SHAP值,可以反映贡献的大小和方向,变量之间也是可比的,使用这个值来解释模型,也是一个考虑,直接用还是要处理一下,比如像SHAP值那样都减个平均数。

至于score_df对应的是列线图线段的长短,就都是正值,现在在考虑怎样可视化能更好的进行模型解释,做成蜂窝图的化,就有点和SHAP混淆了。

总之,今天有点进展,但是不多,感谢大家关注!数据集我上传到资源里面了,没用过不知道好用不,下不了的可以发信息。

列线图数据计算:

from sklearn.preprocessing import LabelEncoder
import statsmodels.formula.api as smf
import pandas as pd
import numpy as npdef form_nomogram_data(data, cat_cols, outcome_col, var_cols):"""该函数用于形成列线图所需的数据。参数:data (pandas.DataFrame): 输入的原始数据cat_cols (list): 分类变量的列名列表outcome_col (str): 结果变量的列名var_cols (list): 用于构建模型的变量列名列表返回:tuple: 包含三个DataFrame的元组 (data_origin, meta_df, score_df)data_origin: 原始数据的DataFramemeta_df: 包含回归系数和变量值乘积的DataFramescore_df: 包含列线图所需的数据的DataFrame"""# 对分类变量进行独热编码data_origin = pd.get_dummies(data, columns=cat_cols, drop_first=True, dtype=int)# 更新var_cols以包含独热编码后的列名new_cat_cols = []for col in cat_cols:unique_values = data[col].unique()unique_values = sorted(unique_values)# 去掉第一个值(因为drop_first=True)if len(unique_values) > 1:for value in unique_values[1:]:new_col_name = f"{col}_{value}"new_cat_cols.append(new_col_name)# 移除原分类变量列名,添加新的独热编码列名updated_var_cols = [col for col in var_cols if col not in cat_cols]updated_var_cols.extend(new_cat_cols)# 对结果变量进行标签编码le = LabelEncoder()data_origin[outcome_col] = le.fit_transform(data_origin[outcome_col])# 构建逻辑回归模型公式formula = outcome_col + '~' + '+'.join(updated_var_cols)# 构建线性模型,列线图需要的是模型的参数model_logit = smf.logit(formula, data_origin).fit()model_logit_params = model_logit.paramscols = model_logit_params.index.to_list()params = model_logit_params.values# 形成meta数据,系数与变量值的乘积,带有正负号,可以指示方向meta_df = data_origin.loc[:, cols[1:]]meta_df['Intercept'] = np.repeat(1, meta_df.shape[0])# meta数据1,beta与X的乘积,现在没有连续变量和分类变量的区别for col, beta in zip(cols, params):meta_df[col] = [x * beta for x in meta_df[col]]# 合计数据,用于计算预测概率meta_df['total'] = meta_df.sum(axis=1)meta_df['probability'] = [1 / (1 + np.exp(-z)) for z in meta_df['total']]# 求最大数据,即每个变量最大值和最小值之间distances中最大的一个, 这个最大的distance会处理为100, 其它的distance根据比例绘制ls_max_distance = []for col in cols:one_distance = np.max(meta_df[col].values) - np.min(meta_df[col].values)print(col + ':' + f"{one_distance}")ls_max_distance.append(one_distance)max_distance = np.max(ls_max_distance)# 形成score数据,用于形成列线图score_df = meta_df.copy()[cols]for col in cols:score_df[col] = (meta_df[col] - meta_df[col].min()) * 100 / max_distancescore_df['total'] = score_df.sum(axis=1)score_df['probability'] = meta_df['probability']return data_origin, meta_df, score_dfif __name__ == "__main__":data=pd.read_csv('data_dev_factor_cleaned_remove_space.csv')cat_cols = ['sex', 'ejection']outcome_col = 'outcome'var_cols = ['age', 'bmi', 'sex', 'ejection']data_origin, meta_df, score_df = form_nomogram_data(data, cat_cols, outcome_col, var_cols)
关键字:一键生成房屋设计图_建筑网课回放_一键生成原创文案_东莞搜索优化

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: