逻辑回归-项目实战-信用卡检测任务(下)

本文探讨了在信用卡检测任务中,如何应对样本不平衡问题。通过逻辑回归模型,作者比较了下采样和过采样两种方法的效果。下采样虽然使测试集比例均衡,但可能高估模型性能。过采样如SMOTE则能减少误判,改善模型表现。在调整阈值后,过采样方案进一步优化了模型,减少了正常样本被错误标记为异常的情况。总结强调了数据预处理、模型评估、参数调优以及选择合适算法的重要性。
摘要由CSDN通过智能技术生成

逻辑回归-项目实战-信用卡检测任务

混淆矩阵评估分析

混淆矩阵的模板,用的时候会直接复制

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')

预测

import itertools
# 使用最好的参数
lr = LogisticRegression(C = best_c, penalty = 'l1',solver='liblinear')
# 重新训练
lr.fit(X_train_undersample,y_train_undersample.values.ravel())
# 预测
y_pred_undersample = lr.predict(X_test_undersample.values)

# 计算所需值 传入:预测值、测试值
cnf_matrix = confusion_matrix(y_test_undersample,y_pred_undersample)
# 精确位数
np.set_printoptions(precision=2)

print("召回率: ", cnf_matrix[1,1]/(cnf_matrix[1,0]+cnf_matrix[1,1]))

# 绘制
class_names = [0,1]
plt.figure()
plot_confusion_matrix(cnf_matrix
                      , classes=class_names
                      , title='Confusion matrix')
plt.show()

结果
在这里插入图片描述
用下采样的数据集进行建模,并且测试集也是下采样的测试集,在这份测试集中,异常样本和正常样本的比例基本均衡,因为已经对数据集进行过处理。但是实际的数据集并不是这样的,相当于在测试时用理想情况来代替真实情况,这样的检测效果可能会偏高,所以值得注意的是,在测试的时候,需要使用原始数据的测试集,才能最具代表性,只需要改变传入的测试数据即可。
下采样方案在原始数据集中的结果:

lr = LogisticRegression(C = best_c, penalty = 'l1',solver='liblinear')
lr.fit(X_train_undersample,y_train_undersample.values.ravel())
y_pred = lr.predict(X_test.values)

# 计算所需值
cnf_matrix = confusion_matrix(y_test,y_pred)
np.set_printoptions(precision=2)

print("召回率: ", cnf_matrix[1,1]/(cnf_matrix[1,0]+cnf_matrix[1,1]))

# 绘制
class_names = [0,1]
plt.figure()
plot_confusion_matrix(cnf_matrix
                      , classes=class_names
                      , title='Confusion matrix')
plt.show()

结果:召回率有83%,但是可以看到有2239个是正常的但是预测成了异常的,使用过采样看看能否解决此问题。
在这里插入图片描述

过采样

阈值对结果的影响
逻辑回归算法原理,通过Sigmoid函数将得分值转换成概率值,那么,怎么得到具体的分类结果呢?默认情况下,模型都是以0.5为界限来划分类别,实践时可以根据自己的标准来指定该阈值大小。 如果阈值设置得大一些,相当于要求变得严格,只有非常异常的样本才能当作异常;如果阈值设置得比较小,相当于宁肯错杀也不肯放过,只要有一点异常就通通抓起来。

# 用之前最好的参数来进行建模
lr = LogisticRegression(C = 0.01, penalty = 'l1',solver='liblinear')

# 训练模型,还是用下采样的数据集
lr.fit(X_train_undersample,y_train_undersample.values.ravel())

# 得到预测结果的概率值 与之前不同
y_pred_undersample_proba = lr.predict_proba(X_test_undersample.values)

#指定不同的阈值
thresholds = [0.3,0.4,0.5,0.6,]

plt.figure(figsize=(10,10))

j = 1

# 用混淆矩阵来进行展示
for i in thresholds:
#     自己做判断
    y_test_predictions_high_recall = y_pred_undersample_proba[:,1] > i
#     2*2
    plt.subplot(2,2,j)
    j += 1
    
    cnf_matrix = confusion_matrix(y_test_undersample,y_test_predictions_high_recall)
    np.set_printoptions(precision=2)

    print("给定阈值为:",i,"时测试集召回率: ", 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) 

综合召回率和“误杀”结果
在这里插入图片描述

SMOTE过采样方案
  1. 首先找出那个样本是少数样本
  2. 针对少数样本做,
  3. 求出每个少数样本与其他样本的距离,按照最近到远排序,d12,d13,d14
  4. 之后选择一个倍数,列如2
  5. 从距离中选最近的两个,d12,d13,
  6. 按照公式重新计算两个新的样本点
  7. 计算其他样本点
    在这里插入图片描述
    规范说明如下:
    ①步:对于少数类中每一个样本x,以欧式距离为标准,计算它到少数类样本集中所有样本的距离,经过排序,得到其近邻样本。
    第②步:根据样本不平衡比例设置一个采样倍率N,对于每一个少数样本x,从其近邻开始依次选择N 个样本。
    第③步:对于每一个选出的近邻样本,分别与原样本按照如下的公式构建新的样本数据。
    在这里插入图片描述
SMOTE过采样方案

首先在 anaconda pip install imblearn

import pandas as pd
from imblearn.over_sampling import SMOTE
from sklearn.metrics import confusion_matrix
from sklearn.model_selection import train_test_split

读数据,将属性、标签分开

credit_cards=pd.read_csv('creditcard.csv')

columns=credit_cards.columns
# 在特征中去除掉标签
features_columns=columns.delete(len(columns)-1)

features=credit_cards[features_columns]
labels=credit_cards['Class']

切分数据集

features_train, features_test, labels_train, labels_test = train_test_split(features, 
                                                                            labels, 
                                                                            test_size=0.3, 
                                                                            random_state=0)
# 切分数据集

生成

# 基于AMOTE算法进行样本生成,这样正例负例样本数量就是一致的
oversampler=SMOTE(random_state=0)
os_features,os_labels=oversampler.fit_resample(features_train,labels_train)

查看0,1样本数量都是一样的

# 查看训练样本数量
len(os_labels[os_labels==0])

在这里插入图片描述
执行在训练集的上。

os_features = pd.DataFrame(os_features)
os_labels = pd.DataFrame(os_labels)
best_c = printing_Kfold_scores(os_features,os_labels)

测试结果的混淆矩阵

lr = LogisticRegression(C = best_c, penalty = 'l1',solver='liblinear')
lr.fit(os_features,os_labels.values.ravel())
y_pred = lr.predict(features_test.values)

# 计算混淆矩阵
cnf_matrix = confusion_matrix(labels_test,y_pred)
np.set_printoptions(precision=2)

print("召回率: ", cnf_matrix[1,1]/(cnf_matrix[1,0]+cnf_matrix[1,1]))

# 绘制
class_names = [0,1]
plt.figure()
plot_confusion_matrix(cnf_matrix
                      , classes=class_names
                      , title='Confusion matrix')
plt.show()

过采样方案,“误杀”的样本较少,改善了。
在这里插入图片描述

总结

  1. 在做任务之前一定要检查数据,看看数据有什么问题。在此项目中,通过对数据进行观察,发现其中有样本不均衡的问题,针对这些问题,再来选择解决方案。
  2. 针对问题提出两种方法:下采样和过采样。通过两条路线进行对比实验,任何实际问题出现后,通常都是先得到一个基础模型,然后对各种方法进行对比,找到最合适的,所以在任务开始之前,一定要多动脑筋,做多手准备,得到的结果才有可选择的余地。
  3. 在建模之前,需要对数据进行各种预处理操作,例如数据标准化、缺失值填充等,这些都是必要的,由于数据本身已经给定特征,此处还没有涉及特征工程这个概念,后续实战中会逐步引入,其实数据预处理工作是整个任务中最重、最苦的一个工作阶段,数据处理得好坏对结果的影响最大。
  4. 先选好评估方法,再进行建模实验。建模的目的就是为了得到结果,但是不可能一次就得到最好的结果,肯定要尝试很多次,所以一定要有一个合适的评估方法,可以选择通用的,例如召回率、准确率等,也可以根据实际问题自己指定合适的评估指标。
  5. 选择合适的算法,本例中选择逻辑回归算法,详细分析其中的细节,之后还会讲解其他算法,并不 一定非要用逻辑回归完成这个任务,其他算法效果可能会更好。在机器学习中,并不是越复杂的算法越实用,反而越简单的算法应用越广泛。逻辑回归就是其中一个典型的代表,简单实用,所以任何分类问题都可以把逻辑回归当作一个待比较的基础模型。
  6. 模型的调参也是很重要的,通过实验发现不同的参数可能会对结果产生较大的影响,这一步也是必须的。使用工具包时,建议最好先查阅其API文档,知道每一个参数的意义,再来进行实验。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值