目录
1.信用卡欺诈预测案例
这是一道kaggle上的题目。
我们都知道信用卡,能够透支一大笔钱来供自己消费,正因为这一点,不法分子就利用信用卡进一特性来实施欺诈行为。银行为了能够检测出这一欺诈行为,通过机器学习模型进行智能识别,提前冻结该账户,避免造成银行的损失。那么我们应该通过什么方式来提高这种识别精度呢!这就是今天要说的主题,多模型融合预测。使用到的模型算法有:KNN、SVM、Logistic Regression(LR)、Random Forest。
我会讲到如何使用多模型进行融合计算(模型集成)、模型评估、超参数调节、K折交叉验证等,力求能够讲得清楚,希望大家通过这篇博文能够了解到一个完整的机器学习算法到底是怎样的,如有讲得不到位亦或是错误的地方,望告知!
以下我们正式开始介绍。
数据集下载:https://v2.fangcloud.com/share/a63342d8bd816c43f281dab455
GitHub完整代码:
2.模型集成(model ensemble)
我们先从概念着手,这是我们的地基,要建起高楼大厦,首先地基要稳。
- **多模型:**分类问题是以多个模型计算出的结果进行投票决定最终答案,线性问题以多个模型计算出来的结果求取均值作为预测数值。
那么多模型融合存在着多种实现方法:Bagging思想、Stacking、Adaboost。
2.1Bagging
Bagging是bootstrap aggregating。Bagging思想就是从总体样本当中随机取一部分样本进行训练,通过多次这样的结果,进行投票亦或求取平均值作为结果输出,这就极大可能的避免了不好的样本数据,从而提高准确度。因为有些是不好的样本,相当于噪声,模型学入噪声后会使准确度不高。一句话概括就是:群众的力量是伟大的,集体智慧是惊人的。
而反观多模型,其实也是一样的,利用多个模型的结果进行投票亦或求取均值作为最终的输出,用的就是Bagging的思想。
2.2Stacking
stacking是一种分层模型集成框架。以两层为例,第一层由多个基学习器组成,其输入为原始训练集,第二层的模型则是以第一层基学习器的输出作为训练集进行再训练,从而得到完整的stacking模型。如果是多层次的话,以此类推。一句话概括:站在巨人的肩膀上,能看得更远。
2.3Adaboost
所谓的AdaBoost的核心思想其实是,既然找一个强分类器不容易,那么我们干脆就不找了吧!我们可以去找多个弱分类器,这是比较容易实现的一件事情,然后再集成这些弱分类器就有可能达到强分类器的效果了,其中这里的弱分类器真的是很弱,你只需要构建一个比瞎猜的效果好一点点的分类器就可以了。一句话概括:坚守一万小时定律,努力学习。
2.4图解模型集成
3.案例总流程
-
首先拉取数据到python中。
-
将数据划分成训练集和测试集,训练集由于分类极度不平衡,所以采取下采样工作,使分类比例达到一致。
-
将训练集送入模型中训练,同时以K折交叉验证方法来进行超参数调节,哪一组超参数表现好,就选择哪一组超参数。
-
寻找到超参数后,用同样的方法寻找决策边界,至此模型训练完成。
-
使用模型集成预测测试集,并使用ROC曲线分析法,得到模型的评估指标。
4.初始化工作
啥都不说,先上代码,这里需要说明的就是sklearn.model_selection这个类库,因为老版本和新版本的区别还是很大的,如果巡行报错,尝试着升级sklearn库。
# 数据读取与计算
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# 数据预处理与模型选择
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.metrics import confusion_matrix, precision_recall_curve, auc, roc_auc_score, roc_curve, recall_score, classification_report
import itertools
# 随机森林与SVM
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.neighbors import KNeighborsClassifier
from scipy import stats
import warnings
warnings.filterwarnings("ignore")
# 一些基本参数设定
mode = 2 #投票个数阈值
ratio = 1 #负样本倍率
iteration1 = 1 #总流程循环次数
show_best_c = True #是否显示最优超参数
show_bdry = True #是否显示决策边界
##读取数据,删除无用的时间特征。
data=pd.read_csv('creditcard.csv')
data.drop('Time',axis=1,inplace=True)
5.数据下采样
先回答什么是数据下采样:
**数据下采样:**数据集中正样本和负样本的比例严重失调,这会给模型的学习带来很大的困扰,例如,正样本有100个,而负样本只有1个,模型只是看到了正样本,而学习不到负样本,这回造成模型对负样本的预测能力几乎为0。所以为了避免这种数据倾斜,处理数据使得正样本和负样本的数量基本均等,这样的模型泛化能力才会高。
反观数据上采样也是一样的,只不过是基准样本不一样而已。
这里的数据处理采用下标的方式,较容易运算。
#欺诈类的样本下标
fraud_indices=np.array(data[data.Class==1].index)
#进行随机排列
np.random.shuffle(fraud_indices)
#获取正常样本下标
normal_indices=np.array(data[data.Class==0].index)
np.random.shuffle(normal_indices)
#划分训练集和测试集
train_normal_indices, train_fraud_indices, test_normal_indices
,test_fraud_indices = split_train_test(norma