iforest(孤立森林)来预测信用卡欺诈

1、数据集介绍

数据还是使用信用卡的数据,数据来自于kaggle上的一个信用卡欺诈检测比赛,数据质量高,正负样本比例非常悬殊,很典型的异常检测数据集,在这个数据集上来测试一下各种异常检测手段的效果。当然,可能换个数据集结果就会有很大不同,结果仅供参考。

信用卡欺诈是指故意使用伪造、作废的信用卡,冒用他人的信用卡骗取财物,或用本人信用卡进行恶意透支的行为,信用卡欺诈形式分为3种:失卡冒用、假冒申请、伪造信用卡。欺诈案件中,有60%以上是伪造信用卡诈骗,其特点是团伙性质,从盗取卡资料、制造假卡、贩卖假卡,到用假卡作案,牟取暴利。而信用卡欺诈检测是银行减少损失的重要手段。

该数据集包含欧洲持卡人于 2013 年 9 月通过信用卡进行的交易信息。此数据集显示的是两天内发生的交易,在 284807 笔交易中,存在 492 起欺诈,数据集高度不平衡,正类(欺诈)仅占所有交易的 0.172%。原数据集已做脱敏处理和PCA处理,匿名变量V1, V2, …V28 是 PCA 获得的主成分,唯一未经过 PCA 处理的变量是 Time 和 Amount。Time 是每笔交易与数据集中第一笔交易之间的间隔,单位为秒;Amount 是交易金额。Class 是分类变量,在发生欺诈时为1,否则为0。项目要求根据现有数据集建立分类模型,对信用卡欺诈行为进行检测。
数据来源链接: https://www.kaggle.com/datasets/mlg-ulb/creditcardfraud/

2、代码

import plotly.express as px
from sklearn.ensemble import IsolationForest
import os
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#plt.style.use('seaborn')
import tensorflow as tf
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import roc_curve, auc, precision_recall_curve
# 工作空间设置
os.chdir('/Users/xinghuatianying/projects/CreditCardFraudDetection')
os.getcwd()

# 读取数据
df = pd.read_csv('creditcard.csv')

# 查看样本比例
num_nonfraud = np.sum(df['Class'] == 0)
num_fraud = np.sum(df['Class'] == 1)
print('num_nonfraud:{}, num_fraud:{}'.format(num_nonfraud,num_fraud))
# 运行结果:num_nonfraud:284315, num_fraud:492
plt.bar(['Fraud', 'non-fraud'], [num_fraud, num_nonfraud], color='dodgerblue')
plt.show()

# 删除时间列,对Amount进行标准化
data = df.drop(['Time'], axis=1)
data['Amount'] = StandardScaler().fit_transform(data[['Amount']])
X = data.drop(['Class'],axis=1)
y = data.Class


# 孤立森林模型训练
iforest = IsolationForest(n_estimators=50,  max_samples='auto',
                          contamination=0.05, max_features=10,
                          bootstrap=False, n_jobs=-1, random_state=1)
                          
# 预测标签 -1:异常, 1:正常
df['label'] = iforest.fit_predict(X)

# 预测异常评分
df['scores'] = iforest.decision_function(X)
print(df[df.label==-1])

# 模型可视化
df['anomaly'] = df['label'].apply(lambda x: 'outlier' if x==-1  else 'inlier')
fig = px.histogram(df,x='scores',color='anomaly')
fig.show()


# TopN准确率评估
n = 500
df =  df.sort_values(by='scores',ascending=True)
df = df.head(n)
cheat_num = df[df['Class']==1].shape[0]
rate = cheat_num/n
print('Top{}的准确率为:{}, 欺诈样本的个数为:{}'.format(n,rate, cheat_num))
# 运行结果:Top500的准确率为:0.252, 欺诈样本的个数为:126


# 结果可视化
fig = px.scatter_3d(df.head(1000),x='V1',
                    y='V2',
                    z='V3',
                    color='Class')
fig.show()

你可能感兴趣的:(异常检测,机器学习算法,python,算法,算法)