zoukankan      html  css  js  c++  java
  • 建模常用的自定义函数(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
    AUC = %0.4f
    K-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

  • 相关阅读:
    表单分页,默认第一页,点击第5页,返回,如何跳转到第1页
    2019面试题
    企业微信中,获取外部联系人信息
    js vue 在页面中将摄像头放在一个标签里展示,(模仿手机拍照功能)
    微信小程序 自定义三列城市弹窗
    微信小程序 密码键盘
    vue 上传图片视频组件,可拍照选择照片,解决苹果手机拍照旋转问题
    vue 上拉加载自定义组件,超好用哦
    vue 模仿机票自定义日历组件,区间选择
    vue 日历组件只显示本月和下个月 -- 多选日期
  • 原文地址:https://www.cnblogs.com/cgmcoding/p/13608908.html
Copyright © 2011-2022 走看看