KS值是用于評估模型預測能力的重要指標。Python中有多種方法可以計算KS值,其中一種最常見的方法是使用scipy庫的ks_2samp函數(shù)。
import scipy.stats as stats def cal_ks(model_scores, actual_labels): # 將scores和標簽分別轉為array類型 model_scores = np.asarray(model_scores) actual_labels = np.asarray(actual_labels) # 從scores數(shù)組中提取正樣本和負樣本,并計算它們的CDF值 pos_scores = model_scores[actual_labels == 1] neg_scores = model_scores[actual_labels == 0] pos_cdf = stats.cumfreq(pos_scores, numbins=100, defaultreallimits=(0,1))[0] / len(pos_scores) neg_cdf = stats.cumfreq(neg_scores, numbins=100, defaultreallimits=(0,1))[0] / len(neg_scores) # 計算KS值 ks = np.max(np.abs(pos_cdf - neg_cdf)) return ks
該函數(shù)接受兩個數(shù)組作為輸入:model_scores表示模型的預測分數(shù),actual_labels表示實際標簽。函數(shù)首先將這兩個數(shù)組轉換為numpy數(shù)組,然后將scores數(shù)組按實際標簽分為正、負兩類,并計算它們的CDF值。最后,函數(shù)計算正負樣本CDF值的最大差距,即KS值。
該函數(shù)有一個額外的參數(shù)numbins,用于指定將scores數(shù)組分成的等間隔區(qū)間的數(shù)量,這個參數(shù)的值越大,計算出的CDF值越精確,但是也會造成計算時間增加。
使用這個函數(shù)計算KS值非常簡單,只需要傳入模型的預測分數(shù)和實際標簽即可:
model_scores = [0.3, 0.8, 0.5, 0.7, 0.2, 0.6, 0.1, 0.9] actual_labels = [1, 0, 1, 0, 1, 0, 1, 0] ks = cal_ks(model_scores, actual_labels) print('KS值為:%.2f' % ks)
輸出結果為:
KS值為:0.75
這表明該模型的預測能力很好,因為KS值越接近1,說明正負樣本之間的區(qū)分度越高。