外部数据评价函数

该博客介绍了数据评价函数的实现,包括PSI、相关系数、互信息、KS、GINI、IV、AUC和f1_score等关键指标的计算。通过示例函数展示了如何对数据进行验证和描述性统计分析,适用于预测模型效果评估。

评价函数

此函数用于评价外部数据:主要指标有:PSI,相关系数、互信息指标、KS、GINI、IV、AUC、f1_score,此外还有其他描述性指标。

# psi score cal 
def psi_cal(score_col,label_col,date_col,data):
    '''
    score_col:str,外部数据列名称
    label_col:str,标签数据列名称
    date_col:str,日期数据名称
    data:dataFrame,df文件
    '''
    base_data = data[data[date_col] < 20210800]
    pre_data = data[data[date_col] >= 20210800]
    base_data_cut,bins = pd.qcut(base_data[score_col],10,duplicates='drop',retbins=True)# cut and return bins 
    base_bad_rate = base_data.flag.groupby(base_data_cut).mean() # cal base_data bin bad rate 
    pre_data_cut = pd.cut(pre_data[score_col],bins,include_lowest=True)
    pre_bad_rate = pre_data.flag.groupby(pre_data_cut).mean()  # cal pre_data bin bad rate 
    PSI = (base_bad_rate.values - pre_bad_rate.values)*np.log(base_bad_rate.values/pre_bad_rate.values)
    psi_value = PSI.sum()
    return psi_value

# 评价函数
def socre_test(test,label):
    '''
    单项数据的验证
    col:待检测数据 -- pd.Series
    label:Y值 -- pd.Series
    return : 各项描述指标和评价指标 -- dict
    '''
    # 计算查得率
    rate_response = (test.notna().sum()/len(test))*100  
    # 剔除未查到样本 
    test = test[test.notna()]
    label = label[test.index]
    # 描述性指标计算
    range_,min_,max_,mean_,std_,cov = test.max() -test.min(),test.min(),test.max(),test.mean(),test.std(),test.std()/test.mean()  # 描述统计指标
    # 相关系数指标 
    corr = test.corr(label)  # 
    # 互信息指标 
    mic_value= mic(test.values.reshape(-1,1),label.values.reshape(-1,1))
    mic_value = mic_value[0]
    # 按分位数进行分箱
    distribute_table = label.groupby(pd.qcut(test,10,duplicates='drop')).agg(['count','mean'])  
    # IV 计算 
    distribute_table.rename(columns={'count':'all_num','mean':'bad_rate'},inplace=True)
    distribute_table['good_rate'] = 1 - distribute_table['bad_rate']
    distribute_table['bad_num'] = distribute_table.all_num * distribute_table.bad_rate
    distribute_table['good_num'] = distribute_table.all_num * distribute_table.good_rate
    woe = np.log((distribute_table.bad_num/distribute_table.bad_num.sum())/(distribute_table.good_num/distribute_table.good_num.sum()))
    iv = ((distribute_table.bad_num/distribute_table.bad_num.sum()) - (distribute_table.good_num/distribute_table.good_num.sum()))*woe
    iv_value = iv.sum()

    # KS计算 
    ks_bad_rate = distribute_table['all_num']*distribute_table['bad_rate']/label.sum()
    ks_good_rate = (distribute_table['all_num']*distribute_table['good_rate'])/(len(label) - label.sum())
    ks_value = abs(ks_bad_rate.cumsum() - ks_good_rate.cumsum()).max()

    # Gini 系数 
    distribute_table['gini'] = 1 - ((distribute_table['bad_rate']*distribute_table['bad_rate']) + (distribute_table['good_rate']*distribute_table['good_rate']))
    gini_value = sum(distribute_table['gini']*distribute_table['all_num']/len(label))

    # AUC计算
    score = test.apply(lambda x:( x- min_)/(max_ - min_))
    if corr < 0:
        score = 1- score 
    
    auc_score = roc_auc_score(label[score.sort_values().index],score.sort_values())

    # f1 socre 
    if corr > 0:
        point = test.quantile(0.9)
        y_pred = test.apply(lambda x: 1 if x >= point else 0)
    else:
        point = test.quantile(0.1)
        y_pred = test.apply(lambda x: 1 if x <= point else 0)  
    f1score = f1_score(label,y_pred)
    return {'查得率':rate_response,'corr':corr,'mic':mic_value,'ks':ks_value,"iv":iv_value,"gini":gini_value,"auc":auc_score,'f1_socre':f1score,'极差':range_,'最大值':max_,"最小值":min_,"均值":mean_,"变异系数":cov }

}

### 评估聚类算法性能的评价函数 #### 内部指标 内部指标主要依赖于数据本身的信息,不需要外部标签来进行比较。常见的内部指标有: - **轮廓系数(Silhouette Coefficient)**:对于每一个样本计算其到同簇其他样本的平均距离a(i),以及它到最近不同簇所有样本的平均距离b(i)。那么该样本的轮廓系数定义为s(i)=(b(i)-a(i))/max(a(i), b(i))。整个数据集上的轮廓系数取所有个体轮廓系数的均值[^2]。 - **Davies-Bouldin指数(DBI)**:此指数反映了簇内的紧致性和簇间的分离性之间的关系。较低的DBI意味着更好的聚类效果。具体来说,它是各簇最差情况下的相似度之和,其中两个簇的相似度由它们各自的紧凑度(通常用簇内点间平均距离表示)加上两者中心的距离倒数来衡量。 #### 外部指标 外部指标则利用已知的真实类别信息作为参照标准,对比实际分类结果与预期分类的一致性程度。常用的外部指标如下: - **调整兰德指数(Adjusted Rand Index, ARI)**:原始兰德指数简单统计成对元素被正确分配给相同或不同簇的情况比例;经过调整后的版本考虑到了随机猜测的影响因素,在样本数目较少或者簇数量较大时更为适用[^5]。 - **互信息(Mutual Information, MI)** 和 **标准化互信息(Normalized Mutual Information, NMI)** :前者量化了两个分区之间共享的信息量;后者进一步将这个数值归一化以便跨尺度比较不同的聚类方案。 #### 综合评价——F度量 除了上述专门针对聚类特性的测度外,还可以采用源自监督学习领域的一些概念,比如F度量及其变体。这类方法特别适合用来平衡查准率(Precision)和查全率(Recall),尤其是在面对不平衡的数据分布情形下能够给出更合理的评判依据[^4]。 ```python from sklearn.metrics import silhouette_score, davies_bouldin_score, adjusted_rand_score, normalized_mutual_info_score, f1_score # 假设y_true是真实标签,y_pred是预测得到的簇编号,X是输入特征矩阵 silhouette_avg = silhouette_score(X, y_pred) dbi = davies_bouldin_score(X, y_pred) if hasattr(y_true, "__len__"): ari = adjusted_rand_score(y_true, y_pred) nmi = normalized_mutual_info_score(y_true, y_pred) f1 = f1_score(y_true, y_pred, average='weighted') # 如果存在真实的类别标签的话 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值