国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

使用PySpark計(jì)算AUC,KS與PSI

這篇具有很好參考價(jià)值的文章主要介紹了使用PySpark計(jì)算AUC,KS與PSI。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

當(dāng)特征數(shù)量或者模型數(shù)量很多的時(shí)候,使用PySpark去計(jì)算相關(guān)風(fēng)控指標(biāo)會(huì)節(jié)省很多的時(shí)間。網(wǎng)上關(guān)于使用PySpark計(jì)算相關(guān)風(fēng)控指標(biāo)的資料較少,尤其是PSI計(jì)算不管是國(guó)內(nèi)還是國(guó)外相關(guān)的代碼都沒(méi)有正確的,這里拋磚引玉,寫了三個(gè)風(fēng)控常用的指標(biāo)AUC,KS和PSI相關(guān)的計(jì)算方法,供參考。

AUC

AUC的相關(guān)概念網(wǎng)上已經(jīng)有很多的很好的文章,這里不在贅述,AUC使用的到的計(jì)算公式如下:

\[AUC=\frac{\sum_{i\in positiveClass}rank_i-{\displaystyle\frac{M(1+M)}2}}{M\times N} \]

其中M為負(fù)類樣本的數(shù)目,N為正類樣本的數(shù)目

使用PySpark計(jì)算代碼如下:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-659816.html

from pyspark.sql import functions as F
from pyspark.sql.window import Window

true_y_col = 'y'
pred_y_col = 'pred_y'
date_col = 'day'


auc_df = df.filter(F.col(true_y_col)>=0).filter(F.col(pred_y_col)>=0)\
           .select(true_y_col, pred_y_col, date_col, 'model_name')\
           .withColumn('totalbad', F.sum(F.col(true_y_col)).over(Window.patitonBy(date_col, 'model_name').orderBy(F.lit(1))))\
           .withColumn('totalgood', F.sum(1-F.col(true_y_col)).over(Window.patitonBy(date_col, 'model_name').orderBy(F.lit(1))))\
           .withColumn('rnk2', F.row_number().over(Window.partitionBy(date_col, 'model_name').orderBy(F.col(pred_y_col).asc())))\
           .filter(F.col(true_y_col)==1)\
           .groupBy(date_col, 'model_name')\
           .agg(((F.sum(F.col('rnk2'))-0.5*(F.max(F.col('totalbad')))*(1+F.max(F.col('totalbad'))))/(F.max(F.col('totalbad'))*F.max(F.col('totalgood')))).alias('AUC'))\
           .orderBy('model_name', date_col)

KS

KS統(tǒng)計(jì)量是基于經(jīng)驗(yàn)累積分布函數(shù)(Empirical Cumulative Distribution Function,ECDF)
建立的,一般定義為:

\[KS=\max\left\{\left|cum\left(bad\_rate\right)-cum\left(good\_rate\right)\right|\right\} \]

即為TPRFPR差值絕對(duì)值的最大值。

\[KS=max\left(\left|TPR-FPR\right|\right) \]

KS計(jì)算方法有很多種,這里使用的是分箱法分別計(jì)算TPRFPR,然后得到KS。
使用PySpark計(jì)算代碼如下:

from pyspark.sql import functions as F
from pyspark.sql.window import Window

true_y_col = 'y'
pred_y_col = 'pred_y'
date_col = 'day'
nBins = 10

ks_df = df.filter(F.col(true_y_col)>=0).filter(F.col(pred_y_col)>=0)\
          .select(true_y_col, pred_y_col, date_col, 'model_name')\
          .withColumn('Bin', F.ntile(nBins).over(Window.partitionBy(date_col, 'model_name').orderBy(pred_y_col)))\
          .groupBy(date_col, 'model_name', 'Bin').agg(F.sum(true_y_col).alias('N_1'), F.sum(1-F.col(true_y_col)).alias('N-0'))\
          .withColumn('ALL_1', F.sum('N_1').over(Window.partitionBy(date_col, 'model_name')))\
          .withColumn('ALL_0', F.sum('N_0').over(Window.partitionBy(date_col, 'model_name')))\
          .withColumn('SUM_1', F.sum('N_1').over(Window.partitionBy(date_col, 'model_name').orderBy('Bin')))\
          .withColumn('ALL_0', F.sum('N_0').over(Window.partitionBy(date_col, 'model_name').orderBy('Bin')))\
          .withColumn('KSn', F.expr('round(abs(SUM_1/ALL_1-SUM_0/ALL_0),6)'))\
          .withColumn('KS', F.round(F.max('KSn').over(Window.partitionBy(date_col, 'model_name')),6))

ks_df = ks_df.select(date_col, 'model_name', 'KS').filter(col('KS').isNotNull()).dropDuplicates()

PSI

群體穩(wěn)定性指標(biāo)(Population Stability Index,PSI)是風(fēng)控場(chǎng)景常用的驗(yàn)證樣本在各分?jǐn)?shù)段的分布與建模樣本分布的穩(wěn)定性。在建模中,常用來(lái)篩選特征變量、評(píng)估模型穩(wěn)定性。

計(jì)算公式如下:

\[psi=\sum_{i=1}^n\left(A_i-E_i\right)\ast\ln\left(A_i/E_i\right) \]

其中\(A_i\)代表的是第i個(gè)分箱中實(shí)際分布(actual)樣本占比,同理\(E_i\)代表的是第i個(gè)分箱中預(yù)期分布(excepted)樣本占比

使用PySpark計(jì)算代碼如下:

from pyspark.sql import functions as F
from pyspark.sql.window import Window
from pyspark.sql.functions import when


date_col = 'day'
nBins = 10
feature_list = ['fea_1', 'fea_2', 'fea_3']

df = df.withColumn('flag', when(F.col(date_col) == 'actual_date', 0).when(F.col(date_col) == 'excepted_date', 1).otherwise(None)

quantitles = df.filter(F.col('flag') == 0)\
               .approxQuantile(feature_list, [i/nBins for i in range(1, nBins)], 0.001) # 基準(zhǔn)樣本分箱

quantitles_dict = {col: quantitles[idx] for idx, col in enumerate(feature_list)}
f_quantitles_dict = F.create_map([F.lit(x) if isinstance(x, str) else F.array(*[F.lit(xx) for xx in x]) for i in quantitles_dict.items() for x in i])

unpivotExpr = "stack(3, 'fea_1', fea_1, 'fea_2', fea_2, 'fea_3', fea_3)"

psi_df = df.filter(F.col('flag').isNotNull()).select('flag', F.expr(unpivotExpr))\
           .withColumn('Bin', when(F.col('value').isNull(), 'Missing').otherwise(
            when(F.col('value') < f_quantitles_dict[F.col('varname')][0], 'bin_0')
            .when(F.col('value') < f_quantitles_dict[F.col('varname')][1], 'bin_1')
            .when(F.col('value') < f_quantitles_dict[F.col('varname')][2], 'bin_2')
            .when(F.col('value') < f_quantitles_dict[F.col('varname')][3], 'bin_3')
            .when(F.col('value') < f_quantitles_dict[F.col('varname')][4], 'bin_4')
            .when(F.col('value') < f_quantitles_dict[F.col('varname')][5], 'bin_5')
            .when(F.col('value') < f_quantitles_dict[F.col('varname')][6], 'bin_6')
            .when(F.col('value') < f_quantitles_dict[F.col('varname')][7], 'bin_7')
            .when(F.col('value') < f_quantitles_dict[F.col('varname')][8], 'bin_8')
            .when(F.col('value') < f_quantitles_dict[F.col('varname')][8], 'bin_9')))\
           .groupBy('varname', 'Bin').agg(F.sum('flag').alias('N_1'), F.sum(1-F.col('flag')).alias('N_0'))\
           .withColumn('ALL_1', F.sum('N_1').over(Window.partitionBy('varname')))\
           .withColumn('ALL_0', F.sum('N_0').over(Window.partitionBy('varname')))\
           .withColumn('actual', F.expr('round(N_0/ALL_0, 6)'))\
           .withColumn('excepted', F.expr('round(N_1/ALL_1, 6)'))\
           .withColumn('PSIn', F.expr('round((actual-excepted)*ln(actual/excepted), 6'))\
           .withColumn('PSI', F.round(F.sum('PSIn').over(Window.partitionBy('varname')), 6))

Reference

  • 【風(fēng)控算法】二、SQL->Python->PySpark計(jì)算KS,AUC及PSI
  • 風(fēng)控模型—區(qū)分度評(píng)估指標(biāo)(KS)深入理解應(yīng)用
  • 風(fēng)控模型—群體穩(wěn)定性指標(biāo)(PSI)深入理解應(yīng)用

到了這里,關(guān)于使用PySpark計(jì)算AUC,KS與PSI的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • pyspark 使用udf 進(jìn)行預(yù)測(cè),發(fā)現(xiàn)只起了一個(gè)計(jì)算節(jié)點(diǎn)

    PySpark UDF 只使用一個(gè)計(jì)算節(jié)點(diǎn)的問(wèn)題 原因分析 默認(rèn)的并行度設(shè)置 PySpark在執(zhí)行UDF(用戶定義函數(shù))時(shí),默認(rèn)可能不會(huì)利用所有可用的計(jì)算節(jié)點(diǎn)。這是因?yàn)閁DF通常在單個(gè)節(jié)點(diǎn)上執(zhí)行,并且如果沒(méi)有正確設(shè)置分區(qū),可能會(huì)導(dǎo)致數(shù)據(jù)傾斜或不平衡的分布。 數(shù)據(jù)分區(qū)不足 如果你的數(shù)

    2024年02月01日
    瀏覽(105)
  • 【論文】模型大小計(jì)算方式(或者叫做權(quán)重大小/體積?)單位是MB

    【論文】模型大小計(jì)算方式(或者叫做權(quán)重大小/體積?)單位是MB

    搞不懂,論文里面的 模型大小(Modelsize) 到底是啥?感覺(jué)各有各的說(shuō)法 就單純的網(wǎng)絡(luò)結(jié)構(gòu)的大?。?那就可以說(shuō)成是:網(wǎng)絡(luò)結(jié)構(gòu)定義好了就是一個(gè)模型,可用于訓(xùn)練 還是整個(gè)權(quán)重(網(wǎng)絡(luò)結(jié)構(gòu)+參數(shù))的大??? 可以說(shuō)成:整個(gè)權(quán)重文件包含了網(wǎng)絡(luò)結(jié)構(gòu)和參數(shù),那么這個(gè)訓(xùn)練好的權(quán)

    2024年02月05日
    瀏覽(28)
  • AUC及其意義、判斷標(biāo)準(zhǔn)和計(jì)算方法 - Python

    AUC及其意義、判斷標(biāo)準(zhǔn)和計(jì)算方法 - Python 在機(jī)器學(xué)習(xí)中,AUC(Area Under the ROC Curve)是一種常用的評(píng)估二元分類器性能的指標(biāo),ROC全稱為Receiver Operating Characteristic,用于描述敏感性和特異性之間的關(guān)系。本文將介紹AUC的意義、判斷標(biāo)準(zhǔn)、計(jì)算方法以及使用Python進(jìn)行計(jì)算的實(shí)現(xiàn)。

    2024年04月11日
    瀏覽(18)
  • 國(guó)內(nèi)的程序員數(shù)量是否已經(jīng)飽和或者過(guò)剩?

    首先,國(guó)內(nèi)程序員數(shù)量確實(shí)在逐年增加,特別是近年來(lái)互聯(lián)網(wǎng)行業(yè)迅猛發(fā)展,促進(jìn)了技術(shù)人員需求的增長(zhǎng)。然而,要判斷程序員是否飽和并不是簡(jiǎn)單地看人數(shù)。下面我們細(xì)分幾個(gè)角度來(lái)看看這個(gè)問(wèn)題。 1、合格的程序員數(shù)量不夠 國(guó)內(nèi)的IT領(lǐng)域和互聯(lián)網(wǎng)行業(yè)發(fā)展很快,這也促使

    2024年02月06日
    瀏覽(18)
  • tf和pytorch每輪epoch顯示輸出的auc是如何計(jì)算的

    tf和pytorch每輪epoch顯示輸出的auc是如何計(jì)算的

    tf和pytorch每輪epoch顯示輸出的auc是如何計(jì)算的? 近似 ROC 或 PR 曲線的 AUC(曲線下面積)。 tf1 通過(guò)計(jì)算真陽(yáng)性,假陽(yáng)性,假陰性,真陰性值的計(jì)算策略。 tensorflow AUC streaming_auc_我愛(ài)寫報(bào)告的博客-CSDN博客 Tf2通過(guò)黎曼和進(jìn)行計(jì)算的。 torcheval.metrics.AUC — TorchEval main documentation (

    2024年02月10日
    瀏覽(17)
  • 【計(jì)算機(jī)視覺(jué)】特征融合12種經(jīng)典魔改方法匯總,附配套模型和代碼

    【計(jì)算機(jī)視覺(jué)】特征融合12種經(jīng)典魔改方法匯總,附配套模型和代碼

    特征融合(Feature Fusion)是深度學(xué)習(xí)中的一種重要技術(shù),它可以幫助模型更好地理解數(shù)據(jù)的內(nèi)在結(jié)構(gòu)和規(guī)律,提高模型的性能和泛化能力。另外,特征融合還可以提高模型的分類準(zhǔn)確率,減少過(guò)擬合風(fēng)險(xiǎn),幫助我們更好地利用數(shù)據(jù)集。 目前已有的特征融合方法已經(jīng)取得了顯著

    2024年02月03日
    瀏覽(25)
  • 分類模型評(píng)估指標(biāo)——準(zhǔn)確率、精準(zhǔn)率、召回率、F1、ROC曲線、AUC曲線

    分類模型評(píng)估指標(biāo)——準(zhǔn)確率、精準(zhǔn)率、召回率、F1、ROC曲線、AUC曲線

    機(jī)器學(xué)習(xí)模型需要有量化的評(píng)估指標(biāo)來(lái)評(píng)估哪些模型的效果更好。 本文將用通俗易懂的方式講解分類問(wèn)題的混淆矩陣和各種評(píng)估指標(biāo)的計(jì)算公式。將要給大家介紹的評(píng)估指標(biāo)有:準(zhǔn)確率、精準(zhǔn)率、召回率、F1、ROC曲線、AUC曲線。 所有事情都需要評(píng)估好壞,尤其是量化的評(píng)估指

    2024年02月11日
    瀏覽(98)
  • 模型構(gòu)建——使用邏輯回歸構(gòu)建模型,lightGBM進(jìn)行特征篩選

    模型構(gòu)建——使用邏輯回歸構(gòu)建模型,lightGBM進(jìn)行特征篩選

    新的模型要跟原有方案對(duì)比,而且是通過(guò)實(shí)驗(yàn)證明,特別注意模型和策略不能同時(shí)調(diào)整。一般實(shí)驗(yàn)設(shè)計(jì)包含以下流程: 問(wèn)題:業(yè)務(wù)穩(wěn)定后,可以去掉人工審核嗎? 答 :不可以,一般模型上線后,高分段和低分段的表現(xiàn)較好,但中間段還是需要人工審核;而且即使模型完善后

    2024年02月15日
    瀏覽(23)
  • 使用TimeSformer預(yù)訓(xùn)練模型提取視頻特征

    使用TimeSformer預(yù)訓(xùn)練模型提取視頻特征

    github:GitHub - facebookresearch/TimeSformer: The official pytorch implementation of our paper \\\"Is Space-Time Attention All You Need for Video Understanding?\\\" ?直接按照官方步驟安裝即可,torchvision在安裝pytorch時(shí)就一起安裝好了,我這里選擇安裝1.8版本的pytorch,可以根據(jù)自己的cuda版本自行選擇 pytorch安裝:Previ

    2023年04月15日
    瀏覽(31)
  • Python使用PyQt5實(shí)現(xiàn)計(jì)算平方或者立方

    此源碼為直播時(shí)講解的源碼,我加了注釋

    2024年02月11日
    瀏覽(16)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包