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

如何安装/导入nb21绘制累积增益曲线?该库无pip源及替代库咨询

关于nb21库及累积增益曲线替代方案

nb21库状态

nb21没有公开的PyPI安装源,也找不到活跃的官方维护仓库,基本可以确定该库已停止维护或仅为非公开的内部/个人项目,无法通过常规pip渠道安装使用。

替代方案

1. 使用成熟因果推断/uplift建模库

方案一:causalml

causalml是主流的因果推断工具库,内置累积增益曲线绘制功能,也支持ATE(对应你代码中的elast)计算。

示例代码:

from causalml.metrics import plot_cumulative_gain
from causalml.inference.meta import BaseRRegressor
from sklearn.ensemble import RandomForestRegressor
import matplotlib.pyplot as plt

# 训练R-Learner(匹配你代码中的模型逻辑)
r_learner = BaseRRegressor(learner=RandomForestRegressor())
r_learner.fit(X=test, y=y, treatment=T)
cate_pred = r_learner.predict(X=test)

# 绘制累积增益曲线
plot_cumulative_gain(y, T, cate_pred, figsize=(8,6))
plt.title("R-Learner Cumulative Gain Curve")

# 添加基线
ate = r_learner.estimate_ate(X=test, y=y, treatment=T)[0]
plt.plot([0, 100], [0, ate*100], linestyle="--", color="black", label="Baseline")
plt.legend()
plt.show()

方案二:scikit-uplift

scikit-uplift专注于uplift建模,提供完整的增益曲线绘制工具。

示例代码:

from sklift.metrics import cumulative_gain_curve, plot_cumulative_gain
import matplotlib.pyplot as plt

# 绘制累积增益曲线
plot_cumulative_gain(y_true=y, uplift=cate_test_non_param, treatment=T)

# 计算并添加基线
ate = y[T==1].mean() - y[T==0].mean()
plt.plot([0, 1], [0, ate], linestyle="--", color="black", label="Baseline")
plt.title("R-Learner")
plt.legend()
plt.show()

2. 手动实现核心功能

如果不想引入额外依赖,可手动实现cumulative_gain和elast的核心逻辑:

import numpy as np
import matplotlib.pyplot as plt

def elast(y, T):
    # 计算平均处理效应(ATE)
    return y[T==1].mean() - y[T==0].mean()

def cumulative_gain(cate, y, T):
    # 按CATE降序排序样本
    sorted_indices = np.argsort(-cate)
    sorted_y = y[sorted_indices]
    sorted_T = T[sorted_indices]
    
    n = len(sorted_y)
    gain = np.zeros(n+1)
    treated_sum = 0
    control_sum = 0
    
    for i in range(n):
        if sorted_T[i] == 1:
            treated_sum += sorted_y[i]
        else:
            control_sum += sorted_y[i]
        
        current_treated = sorted_T[:i+1].sum()
        current_control = (i+1) - current_treated
        
        # 避免除以0的情况
        if current_treated == 0 or current_control == 0:
            gain[i+1] = gain[i]
        else:
            current_ate = (treated_sum/current_treated) - (control_sum/current_control)
            gain[i+1] = current_ate * (i+1)/n * 100  # 转为百分比刻度
    return gain

# 用你原有的变量调用
gain_curve_test_non_param = cumulative_gain(cate_test_non_param, y, T)
gain_curve_test = cumulative_gain(cate_test, y, T)  # 假设cate_test是参数化模型的CATE预测值
ate = elast(y, T)

plt.plot(gain_curve_test_non_param, color="C0", label="Non-Parametric")
plt.plot(gain_curve_test, color="C1", label="Parametric")
plt.plot([0, 100], [0, ate*100], linestyle="--", color="black", label="Baseline")
plt.legend()
plt.title("R-Learner")
plt.show()

内容的提问来源于stack exchange,提问作者titutubs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 06:30:49