机器学习实战——《跟着迪哥学Python数据分析与机器学习实战》

跟着迪哥学Python数据分析与机器学习实战

  • 一、基础部分
  • 二、信用卡欺诈检测实战 —— 监督学习
    • 2.1 下采样与过采样
      • 2.1.1 过采样数据生成策略SMOTE
    • 2.2 逻辑回归
    • 2.3 分类结果混淆矩阵
    • 2.4 过采样实战
    • 2.5 实战总结
    • 2.6 版本依赖排错
  • 三、
  • 知识加油站
    • ¥银行卡的分类

一、基础部分

//@PASS,遇到有不会的再写,直接上手实战

二、信用卡欺诈检测实战 —— 监督学习

背景: 信用卡欺诈是指故意使用伪造、作废的信用卡,冒用他人的信用卡骗取财物,或用本人信用卡进行恶意透支的行为,见《信用卡欺诈》 - 百度百科,那么有信用卡欺诈,有没有储蓄卡欺诈呢?有的,比如储蓄卡被他人冒领。

2.1 下采样与过采样

这个项目里的样本数据,异常样本非常少,这时,正常样本和异常样本的比例是不平衡的,正常数据多不是件好事吗?从采集的角度上看是的,但从模型建立角度上看不是,因为这样会导致模型认为数据都很好,就无法因对异常情况,那么只要让正常和异常数据的比例接近即可,方法是下采样和过采样。
(1) 下采样。让正常样本变少一些,可以变得和异常样本数量一样多。
(2) 过采样。造一些异常样本,让异常样本变多一些,这个造的方法是SMOTE数据生成策略。

2.1.1 过采样数据生成策略SMOTE

SMOTE = Synthetic Minority Over-sampling Technique,即合成少数类过采样技术,少数类指的是样本数量较少的类别,且合成的数据不能是一模一样的,这个过程用到了KNN聚类算法,计算每个少数类样本的K近邻,在这个实战项目里就是异常类,此算法过程如下:
(1)对于每一个少数类样本,计算其与所有其他少数类样本之间的距离,并找到其K个最近邻居,这个K被称作采样倍率,K越大,挑选的邻居越多。
(2)从这K个最近邻居中随机选择一个样本,并计算该样本与当前样本的差异。
(3)根据差异比例,生成一个新的合成样本,该样本位于两个样本之间的连线上。合成新样本的计算公式是, x x x是自身样本数据, x ~ \tilde{x} x~是邻居的样本数据
x n e w = x + r a n d ( 0 , 1 ) ∗ ( x ~ − x ) x_{new} = x + rand(0,1)*(\tilde{x} - x) xnew=x+rand(0,1)(x~x)
写成下面的形式也是一样的,随着比例在0到1之间浮动,新生成的数据也在 x ~ \tilde{x} x~ x x x 之间浮动。
x n e w = x ~ + r a n d ( 0 , 1 ) ∗ ( x − x ~ ) x_{new} = \tilde{x} + rand(0,1)*(x - \tilde{x}) xnew=x~+rand(0,1)(xx~)
我觉得下面这种形式应该看起来更舒服
x n e w = a x + b x ~ , ( a + b = 1 , a > 0 , b > 0 ) x_{new} = ax + b\tilde{x}, \quad (a+b=1, a > 0, b > 0) xnew=ax+bx~,(a+b=1,a>0,b>0)

(4)重复上述步骤,生成指定数量的合成样本。

《解决样本不均衡问题:SMOTE过采样详解 - FAL金科应用研究院的文章 - 知乎》

2.2 逻辑回归

Logistic Regression (aka logit, MaxEnt) classifier.逻辑回归(又称为logit,最大熵分类器)

关键代码部分

# 指定算法模型,并且给定参数
lr = LogisticRegression(C = c_param, penalty = 'l1', solver='liblinear')
# 训练模型,注意索引不要给错了,训练的时候一定传入的是训练集,所以X和Y的索引都是0
lr.fit(x_train_data.iloc[indices[0],:],y_train_data.iloc[indices[0],:].values.ravel())

第一行代码新建了一个分类器lr
(1) C_param。惩罚力度,在sklearn包中,这个值越小,代表惩罚力度越大,值越大,惩罚力度越小,源代码的文档里是这么解释这个参数的:C: Inverse of regularization strength,正则化强度的反比。
(2) penalty = 'l1'。代表正则化惩罚项是 J = J 0 + α ∑ w ∣ w ∣ J = J_0 + \alpha \sum\limits_{w}{|w|} J=J0+αww
(3) solver='liblinear'。源代码文档里的描述是Solver: Algorithm to use in the optimization problem,即solver是一种使用在优化问题里的算法,短期内我不追求看懂什么是liblinear,liblinear论文是08年发的,所以教科书是肯定绝对没提过这些东西的,我只想知道liblinear究竟是用来做什么的,Scikit-learn solvers explained 这篇文章对solver的这些算法做了解释,我完全没有看懂,简要总结了两种

solver 含义 讲解或参考论文
newton-cg cg = conjugate gradient 牛顿-共轭梯度法 【数值分析6(3共轭梯度法)苏州大学】
liblinear 大型线性分类库。
liblinear是一个用于解决线性分类和线性回归问题的开源软件库。它通过使用支持向量机(SVM)等算法来执行二元分类、多元分类和回归任务。liblinear支持L1和L2正则化,并能够处理高维特征。它被广泛应用于文本分类、生物信息学、图像分类和人脸识别等领域。—— 大模型的回答
1.LIBLINEAR: A Library for Large Linear Classification.pdf
2.LIBSVM - Wikipedia
3.LIBLINEAR算法解读,想看懂重点读
4.liblinear使用总结

继续看第二行,有了这个分类器lr后,开始对训练集进行fit拟合操作,y_train_data.iloc[indices[0],:].values.ravel()的意思是,将 Pandas DataFrame 转换为 NumPy 数组并展平,这是一个ravel()操作的demo:

df = pd.DataFrame({'num_legs': [2, 4, 4, 6],
                   'num_wings': [2, 0, 0, 0]})
print('example1:\n',df.iloc[df.index, :]) # better than two methods above.
print('example2:\n',df.iloc[df.index, :].values.ravel()) # better than two methods above.

# example1:
#     num_legs  num_wings
# 0         2          2
# 1         4          0
# 2         4          0
# 3         6          0
# example2:
#  [2 2 4 0 4 0 6 0]

2.3 分类结果混淆矩阵

代码调用部分,sklearn.metrics.confusion_matrix

# sklearn.metrics.confusion_matrix(真实标签值,预测标签值)
cnf_matrix = confusion_matrix(y_test_undersample,y_pred_undersample)
真实情况 \ 预测结果 正例 反例
正例Positive TP(真正例) FN(假正例) 此行可定义查全率 R = T P T P + F N R = \frac{TP}{TP+FN} R=TP+FNTP
反例Negative FP(假反例) TN(真反例)
此列可定义查准率 P = T P T P + F P P=\frac{TP}{TP+FP} P=TP+FPTP

查准率:真实值里有多少是预测对的,所以真实值做分母,这个指标更关注你预测的准不准,如果你是三体人的巫师,你可以少说话,追求查准率,否则就要被脱水了。
查全率:预测值里有多少是确实真的,所以预测值做分母,这个指标更关注你找到的多不多,如果你是地球人的医生,那请你多查房,追求查全率,否则病人就要蔫了。

看看下面这个例子,假设一个人积极揽活并且干活,身兼销售和技术双职位,销售拿下拿不下项目,技术完成完不成项目,但假设一个人的精力和客户关系都有限,那么要么项目拿下的多成功的少,要么拿下的少成功的多,这样收益也反而均衡,一鸣惊人和积少成多都有的,不多,拿下一个大项目和拿下多个小项目可以认为是等价的。

人员风格 \ 项目目标 大项目Big 小项目Small
一鸣惊人 TB(完成·大) FS(失败·小) 此行可定义项目拿下率 P = T B T B + F S P=\frac{TB}{TB+FS} P=TB+FSTB
积小成多 FB(失败·大) TS(完成·小) 同上,可定义项目拿下率
此列可定义大项目成功率 R = T B T B + F B R = \frac{TB}{TB+FB} R=TB+FBTB 同左,可定义小项目成功率

这里的拿下率,就可以类比为上面的查全率,关注的是项目拿下的多不多
这里的成功率,就可以类比为上面的查准率,关注的是项目完成的多不多

下面,我们来做一个对现实职场的探讨,我觉得大可以将这类情况往人际交往、情场、官场和其它地方延伸,去做一个验证,看下是不是在中国的社会环境里适用,国外也可以拿去套一套。
好员工”是做的多    又做的好,这类员工,可能会拿一些回扣,但领导对其带来的收益还是满意的,所以睁一只眼,闭一只眼。
清员工”是做的少所以做的好,在有些领导看来,虽然做的事情少,但每件事都狠抓落实,并且到位有成效,所以印象颇为不错。
差员工”是做的多所以难免犯错,这类员工虽然做的事情很多,也有很多事情有成效,但做的事多难免也踩的雷多,犯下的错多,虽然给公司带来了很多收益,也造成了不小的损失,时间一长,就容易给领导留下不好的印象,这种人在某些情况下容易被边缘化,甚至是开除。
平员工”是做的少却也会犯点小错,但在领导的印象里,这种人往往可能还要比上面那类“差员工”还要印象好些,毕竟犯错不多也犯不了大错,带来的损失不大,但要是论提拔却也谈不上,毕竟做的事不多。

2.4 过采样实战

代码运行结果表示,下采样导致了许多样本被误杀,这种宁肯错杀一千,不肯放过一个的态度,在保卫人民财产的行动中固然值得尊敬,但给整个系统的负担太过繁重,并且在实际操作中,会浪费人力物力关注到实际没有问题的卡上,导致真正应该被重点关注的异常信用卡记录,可能没有及时被注意到,从而加剧了信用卡诈骗现象。上面已经提到了SMOTE生成数据的原理,下面是实操。

调用imblearn工具包使用SMOTE算法,没装可以用pip install imblearn安装下,关键代码含义

# 使用SMOTE算法来进行生成负例样本,random_state是随机数种子,作用是控制每次随机生成的结果一致
oversampler=SMOTE(random_state=0)
# 将特征数据和标签传入,得到oversample_features,oversample_labels
os_features,os_labels=oversampler.fit_resample(features_train,labels_train)

imblearn.over_sampling.SMOTE

2.5 实战总结

下采样和过采样实战部分到此结束了,机器学习问题的处理过程,我们的妈妈才是大师。
(1) 分析问题,检查数据。(今天想吃什么菜,挑菜选菜)
(2) 清洗数据,数据预处理。(洗菜,切菜)
(3) 选择建模方法,进行建模。(蒸炸煎煮焖溜熬炖炒,下锅)
(4) 调参。(油盐酱醋放多少)
(5) 分析建模效果。(今天味道怎么样,吃的好不好,吃的饱不饱)

2.6 版本依赖排错

本项目的所有版本依赖错误的解决方法都在这:《机器学习 信用卡欺诈检测 程序迭代错误》

三、

知识加油站

¥银行卡的分类

银行卡 借记卡(不可透支) 信用卡(可透支) 储值卡(无储蓄功能,金额固定,用完需再次充值,常用来送礼) 转账卡(转账、存取现金和消费) 专用卡(专门用途、特定区域)

中国人民银行已经规定商业银行发行全国使用的联名卡、IC卡、储值卡需要得到中国人民银行总行的审批,见:
《银行卡业务管理办法》 —— 中国人民银行
《银行卡种类》—— 西宁中心支行
【不是我针对谁,但在座的各位都不会用银行卡】—— bilibili
《预付卡、购物卡、储值卡有什么区别?卡券冷知识》

你可能感兴趣的:(机器学习,机器学习,python,数据分析)