代码思路分析
1、将原始数据分层同比例拆分训练和测试集
比如将原始数据拆分成 5个训练集和5个测试集合
a 把数据集排成一串 b 然后依次按照元素顺序分割成K份子集 c然后每个子集充当一次测试集,这样可以使得每个样本都在测试集中出现 注意: a 这种划分没有随机性,因为每一份测试集都是从前往后有序排列的 b 所以该方法使用之前需要将数据集执行打乱操作(KFold中设置shuffle=True即可) c 注意:random_state参数默认为None,如果设置为整数,每次运行的结果是一样的。
2、通过训练数据训练模型 得到模型之后预测测试数据
3、根据实际测试数据的结果和测试数据的预测结果来计算每一个阈值的tpr和fpr
4、根据tpr和fpr画auc曲线
处理完一个分组中的训练和测试数据就会生成一个roc曲线
其中的area就是auc面积
计算ROC曲线最佳位置
代码
def rocZeroOne(y_true, y_predicted_porba): from sklearn.metrics import roc_curve from scipy.spatial.distance import euclidean fpr, tpr, thresholds = roc_curve(y_true, y_predicted_porba[:, 1]) best = [0, 1] dist = [] for (x, y) in zip(fpr, tpr): dist.append([euclidean([x, y], best)]) bestPoint = [fpr[dist.index(min(dist))], tpr[dist.index(min(dist))]] bestCutOff1 = thresholds[list(fpr).index(bestPoint[0])] bestCutOff2 = thresholds[list(tpr).index(bestPoint[1])] print('\n' + 'ROC曲线最佳点位置: TPR = {:0.3f}%, FPR = {:0.3f}%'.format(bestPoint[1] * 100, bestPoint[0] * 100)) print('\n' + '最佳截止点: {:0.4f}'.format(bestCutOff1)) plt.plot(dist) plt.xlabel('Index') plt.ylabel('Euclidean Distance to the perfect [0,1]') fig = plt.gcf() fig.set_size_inches(15, 5)
原理分析
1、 该函数的2个入参数 一个是测试数据真实结果 一个是该测试数据的预测结果
2、计算ROC曲线上距离左上角最近的点 就是最好的位置
左上角的点是(0,1)
在数学中,欧几里得距离或欧几里得度量是欧几里得空间中两点间“普通”(即直线)距离
函数则对应 python库 scipy.spatial.distance import euclidean
逻辑回归