Gini和AUC的關係(Gini=2AUC-1真的成立嗎?)

在做信用評分卡研究時,除了用KS/AUC指標,還經常見到基尼係數(gini coefficient)。
gini係數通常被用來判斷收入分配公平程度。

  圖.洛倫茨曲線與基尼係數

  Gini coefficient 是指絕對公平線(line of equality)和洛倫茨曲線(Lorenz Curve)圍成的面積與絕對公平線以下面積的比例,即gini coefficient = A面積 / (A面積+B面積) 。

  但是,業界在實際計算Gini係數時往往用ROC曲線曲線和中線圍成的面積與中線之上面積的比例,也就是Gini=2AUC-1。


  圖.Gini coefficient與AUC

也就是說用ROC曲線去計算Gini的前提是ROC曲線和Gini曲線時重合的,因此Gini coefficient與AUC可以互相轉換:

gini = A / (A + B) = (AUC - C) / (A + B) = (AUC -0.5) / 0.5 = 2*AUC - 1

那問題來了,ROC曲線與Gini的洛倫茲曲線到底是不是重合的呢?

根據《信用風險評分卡研究》這本書中所說公式Gini=2AUC-1「只有在將ROC曲線解釋爲洛倫茲曲線時才成立」,而且「二者並不相同」。

下面仔細看下ROC曲線和洛倫茲曲線的異同點。

ROC空間是一個以僞陽性率(FPR, false positive rate)爲X軸,真陽性率(TPR, true positive rate)爲Y軸的二維座標系所代表平面。

  • TPR: 真陽性率,所有陽性樣本中(TP+FN),被分類器正確判斷爲陽的比例。
    TPR = TP / (TP + FN) = TP / 所有真實值爲陽性的樣本個數
  • FPR: 僞陽性率,所有陰性樣本中(FP+TN),被分類器錯誤判斷爲陽的比例。
    FPR = FP / (FP + TN) = FP / 所有真實值爲陰性的樣本個數

洛倫茲曲線的縱軸是違約數佔違約總量百分比的累計值,也就是TPR,而洛倫茲的橫軸(被拒絕申請的百分比)是(FP+TP)/(TN+FP+FN+TP),當壞樣本很少時,FN和TP的值很小,因而洛倫茲曲線和ROC曲線橫縱軸取值基本一致,曲線基本重合。但當壞樣本較多時,二者不重合,且差距較大。

 

最後的結論是:當樣本中壞樣本極少時可用gini=2AUC-1近似計算,當壞樣本較多,或者好壞樣本接近1:1時,那就得對gini單獨計算比較準確。

 

最後是關於Gini值的計算:

(1) 用公式gini=2AUC-1

from sklearn import metrics
auc_roc_score = metrics.roc_auc_score(target_label, predict_probabilty)
gini_by_roc_score = 2 * auc_roc_score - 1

(2) Gini的python直接計算可用下面文章中的代碼:

https://blog.csdn.net/u010665216/article/details/78528261

def gini(actual, pred):
    assert (len(actual) == len(pred))
    all = np.asarray(np.c_[actual, pred, np.arange(len(actual))], dtype=np.float)
    all = all[np.lexsort((all[:, 2], -1 * all[:, 1]))]
    totalLosses = all[:, 0].sum()
    giniSum = all[:, 0].cumsum().sum() / totalLosses

    giniSum -= (len(actual) + 1) / 2.
    return giniSum / len(actual)


def gini_normalized(actual, pred):
    return gini(actual, pred) / gini(actual, actual)

gini_predictions = gini(actual, predictions) ngini= gini_normalized(actual, predictions)