信用卡欺诈检测(机器学习)

2019-03-24  本文已影响0人  Radiance_sty

练习:信用卡欺诈检测

我们拿到的数据都是经过帅选拿到的数据集,这是因为这些数据涉及到相关的隐私,但是这并不妨碍我们测试模型和预测。

运行结果为:

可以看出前6行的结果,然而这并不能看出什么,其实这些都是提取好的特征,可以方便我们进行建模

运行结果为: 运行结果为:

此时,normAmount代替了Amount这一列的数据,数值为经过标准化处理的值。

运行结果为:

运行结果为:


交叉验证可以参考:https://www.cnblogs.com/sddai/p/5696834.html 运行结果为:

通过评估后发现 recall 值符合下采样组合要求,但是误杀太大,超过了允许的范围。

运行结果为:

可以看出,模型中有许多欺诈没有找出来

运行结果为:

可以看出,有9个欺诈的数据没有查找出来,同时有18个正常数据被误杀。
之前我们使用的是Sigmoid函数中默认的阈值:0.5,如果我们自己指定阈值,会对结果产生什么影响呢?

  lr = LogisticRegression(C = 0.01, penalty='l1')
  lr.fit(X_train_undersample, y_train_undersample.values.ravel())
  y_pred_undersample_proba = lr.predict_proba(X_test_unsersample.values)
  # 这里改成计算结果的概率值

  thresholds = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]

  plt.figure(figsize=(10,10))
  
  # 将预测的概率值与阈值进行对比
  j = 1
  for i in thresholds:
      y_test_predictions_high_recall = y_pred_undersample_proba[:,1] > i

      plt.subplot(3,3,j)
      j += 1

      cnf_matrix = confusion_matrix(y_test_undersample, y_test_predictions_high_recall)
      np.set_printoptions(precision=2)

      print("Recall metric in the testing dataset: ", cnf_matrix[1,1]/(cnf_matrix[1,0]+cnf_matrix[1,1]))

      class_names = [0,1]
      plot_confusion_matrix(cnf_matrix, classes=class_names, title='Threshold > %s' %i)
  plt.show()
运行结果为:

从图像中可以看出,当阈值为0.1-0.3时,recall值为1,说明太过严苛。随着阈值越来越大,模型的要求越来越宽松。这里需要根据实际需要,选定一个合适的模型。

运行结果为:

混合矩阵

# 混合矩阵
def plot_confusion_matrix(cm, classes,title='Confusion matrix',cmap=plt.cm.Blues):

plt.imshow(cm, interpolation='nearest', cmap=cmap)
plt.title(title)
plt.colorbar()
tick_marks = np.arange(len(classes))
plt.xticks(tick_marks, classes, rotation=0)
plt.yticks(tick_marks, classes)

thresh = cm.max() / 2.
for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
    plt.text(j, i, cm[i, j],
             horizontalalignment="center",
             color="white" if cm[i, j] > thresh else "black")

plt.tight_layout()
plt.ylabel('True label')
plt.xlabel('Predicted label')
运行结果为:

如图,过采样的测试结果明显优于下采样的测试结果。

小结

采用下采样分析时,Recall值可以达到较高水平,但是误伤的概率较高,预测出的小概率事件发生量明显上升。采用过采样分析时,可以避免这个问题。

上一篇 下一篇

猜你喜欢

热点阅读