概述
初衷是因为引用卡欺诈问题相对与其他机器学习问题略有不同,因为二分类数据量差距过大,导致以往的评价方法对其不适用,如下图的284807 笔交易中只有492笔是欺诈行为,如果用以为的准确率评价几乎都在99%以上,但是这并不能说明模型好,因为即使漏掉1个欺诈交易都是损失很大的,所以这篇里引入了召回率和精确率,进行综合评价,详细步骤如下:
- 对数据源中不比较的字段进行删减,对数值型数据进行规范化,因为没有测试集数据,所以进行数据划分。
- 数据建模使用的是LinearSVR,因为LinearSVC 对线性分类做了优化,对于数据量大的线性可分问题,使用 LinearSVC 的效率要高于 SVC。这里我们是假设特征是线性可分的(线性可分就可以理解成用一条线能把两个类别分开),当然也可以使用逻辑回归、决策树、或者是把核函数设置为rbf(高斯核函数)进行尝试。
实现过程
SVM介绍
model = svm.SVC(kernel=‘rbf’, C=1.0, gamma=‘auto’)
kernel代表核函数的选择,它有四种选择,只不过默认是 rbf,即高斯核函数。linear:线性核函数poly:多项式核函数rbf:高斯核函数(默认)sigmoid:sigmoid 核函数这四种函数代表不同的映射方式。
此外引用一位知乎题主的回答,我觉得比较实用:
作者:Jason Gu
链接:https://www.zhihu.com/question/21883548/answer/19693213
- Linear核:主要用于线性可分的情形。参数少,速度快,对于一般数据,分类效果已经很理想了。
- RBF核:主要用于线性不可分的情形。参数多,分类结果非常依赖于参数。有很多人是通过训练数据的交叉验证来寻找合适的参数,不过这个过程比较耗时。我个人的体会是:使用libsvm,默认参数,RBF核比Linear核效果稍差。通过进行大量参数的尝试,一般能找到比linear核更好的效果。至于到底该采用哪种核,要根据具体问题,有的数据是线性可分的,有的不可分,需要多尝试不同核不同参数。如果特征的提取的好,包含的信息量足够大,很多问题都是线性可分的。当然,如果有足够的时间去寻找RBF核参数,应该能达到更好的效果。
此外,sigmoid一般用于处理神经网络,pold虽然可以处理非线性问题,但是训练时间比较长。
数据源下载
数据源
链接:https://pan.baidu.com/s/14F8WuX0ZJntdB_r1EC08HA 提取码:58gp
说明:Class=0 为正常(非欺诈),Class=1 代表欺诈。
代码实现
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn import svm
from sklearn.metrics import confusion_matrix, precision_recall_curve
import warnings
import itertools
warnings.filterwarnings('ignore')
# 混淆矩阵可视化
def plot_confusion_matrix(cm, classes, normalize = False, title = 'Confusion matrix"', cmap = plt.cm.Blues) :
plt.figure()
plt.imshow