如何用Python绘制特征Column1对应正样本占比的指数变化图
没问题,我来帮你搞定这个需求!咱们分步骤实现,从数据处理到绘制带指数趋势线的图表,全程用Python完成:
1. 导入必要的库
首先咱们得把需要的工具库导进来:pandas用来处理数据,matplotlib.pyplot负责绘图,scipy.optimize.curve_fit帮咱们拟合指数趋势线。如果还没安装这些库,先跑pip install pandas matplotlib scipy搞定依赖。
import pandas as pd import matplotlib.pyplot as plt from scipy.optimize import curve_fit import numpy as np
2. 加载并处理数据
假设你的数据存在CSV文件里(直接用DataFrame对象也完全可以),先加载数据,然后计算每个Column1取值对应的正样本占比——因为output是二分类(0/1),对分组后的output取均值,得到的就是正样本占比。
如果你的Column1有大量离散值,建议先分箱处理(把数值分成若干区间),不然绘图会太零散。这里给两种方案:
方案A:直接按原始Column1值计算占比
# 加载数据(替换成你的数据路径) df = pd.read_csv("your_data.csv") # 按Column1分组,计算正样本占比 ratio_df = df.groupby("Column1")["output"].mean().reset_index() ratio_df.columns = ["Column1", "positive_ratio"]
方案B:分箱后计算占比(数据量大时推荐用)
# 把Column1分成10个等距区间,你可以根据数据分布调整区间数量 df["Column1_bin"] = pd.cut(df["Column1"], bins=10) # 按区间分组计算占比,同时取区间中点作为x轴显示值 ratio_df = df.groupby("Column1_bin")["output"].mean().reset_index() # 提取区间中点用于绘图 ratio_df["Column1_mid"] = ratio_df["Column1_bin"].apply(lambda x: (x.left + x.right)/2)
3. 绘制散点图+指数趋势线
首先定义符合你需求的指数函数(因为Column1越小正样本占比越高,所以用负指数形式):
# 指数模型:y = a * e^(-b*x) + c def exponential_func(x, a, b, c): return a * np.exp(-b * x) + c
接下来绘制图形,先画实际占比的散点,再拟合并绘制趋势线:
plt.figure(figsize=(10,6)) # 绘制散点图(如果用分箱方案,x换成ratio_df["Column1_mid"]) plt.scatter(ratio_df["Column1"], ratio_df["positive_ratio"], color="blue", label="实际正样本占比") # 拟合指数曲线 x_data = ratio_df["Column1"].values y_data = ratio_df["positive_ratio"].values # 初始参数猜测,根据你的数据调整:比如a设为1(最大占比接近1),b设为小正数,c设为0 popt, pcov = curve_fit(exponential_func, x_data, y_data, p0=[1, 0.01, 0]) # 生成拟合曲线的x值(覆盖整个Column1的取值范围) x_fit = np.linspace(min(x_data), max(x_data), 100) y_fit = exponential_func(x_fit, *popt) # 绘制拟合线 plt.plot(x_fit, y_fit, color="red", linestyle="--", label=f"指数拟合线: y={popt[0]:.2f}e^(-{popt[1]:.4f}x)+{popt[2]:.2f}") # 设置图表细节 plt.xlabel("Column1 取值") plt.ylabel("正样本占比") plt.title("Column1与正样本占比的指数关系") plt.legend() plt.grid(True, alpha=0.3) plt.show()
小提示
- 如果拟合时报错,大概率是初始参数
p0设置不合理,你可以根据数据的大致范围调整:比如观察最小的Column1对应的占比接近1,那a就设为1;如果Column1很大时占比接近0,c就设为0。 - 如果你的数据里Column1有0值,要注意指数函数在x=0时的取值是否合理,必要时可以给Column1加个微小偏移(比如
x+1)避免问题。
内容的提问来源于stack exchange,提问作者rima
相关产品推荐
相关产品推荐

