随笔 - 384  文章 - 0  评论 - 35  阅读 - 142万

建模常用的自定义函数(ks,auc等)

 

1.统计拆分训练集测试集之后的分布

复制代码
def summary(data_train, data_test, y):
    '''
    函数目标:统计数据拆分训练集和测试集之后的分布(如样本数量,坏账率之类的)
    变量:
    data_train:训练集(包括label)
    data_test:测试集(包括label),如果label是单独的,需要先合并,但是也可以直接(data_train, data_test = train_test_split()
    y:label的columns_name
    返回值:
    一个df
    '''

    summary = pd.DataFrame(
        {
            '样本数': [len(data_train), len(data_test)],
            '坏账数': [data_train[y].sum(), data_test[y].sum()],
            '坏账率': [
                round(data_train[y].mean(), 4),
                round(data_test[y].mean(), 4)
                ],
        },
        index=['训练集', '测试集']
    )[['样本数', '坏账数', '坏账率']]
    summary.index.name = '数据集'
    return summary
复制代码

 

2.计算ks

复制代码
def ks(self, data, y):
    '''
    目标:计算出分类模型的ks值
    变量:
    self:模型fit(x,y),如(self=tree.fit(x,y))
    data:一般是训练集(不包括label)或者是测试集(也是不包括label)
    y:label的column_name 
    返回:训练集(或者测试集)的ks值

    '''

    p = self.predict(data)
    fpr, tpr, p_threshold = metrics.roc_curve(data[y], p,
                                              drop_intermediate=False,
                                              pos_label=1)
    df = pd.DataFrame({'fpr': fpr, 'tpr': tpr, 'p': p_threshold})
    df.loc[0, 'p'] = max(p)

    ks = (df['tpr'] - df['fpr']).max()

    return ks
复制代码

 

3.计算auc

复制代码
def auc(self, data, y):
    '''
    目标:计算出分类模型的ks值
    变量:
    self:模型fit(x,y),如(self=tree.fit(x,y))
    data:一般是训练集(不包括label)或者是测试集(也是不包括label)
    y:label的column_name 
    返回:训练集(或者测试集)的auc值

    '''   

    p = self.predict(data)
    fpr, tpr, p_threshold = metrics.roc_curve(data[y], p,
                                              drop_intermediate=False,
                                              pos_label=1)
    df = pd.DataFrame({'fpr': fpr, 'tpr': tpr, 'p': p_threshold})
    df.loc[0, 'p'] = max(p)

    roc_auc = metrics.auc(fpr, tpr)

    return roc_auc
复制代码

 

4.ks画图

复制代码
def plot_ks(self, data, y):
    '''
    目的:画出ks的图片
    变量:
    self:模型fit(x,y),如(self=tree.fit(x,y))
    data:一般是训练集(不包括label)或者是测试集(也是不包括label)
    y:label的column_name 
    返回:训练集(或者测试集)的ks图片

    '''

    p = self.predict(data)

    fpr, tpr, p_threshold = metrics.roc_curve(data[y], p,
                                              drop_intermediate=False,
                                              pos_label=1)
    df = pd.DataFrame({'fpr': fpr, 'tpr': tpr, 'p': p_threshold})
    df.loc[0, 'p'] = max(p)

    df['diff'] = df['tpr'] - df['fpr']
    ks = df['diff'].max()
    ks_p = df.loc[df['diff'] == ks, 'p'].iloc[0]

    fig = plt.figure(figsize=(2.8, 2.8), dpi=140)
    ax = fig.add_subplot(111)
    ax.plot(df['p'], df['tpr'], color='navy', lw=2, label='TPR')
    ax.plot(df['p'], df['fpr'], color='darkorange', lw=2, label='FPR')
    ax.plot(
        [ks_p, ks_p],
        [
            df.loc[df['p'] == ks_p, 'tpr'].iloc[0],
            df.loc[df['p'] == ks_p, 'fpr'].iloc[0]
        ],
        color='crimson',
        lw=2,
        label='KS = %.4f' % ks
    )
    ax.set_xlim([0.0, df['p'].max()])
    ax.set_ylim([0.0, 1.05])
    ax.set_xlabel('Prob Threshold')
    ax.set_ylabel('Rate')
    ax.set_title('K-S Curve')
    ax.legend(loc="upper right")

    return fig
复制代码

 

5.auc画图

复制代码
def plot_roc(self, data, y):
    '''
    目标:计算出分类模型的ks值
    变量:
    self:模型fit(x,y),如(self=tree.fit(x,y))
    data:一般是训练集(不包括label)或者是测试集(也是不包括label)
    y:label的column_name 
    返回:训练集(或者测试集)的auc的图片

    '''      

    p = self.predict(data)
    fpr, tpr, p_threshold = metrics.roc_curve(data[y], p,
                                              drop_intermediate=False,
                                              pos_label=1)
    df = pd.DataFrame({'fpr': fpr, 'tpr': tpr, 'p': p_threshold})
    df.loc[0, 'p'] = max(p)

    ks = (df['tpr'] - df['fpr']).max()
    roc_auc = metrics.auc(fpr, tpr)

    fig = plt.figure(figsize=(2.8, 2.8), dpi=140)
    ax = fig.add_subplot(111)

    ax.plot(fpr, tpr, color='darkorange', lw=2,
            label='ROC curve\nAUC = %0.4f\nK-S = %0.4f' % (roc_auc, ks)
            )
    ax.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')

    ax.set_xlim([0.0, 1.0])
    ax.set_ylim([0.0, 1.05])
    ax.set_xlabel('False Positive Rate')
    ax.set_ylabel('True Positive Rate')
    ax.set_title('ROC Curve')
    ax.legend(loc="lower right")
    plt.close()
    return fig
复制代码

 

posted on   小小喽啰  阅读(1164)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示