首先介绍4个基本的定义:
1) TurePositive(TP):指模型预测为(1)的,并且实际上也是1的观察对象的数量。
2) TrueNegative(TN):指模型预测为0,实际上也是0的观测对象数量。
3) FalsePositive(FP):指模型预测为1,实际上是0的观测对象的数量。
4) FalseNegtive(FN):指模型预测为0,实际上是1的观测对象的数量。
基于以上定义构造如下的混淆矩阵:
- ROC曲线
ROC曲线的纵轴是“真正例率”(TruePositiveRate,简称TPR),横轴是“假正例率”(FalsePositiveRate,简称FPR),两者分别定义为:
- Gain Chart:Gain Chart主要用来评估模型好坏,如下图所示,横轴为营销人数百分比,纵轴为有回应人数的百分比。①表示在向所有客户进行营销的情况下有回应人数的百分比为100%。图中的直线表示随机挑选的一定量的客户进行营销活动所对应的有回应人数的百分比数值,该直线的斜率为45度。而曲线表示根据数据挖掘结果所呈现的营销对象名单进行营销所得到的有回应人数的百分比值。根据图示数据,假定营销人数被限定在总客户人数的20%,若营销对象随机挑选,则有回应人数的百分比为20%,若运用数据挖掘技术所提供的营销对象名单,则有回应的人数的百分比为50%,后者是前者的2.5倍。
通常情况下,我们采用曲线与X轴和Y轴围成的面积的大小来判断模型的好坏,如图所示,面积越大,模型越好,反之则越差。
10)Lift Chart:Lift Chart是在Gain的基础上,保持横轴不变,即营销人数的百分比,而纵轴换为绩效的增益。
11)Profit Chart:Profit Chart表示模型带来的收益,而不是模型的正确率。故要想将Gain Chart 等转换为Profit Cahrt,即必须知道营销活动的收入与成本。
算法实现
## Y_pred_result:预测结果所在的数据框
## pred_Mark: 预测Mark
## real_Mark: 实际Mark
def calIndex(Y_pred_result , pred_Mark , real_Mark ):
## 预测为1,实际为1
TP = len(Y_pred_result.loc[(Y_pred_result[pred_Mark] == 1) & (Y_pred_result[real_Mark] == 1)])
# 预测为0实际为1
FN = len(Y_pred_result.loc[(Y_pred_result[pred_Mark] == 0) & (Y_pred_result[real_Mark] == 1)])
# 预测为1,实际为0
FP = len(Y_pred_result.loc[(Y_pred_result[pred_Mark] == 1) & (Y_pred_result[real_Mark] == 0)])
# 预测为1,实际为0
TN = len(Y_pred_result.loc[(Y_pred_result[pred_Mark] == 0) & (Y_pred_result[real_Mark] == 0)])
return TP , FN , FP , TN
# 准确率
verify_accuracy = accuracy_score(verify_y, verify_predictions) #使用sklearn进行比较正确率
print ("verify Accuary: %.2f%%" % (verify_accuracy * 100.0))
# 命中率
verify_precision = precision_score(verify_y, verify_predictions) #使用sklearn进行比较命中率
print ("precision_score: %.2f%%" % (verify_precision * 100.0))
# 召回率
verify_recall = recall_score(verify_y, verify_predictions) #使用sklearn进行比较命中率
print ("recall_score: %.2f%%" % (verify_recall * 100.0))
# f1-score
f1_measure = f1_score(verify_y, verify_predictions) #使用sklearn进行比较命中率
print ("f1_score: %.2f%%" % (f1_measure * 100.0))