You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:36:25