目录
数据来源于kaggle
分析中使用的相关算法:逻辑回归分析算法
分析目的:检测出其中的欺诈数据
一、数据描述性展示与数据预处理
这一步一般是了解数据的基本情况,以便后续对数据进行深入的挖掘:
#首先是读取原始数据,一般使用的是pandas
import pandas as pd
data = pd.read_csv('creditcard.csv') #如果数据不在当前目录下面,需要写上路径‘../input/creditcard.csv’
data.head() #展示数据前5行,可以了解数据的大致情况,如有多少列、每列的数据大致的样子等
data.columns #数据列
data.describe() #count/mean/std/min/25%/50%/75%/max
data.isnull().sum().max() #查看是否有空值,有缺失值一般就使用均值等进行填充如data.fillna(data.mean())
这个信用卡的样本数据,没有缺失值,数据还是比较干净的
看看样本数据中标签值的情况(本样本数据中是信用卡欺诈/未欺诈)
print('No Frauds',round(data['Class'].value_counts()[0]/len(data)*100,2),'% of the dataset')#打印未欺诈数据占比
print('Frauds',round(data['Class'].value_counts()[1]/len(data)*100,2),'% of the dataset')#打印欺诈数据占比
out[1]
No Frauds 99.83 % of the dataset
Frauds 0.17 % of the dataset
data['Class'].value_counts()
out[2]
0 284315
1 492
Name: Class, dtype: int64
展示标签值
import seaborn as sns
import matplotlib.pyplot as plt
colors = ['r','b']
sns.countplot('Class',data=data,palette=colors)
plt.title('Class Distributions \n(0:No Fraud || 1:Fraud)',fontsize=14)
plt.xlabel("Class")
plt.ylabel("Frequency")
数据归一化(标准化)处理
这是一个不均衡数据集,需要对数据进行均衡处理,在处理不均衡数据之前,如果数据之间的量级比较大,就需要对数据进行归一化处理。
- 作用:
1、将数据映射到指定范围,通常是映射到-1~1或者0~1之间;
2、把有量钢的表达式变成无量钢表达式,便于不同单位或量级的指标能够进行比较和加权;
- 常用方法:
1、Min-Max归一化
2、Z-Score标准化
即减去均值除以方差,将原数据转换为符合均值为0,标准差为1 的标准正太分布的新数据。
作用:
1)可以提升模型的收敛速度(加快梯度下降的求解速度);
2)提高模型的精度(消除量级和量钢的影响);
3)简化计算
以上两种方法的性质和如何选择
性质:归一化/标准化实质是一种先行变换,线性变换不会改变原始数据的数值排序,这样数据在改变之后不会造成“失效”,反而可以提高数据的表现;
怎么选择:如果单纯想实现消除量级和量钢的影响,在数据的分布本身就服从正态分布或者有离群值时使用Z-Score 方法。因为min-max方法对离群值十分敏感。
3、Robust标准化
虽然Z-sore 可以处理数据中有离群值的情况,但是效果不是很好,所以一般在实际工作中会使用Robust标准化方法
This Scaler removes the median and scales the data according to the quantile range
四分位距离,即排除outliers
在该样本中我们发现给出的有列名的字段['Time'] ['Amount'] 数据之间的差距较大,需要对其做归一化处理
from sklearn.preprocessing import StandardScaler #导入包
data['standard_amount']=StandardScaler().fit_transform(data['Amount'].values.reshape(-1,1)) #将数据归一化为[-1,1]之间的数
data['standard_Time'] = StandardScaler().fit_transform(data['Time'].values.reshape(-1,1))
data.drop(['Time','Amount'],axis=1,inplace=True) #删除原来的数据
data.head()
训练与测试数据划分
from sklearn.model_selection import StratifiedKFold
x=data.