机器学习(4)-实例:信用卡欺诈检测

来源:互联网 发布:linux boot repair 编辑:程序博客网 时间:2024/06/05 18:17

背景

从提供的银行数据中,找出信用卡欺诈样本

样本不均衡的解决方案

  • 由于欺诈样本属于少数样本,导致正常样本回远大于异常样本,直接计算会导致效果很差
  • 下采样(undersample):随机选择和异常样本一样多的正常数据和异常数据一同进行训练进行
  • 过采样(oversample):利用生成算法,生成和正常样本一样多的异常样本

交叉验证

  • 交叉验证可使得训练的结果更加稳健
  • 将数据分割成训练集(80%)和测试集(20%)
  • 在训练集中,平均分成n分,每次取其中的1份作为评估集合,剩下的作为训练集合,然后取n次计算的平均值作为最终结果
  • 使用sklearn进行测试集和训练集合的切分
from sklearn.cross_validation import train_test_split# X表示特征数据,y表示标签数据,都是矩阵,test_size表示要切分的测试集大小,0.3表示30%,random_state是随机种子,不设置每次生成的数据都不一样X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 0)
  • 使用KFold进行交叉验证时需要的数据切割取值
from sklearn.cross_validation import KFold# 第一个参数是长度,第二个参数是分成几份,shuffle表示是否进行洗牌# 返回值可理解为五个对象,每个对象都包含测试集和训练集fold = KFold(len(y_train), 5, shuffle=False)# enumerate 方法把fold转化为枚举值for iteration, indices in enumerate(fold,start=1):    print(indices[0])#训练集    print(indices[1])#测试集 

逻辑回归

  • 利用sklearn.linear_model的LogisticRegression直接使用逻辑回归
from sklearn.linear_model import LogisticRegression#逻辑回归模型,C为惩罚项力度,penalty表示正则化惩罚项的计算算法‘l1’lr = LogisticRegression(C = 0.01, penalty = 'l1')# 训练,第一个参数:特征矩阵X,第二个参数:标签矩阵y, ravel():转化为1维数组lr.fit(x_train_data.iloc[indices[0],:],y_train_data.iloc[indices[0],:].values.ravel())

样本不均衡的模型评估方法

  • 不能单纯使用准确率(如会把所有数据都预测为正常的模型,假如有1000个样本。10个是异常的,那么准确率是99%,显然这样评估是错误的)
  • recall(召回率)
    • Recall = TP/(TP+FN),TP(TruePositive)表示预测为正常并且预测正确的数量,FN(FalseNegative)表示预测为异常但是预测错误的数量
  • (混淆矩阵)Recall没有考虑的误杀率,既FN(FalseNagative),预测为异常但是预测错误,所以有可能导致误杀率很高,可以通过调节阈值来降低FN

参数对结果的影响

  • 惩罚力度参数
    • 可以定义一系列参数,生成不同的模型,来评估获取最优参数
c_param_range = [0.01,0.1,1,10,100]for c_param in c_param_range:          # enumerate 转化为枚举值,iteration:枚举编号,indices:枚举值       for iteration, indices in enumerate(fold, start=1):           # 获取逻辑回归模型,使用参数c,惩罚项为l1算法           lr = LogisticRegression(C = c_param, penalty = 'l1')
  • 阈值
    • 使用predict_proba返回的是概率值
# 取得概率值的返回结果 y_pred_undersample_proba =lr.predict_proba(X_test_undersample.values)# 返回概率大于0.8返回1,小于0.8返回0的矩阵y_test_predictions_high_recall = y_pred_undersample_proba[:,1] > 0.8

样本生成(SMOTE)

  • 过采样:smote样本生成算法
from imblearn.over_sampling import SMOTE# 生成SMOTE模型oversampler=SMOTE(random_state=0)# 训练os_features,os_labels=oversampler.fit_sample(features_train,labels_train)

sklearn数据标准化

  • 将数据标准化到-1~1之间或者0~1之间
from sklearn.preprocessing import StandardScaler# StandardScaler()..fit_transform(data)标准化的操作data['normAmount'] = StandardScaler().fit_transform(data['Amount'].reshape(-1, 1))

过采样有点

  • 模型精度提高(包括recall和误杀率)