自定义绘制ks曲线的函数
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
def plot_ks(y_test, y_score, positive_flag):
y_test.index = np.arange(len(y_test))
target_data = pd.DataFrame({'y_test':y_test, 'y_score':y_score})
target_data.sort_values(by = 'y_score', ascending = False, inplace = True)
cuts = np.arange(0.1,1,0.1)
index = len(target_data.y_score)*cuts
scores = target_data.y_score.iloc[index.astype('int')]
Sensitivity = []
Specificity = []
for score in scores:
positive_recall = target_data.loc[(target_data.y_test == positive_flag) & (target_data.y_score>score),:].shape[0]
positive = sum(target_data.y_test == positive_flag)
negative_recall = target_data.loc[(target_data.y_test != positive_flag) & (target_data.y_score<=score),:].shape[0]
negative = sum(target_data.y_test != positive_flag)
Sensitivity.append(positive_recall/positive)
Specificity.append(negative_recall/negative)
plot_data = pd.DataFrame({'cuts':cuts,'y1':1-np.array(Specificity),'y2':np.array(Sensitivity),
'ks':np.array(Sensitivity)-(1-np.array(Specificity))})
max_ks_index = np.argmax(plot_data.ks)
plt.plot([0]+cuts.tolist()+[1], [0]+plot_data.y1.tolist()+[1], label = '1-Specificity')
plt.plot([0]+cuts.tolist()+[1], [0]+plot_data.y2.tolist()+[1], label = 'Sensitivity')
plt.vlines(plot_data.cuts[max_ks_index], ymin = plot_data.y1[max_ks_index],
ymax = plot_data.y2[max_ks_index], linestyles = '--')
plt.text(x = plot_data.cuts[max_ks_index]+0.01,
y = plot_data.y1[max_ks_index]+plot_data.ks[max_ks_index]/2,
s = 'KS= %.2f' %plot_data.ks[max_ks_index])
plt.title("K-S值曲线图")
plt.legend()
plt.show()
调用函数
"""
y_test: 测试集标签
y_score: 测试集预测标签
positive_flag: 正例标签 比如正例=1 负例=0
"""
plot_ks(y_test, y_score, positive_flag = 1)
![图片](https://i-blog.csdnimg.cn/blog_migrate/2d22252b8480cdb8d1b3c7ecf6342900.png)