数据分析案例实战:逻辑回归-信用卡欺诈检测

本文通过逻辑回归分析信用卡欺诈数据集,处理了正负样本分布不均的问题,尝试了下采样和过采样策略。在数据标准化后,使用KFold进行交叉验证,并分析了混淆矩阵和阈值对模型的影响,发现阈值在0.5和0.6时效果较佳。
摘要由CSDN通过智能技术生成

学习唐宇迪《python数据分析与机器学习实战》视频

一、数据分析

数据集部分截取: 在此数据集中,为了保护原始数据的隐私,因此,每一列(特征)的名称没有给出,用V1~V28等表示。类别是最后的Class列,有0和1两种情况,样本数为3W多个。

二、数据处理

1、读入数据并观察数据分布

import pandas as pd #数据分析
import matplotlib.pyplot as plt #画图
import numpy as np #数组矩阵运算

%matplotlib inline 
#将那些用matplotlib绘制的图显示在页面里而不是弹出一个窗口

# pd.read_csv:读入文件。.py文件和数据文件放在同文件夾,可以不用指定绝对路径。
data = pd.read_csv("creditcard.csv")

#value_counts()是一种查看表格某列中有多少个不同值的快捷方法,并计算每个不同值有在该列中有多少重复值。
#sort_index()按照索引排序
count_classes = pd.value_counts(data['Class'],sort=True).sort_index()
print(count_classes)
data.head()

#画柱状图
count_classes.plot(kind = 'bar')
plt.title("Fraud class histogram")
plt.xlabel("Class")
plt.ylabel("Frequency")

从图中可以看出,正负样本分布严重不均,需要到数据进行处理。

采用下采样和过采样两种方法来处理。

2、数据标准化

from sklearn.preprocessing import StandardScaler
#Scikit-Learn-机器学习库 非常实用的机器学习算法库,这里面包含了基本
#你觉得你能用上所有机器学习算法啦。但还远不止如此,还有很多预处理和
#评估的模块等你来挖掘的!

#标准化数据,(x-均值)/标准差,保证每个维度的特征数据方差为1,均值为0,使得预测结果不会被某些维度过大的特征值而主导
# fit_transform()先拟合数据,再标准化
#Series数据类型没有reshape函数 .解决办法: 
#用values方法将Series对象转化成numpy的ndarray再用ndarray的reshape方法.
#reshape(-1,1):变成列向量,给定1列,自动计算多少行(-1)

#data[‘Amount’].values.reshape(-1, 1) 
#print(type(data['normAmount'].values))
data['normAmount'] = StandardScaler().fit_transform(data['Amount'].values.reshape(-1,1))
#去除多余的两列
data = data.drop(['Time','Amount'],axis=1)
data.head()

3、下采样策略处理数据

#提取所有特征所在列
x = data.ix[:,data.columns!='Class']
#提取类别所在列,class列
y = data.ix[:,data.columns=='Class']
#.loc[],通过选取行(列)标签索引数据 
#.iloc[],通过选取行(列)位置编号索引数据 
#.ix[],既可以通过行(列)标签索引数据,也可以通过行(列)位置编号索引数据

#计算class==1的样本数量 并 取出对应的索引值并转换成数组
number_records_fraud = len(data[data.Class==1])
fraud_indices = np.array(data[data.Class==1].index)
print(type(fraud_indices))
print(type(data[data.Class==1].index))
#取出class=0的索引值
normal_indices = np.array(data[data.Class==0].index)

#在normal_indices中随机选择number_records_fraud 数量的样本
#replace = True 在一次抽取中,抽取的样本可重复出现
random_normal_indices = np.random.choice(normal_indices, number_records_fraud,
  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值