KS值是用于評估模型預測能力的重要指標。Python中有多種方法可以計算KS值,其中一種最常見的方法是使用scipy庫的ks_2samp函數。
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數組中提取正樣本和負樣本,并計算它們的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
該函數接受兩個數組作為輸入:model_scores表示模型的預測分數,actual_labels表示實際標簽。函數首先將這兩個數組轉換為numpy數組,然后將scores數組按實際標簽分為正、負兩類,并計算它們的CDF值。最后,函數計算正負樣本CDF值的最大差距,即KS值。
該函數有一個額外的參數numbins,用于指定將scores數組分成的等間隔區間的數量,這個參數的值越大,計算出的CDF值越精確,但是也會造成計算時間增加。
使用這個函數計算KS值非常簡單,只需要傳入模型的預測分數和實際標簽即可:
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,說明正負樣本之間的區分度越高。