大数据分析案例-基于XGBoost算法构建电子商务交易欺诈预测模型
🤵♂️ 个人主页:@艾派森的个人主页
✍🏻作者简介:Python学习者
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+
喜欢大数据分析项目的小伙伴,希望可以多多支持该系列的其他文章
大数据分析案例-基于随机森林算法预测人类预期寿命 |
大数据分析案例-基于随机森林算法的商品评价情感分析 |
大数据分析案例-用RFM模型对客户价值分析(聚类) |
大数据分析案例-对电信客户流失分析预警预测 |
大数据分析案例-基于随机森林模型对北京房价进行预测 |
大数据分析案例-基于RFM模型对电商客户价值分析 |
大数据分析案例-基于逻辑回归算法构建垃圾邮件分类器模型 |
大数据分析案例-基于决策树算法构建员工离职预测模型 |
大数据分析案例-基于KNN算法对茅台股票进行预测 |
大数据分析案例-基于多元线性回归算法构建广告投放收益模型 |
大数据分析案例-基于随机森林算法构建返乡人群预测模型 |
大数据分析案例-基于决策树算法构建金融反欺诈分类模型 |
目录
1.项目背景
2.项目简介
2.1项目说明
2.2数据说明
2.3技术工具
3.算法原理
4.项目实施步骤
4.1理解数据
4.2数据预处理
4.3探索性数据分析
4.4特征工程
4.5模型构建
4.6模型评估
5.实验总结
文末推荐
源代码
1.项目背景
随着电子商务的飞速发展,其已成为现代商业活动不可或缺的一部分。然而,伴随着电子商务交易量的激增,电子商务交易欺诈问题也日益严重。这些欺诈行为不仅给商家带来了巨额的经济损失,更损害了消费者的信任,对电子商务行业的健康发展构成了严重威胁。因此,如何有效地预测和防范电子商务交易欺诈,成为了电子商务领域亟需解决的问题。
传统的欺诈检测方法多依赖于人工规则或专家经验,这些方法在应对复杂多变的欺诈行为时显得力不从心。而机器学习算法,尤其是集成学习算法,以其强大的数据处理能力和自适应性,为电子商务交易欺诈预测提供了新的思路。其中,XGBoost作为一种高效、灵活且可移植的机器学习库,在各类机器学习竞赛中屡创佳绩,并在欺诈检测领域展现出卓越的性能。
XGBoost算法的核心思想是在一棵决策树的基础上不断添加新的树,通过集成多棵树的预测结果来提高整体的预测精度。这种集成学习的策略使得XGBoost能够处理复杂的非线性关系,并有效地应对数据中的噪声和异常值。同时,XGBoost还支持多种损失函数和正则化项,可以根据具体任务的需求进行灵活配置。
在电子商务交易欺诈预测中,XGBoost算法可以通过对大量历史交易数据的训练,学习到欺诈行为的特征和模式。然后,利用这些特征和模式对新的交易进行预测,判断其是否存在欺诈风险。通过构建基于XGBoost算法的电子商务交易欺诈预测模型,我们可以实现对电子商务交易的实时监控和预警,从而及时发现并阻止欺诈行为的发生。
2.项目简介
2.1项目说明
本实验旨在利用XGBoost算法构建一个电子商务交易欺诈预测模型,通过训练历史交易数据,学习欺诈行为的特征和模式,以实现对新交易的欺诈风险预测,提高电子商务交易的安全性。
2.2数据说明
本实验数据集来源于Kaggle,原始数据集分为训练集和测试集,其中训练集共有1472952条数据,16个变量。各变量含义解释如下:
Transaction ID:每个事务的唯一标识符。
Customer ID:每个客户的唯一标识符。
Transaction Amount:交易中交易的总金额。
Transaction Date:交易发生的日期和时间。
Payment Method:用于完成交易的方式(如信用卡、PayPal等)。
Product Category:交易中涉及的产品类别。
Quantity:交易中涉及的产品数量。
Customer Age:进行交易的客户的年龄。
Transaction Date:客户的地理位置。
Device Used:用于进行交易的设备类型(例如,移动设备、桌面设备)。
IP Address:用于交易的设备的IP地址。
Shipping Address:产品发货的地址。
Billing Address :与付款方式相关联的地址。
Is Fraudulent:表示事务是否欺诈性的二进制指示器(1表示欺诈性,0表示合法)。
Account Age Days:客户账户在交易时的存续天数。
Transaction Hour:交易发生的当天的时间。
2.3技术工具
Python版本:3.9
代码编辑器:jupyter notebook
3.算法原理
4.项目实施步骤
4.1理解数据
导入数据分析第三方库并导入数据集
查看数据集大小
查看数据基本信息
查看数值型变量的描述性统计
我们可以看到客户年龄最小值是-16,这是不可能的,所以我们必须修复客户年龄列。
查看非数值型变量的描述性统计
4.2数据预处理
统计数据缺失值情况
可以发现数据集中并不存在缺失值
统计重复值情况
可以发现数据集中并不存在重复值
使用箱线图查看客户年龄分布
定义一个数据预处理函数,并处理我们的数据集
再次查看数据基本信息
数据集已被清理和压缩,其大小从180 MB减少到57MB。
4.3探索性数据分析
交易金额普遍分布在0到1000之间且数据是右偏的。
4.4特征工程
准备建模用到的训练数据和测试数据
对类别变量进行编码处理,对数值变量进行标准化处理
4.5模型构建
训练模型
选择模型
根据结果,XGBoost似乎表现最好,故我们使用其作为本实验训练模型。
4.6模型评估
5.实验总结
心得与体会:
通过这次Python项目实战,我学到了许多新的知识,这是一个让我把书本上的理论知识运用于实践中的好机会。原先,学的时候感叹学的资料太难懂,此刻想来,有些其实并不难,关键在于理解。
在这次实战中还锻炼了我其他方面的潜力,提高了我的综合素质。首先,它锻炼了我做项目的潜力,提高了独立思考问题、自我动手操作的潜力,在工作的过程中,复习了以前学习过的知识,并掌握了一些应用知识的技巧等
在此次实战中,我还学会了下面几点工作学习心态:
1)继续学习,不断提升理论涵养。在信息时代,学习是不断地汲取新信息,获得事业进步的动力。作为一名青年学子更就应把学习作为持续工作用心性的重要途径。走上工作岗位后,我会用心响应单位号召,结合工作实际,不断学习理论、业务知识和社会知识,用先进的理论武装头脑,用精良的业务知识提升潜力,以广博的社会知识拓展视野。
2)努力实践,自觉进行主角转化。只有将理论付诸于实践才能实现理论自身的价值,也只有将理论付诸于实践才能使理论得以检验。同样,一个人的价值也是透过实践活动来实现的,也只有透过实践才能锻炼人的品质,彰显人的意志。
3)提高工作用心性和主动性。实习,是开端也是结束。展此刻自我面前的是一片任自我驰骋的沃土,也分明感受到了沉甸甸的职责。在今后的工作和生活中,我将继续学习,深入实践,不断提升自我,努力创造业绩,继续创造更多的价值。
这次Python实战不仅仅使我学到了知识,丰富了经验。也帮忙我缩小了实践和理论的差距。在未来的工作中我会把学到的理论知识和实践经验不断的应用到实际工作中,为实现理想而努力。
文末推荐
《AI商业应用从入门到精通:基于IP立体化打造》
内容简介
通过AI技术辅助新媒体内容创作,可以更好地进行商业应用,这也是未来的发展趋势。本书系统地介绍了将AI技术与商业应用结合,实现IP的立体化打造,从而获得收益。本书有助于文章、视频、直播内容创作者极大地提升工作效率。
本书共分为10章,分别介绍了IP定位、IP艺名、IP内容创作、打造爆款内容、打造私域群体、AI+IP文案实现基础收益、AI+IP视频实现商业化应用、AI+IP直播实现商业化应用、AI+IP矩阵实现商业化应用,以及AI辅助IP商业化应用进阶版,书中内容囊括了通过AI打造IP的整套方法。无论是新媒体行业的新人还是有经验的老手,都能从这本书中受益。
本书适合希望做个人品牌的读者、个人创业者、新媒体新人、新媒体爱好者、新媒体从业人员,以及相关培训机构参考和阅读。
京东购买链接:https://item.jd.com/14224661.html
源代码
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import plotly.express as px
import time
import warnings
warnings.filterwarnings('ignore')
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import BernoulliNB
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from xgboost import XGBClassifier
from sklearn.metrics import accuracy_score, confusion_matrix, classification_reporttrain_df = pd.read_csv('Fraudulent_E-Commerce_Transaction_Data.csv')
test_df = pd.read_csv('Fraudulent_E-Commerce_Transaction_Data_2.csv')
train_df.head()
train_df.shape
train_df.info()
train_df.describe()
我们可以看到客户年龄最小值是-16,这是不可能的,所以我们必须修复客户年龄列
train_df.describe(include='O')
train_df.isnull().sum()
train_df.duplicated().sum()
px.box(data_frame=train_df,x="Customer Age",width=500,height=300)
def clean_data(df) -> pd.DataFrame: ##我们需要将**Transaction Date**列从对象类型转换为日期时间格式。df["Transaction Date"] = pd.to_datetime(df["Transaction Date"])## 从交易日期提取日、周、月df['Transaction Day'] = df["Transaction Date"].dt.daydf["Transaction DOW"] = df["Transaction Date"].dt.day_of_weekdf["Transaction Month"] = df["Transaction Date"].dt.month## 修复客户年龄mean_value = np.round(df['Customer Age'].mean(),0) df['Customer Age'] = np.where(df['Customer Age'] <= -9, np.abs(df['Customer Age']), df['Customer Age'])df['Customer Age'] = np.where(df['Customer Age'] < 9, mean_value, df['Customer Age'])## 如果“Shipping Address”与“Billing Address”相同,则取值为1,否则取值为0。df["Is Address Match"] = (df["Shipping Address"] == df["Billing Address"]).astype(int)### 删除不相关的特征并向下转换数据类型以减小数据集大小df.drop(columns=["Transaction ID", "Customer ID", "Customer Location","IP Address", "Transaction Date","Shipping Address","Billing Address"], inplace=True)int_col = df.select_dtypes(include="int").columnsfloat_col = df.select_dtypes(include="float").columnsdf[int_col] = df[int_col].apply(pd.to_numeric, downcast='integer')df[float_col] = df[float_col].apply(pd.to_numeric, downcast='float')return dftrain_df = clean_data(train_df)
train_df.head()
train_df.info()
数据集已被清理和压缩,其大小从180 MB减少到57MB。
plt.figure(figsize=(10,4))
sns.histplot(train_df["Transaction Amount"],bins=200)
plt.show()
交易金额普遍分布在0到1000之间
数据是右偏的。
payment_count = train_df["Payment Method"].value_counts()
plt.figure(figsize=(15,4))
plt.subplot(1,2,1)
sns.set_palette('pastel')
colors = sns.color_palette()
plt.pie(payment_count,labels = payment_count.index,shadow=True,autopct='%1.1f%%',colors=colors,wedgeprops=dict(width=0.8,edgecolor="w"))
plt.title("Payment Method")
plt.subplot(1,2,2)
sns.countplot(data=train_df,x="Payment Method",edgecolor="black",linewidth=1, palette="Set2")
plt.show()
我们可以看到所有的付款方式都是平均分配的
category_count = train_df["Product Category"].value_counts()
plt.figure(figsize=(15,4))
plt.subplot(1,2,1)
sns.set_palette('pastel')
colors = sns.color_palette()
plt.pie(category_count,labels = category_count.index,shadow=True,autopct='%1.1f%%',colors=colors,wedgeprops=dict(width=0.8,edgecolor="w"))
plt.title("Product Category")plt.subplot(1,2,2)
ax = sns.countplot(data=train_df,x="Product Category",edgecolor="black",linewidth=1, palette="Set2")
我们可以看到,所有的产品类别也是均匀分布的
quantity_count = train_df["Quantity"].value_counts()
plt.figure(figsize=(15,4))
plt.subplot(1,2,1)
sns.set_palette('pastel')
colors = sns.color_palette()
plt.pie(quantity_count,labels = quantity_count.index,shadow=True,autopct='%1.1f%%',colors=colors,wedgeprops=dict(width=0.8,edgecolor="w"))
plt.title("Quantity")
plt.subplot(1,2,2)
ax = sns.countplot(data=train_df,x="Quantity",edgecolor="black",linewidth=1, palette="Set2")
plt.figure(figsize=(7,4))
sns.histplot(data=train_df, x="Customer Age",bins=150,kde=True,color='orange')
plt.show()
device_count = train_df["Device Used"].value_counts()
plt.figure(figsize=(15,4))
plt.subplot(1,2,1)
sns.set_palette('pastel')
colors = sns.color_palette()
plt.pie(device_count,labels = device_count.index,shadow=True,autopct='%1.1f%%',colors=colors,wedgeprops=dict(width=0.8,edgecolor="w"))
plt.title("Device Used")
plt.subplot(1,2,2)
ax = sns.countplot(data=train_df,x="Device Used",edgecolor="black",linewidth=1, palette="Set2")
hour_count = train_df["Transaction Hour"].value_counts().head(15)
plt.figure(figsize=(10,4))
sns.set_palette('Set2')
colors = sns.color_palette()
ax=sns.barplot(x=hour_count.index, y=hour_count.values,palette=colors)
plt.xticks(rotation=80)
plt.show()
plt.figure(figsize=(5,3))
sns.violinplot(data=train_df, x='Is Fraudulent', y='Transaction Amount')
plt.show()
column = ['Payment Method', 'Product Category', 'Quantity', 'Device Used','Transaction DOW', 'Transaction Month','Is Address Match']
plt.figure(figsize=(10,35))
plot_num = 1
for col in column:plt.subplot(10,2,plot_num)sns.countplot(data=train_df, x=col, hue="Is Fraudulent")plt.xticks(rotation=90)plt.title(col)plt.tight_layout()plot_num += 1
plt.figure(figsize=(10,6))
plt.subplot(1,2,1)
sns.boxenplot(x='Is Fraudulent', y='Transaction Amount', data=train_df)
plt.subplot(1,2,2)
sns.boxenplot(x='Is Fraudulent', y='Transaction Day', data=train_df)
plt.yticks(np.arange(0,32))
plt.show()
## Train Data
train_data = train_df.drop(columns=["Is Fraudulent"])
train_label = train_df["Is Fraudulent"]## Test Data
clean_test_df = clean_data(test_df)
test_data = clean_test_df.drop(columns=["Is Fraudulent"])
test_label = clean_test_df["Is Fraudulent"]
# 获取类别和数值变量名
cat_col = train_data.select_dtypes(include="O").columns
num_col = []
for col in train_data.columns:if col not in cat_col and col != 'Is Address Match':num_col.append(col)# 对类别变量进行编码处理,对数值变量进行标准化处理
transformer = ColumnTransformer(transformers=[('encoding',OneHotEncoder(),cat_col),('scaling',StandardScaler(),num_col)
],remainder='passthrough')
# 初始化分类模型
classifiers = {"Logistic Regression" : LogisticRegression(),"Bernoulli NB" : BernoulliNB(),"Decision Tree" : DecisionTreeClassifier(),"Random Forest" : RandomForestClassifier(),"XGB": XGBClassifier()
}
classifier_name = []
accuracy = []
for name, classifier in classifiers.items():model = Pipeline(steps=[('transformer',transformer),('classifier',classifier)])start_time = time.time()model.fit(train_data, train_label) # 训练模型training_time = time.time() - start_time # 获取模型训练时间test_pred = model.predict(test_data) # 模型预测## 评估模型acc_score = accuracy_score(test_label, test_pred) # 模型准确率conf_mat = confusion_matrix(test_label, test_pred) # 模型混淆矩阵class_report = classification_report(test_label, test_pred) # 模型分类报告print(f"Classifier name : {name}")print(f"Accuracy score : {acc_score}")print(f"Confusion maxtrix : \n{conf_mat}")print(f"Classification report :\n{class_report}")print(f"{name} Training time: {training_time:.2f} seconds")print("="*55)classifier_name.append(name)accuracy.append(acc_score)
pd.DataFrame({"Classifier name" : classifier_name, "Accuracy" : accuracy}).sort_values(by="Accuracy",ascending=False)
# 构建xgboost模型
from xgboost import XGBClassifier
from sklearn.metrics import auc,roc_curve
classifiers = {"XGB": XGBClassifier()
}
model = Pipeline(steps=[('transformer',transformer),('classifier',classifier)])
model.fit(train_data,train_label)
# 画出ROC曲线
y_prob = model.predict_proba(test_data)[:,1]
false_positive_rate, true_positive_rate, thresholds = roc_curve(test_label, y_prob)
roc = auc(false_positive_rate, true_positive_rate)
plt.title('ROC')
plt.plot(false_positive_rate,true_positive_rate, color='red',label = 'AUC = %0.2f' % roc)
plt.legend(loc = 'lower right')
plt.plot([0, 1], [0, 1],linestyle='--')
plt.axis('tight')
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.show()