前言
本文运用numpy,pandas库对相关数据进行处理,使用sklearn库基于机器学习中的逻辑回归方法对天猫优惠券的使用情况进行预测,最后用matplotlib和seaborn库进行可视化的展示。
一、数据预处理
数据字段说明
ID 记录编码
age 年龄
job 职业
marital 婚姻状态
default 花呗是否有违约
returned 是否有过退货
loan 是否使用花呗结账
coupon_used_in_last6_month 过去六个月使用的优惠券数量
coupon_used_in_last_month 过去一个月使用的优惠券数量
coupon_ind 该次活动中是否有使用优惠券
#导入要使用的模块
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_absolute_error
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score
import seaborn as sns
#设置正常显示中文和负号
%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei']
#⽤来正常显示中⽂标签
plt.rcParams['axes.unicode_minus'] = False
#⽤来正常显示负号 #有中⽂出现的情况,需要u'内容'
#设置输出全部结果 而非只有最后一个
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
#导入数据
data = pd.read_csv('/基于逻辑回归的天猫优惠券使用情况预测/L2_Week3.csv')
#查看数据
data.head()
#查看数据是否为空值
data.isnull().sum()
#coupon_ind为要预测的目标值
#查看目标值的分布情况
data['coupon_ind'].value_counts(1)
二、变量选择
查看特征值与目标值之间的相关关系
#查看特征值与目标值的相关关系
#进行one—hot编码前
sns.heatmap(data.corr()[['coupon_ind']])
选取特征值
#选取特征值
X = data.iloc[:,0:9]
X.head()
#将类别型变量进行哑变量处理
job = pd.get_dummies(X['job'])
marital = pd.get_dummies(X['marital'])
default = pd.get_dummies(X['default'])
returned = pd.get_dummies(X['returned'])
loan = pd.get_dummies(X['loan'])
#将处理好的哑变量与原来的数据按列连接
XX = pd.concat([X,job,marital,default,returned,loan],axis=1)
进行one-hot编码后目标值与特征值的相关关系
XXX = pd.concat([XX,data['coupon_ind']],axis=1)
sns.heatmap(XXX.corr()[['coupon_ind']])
查看类别型变量的所有类别及类别分布概率情况
X['job'].unique()
data['job'].value_counts(1)
X['marital'].unique()
data['marital'].value_counts(1)
X['default'].unique()
data['default'].value_counts(1)
X['returned'].unique()
data['returned'].value_counts(1)
X['loan'].unique()
data['loan'].value_counts(1)
构建简单for循环 对每个分类变量查看各数据出现的次数 同时绘制直方图。
col_cate = ['job', 'marital', 'default', 'returned', 'loan']
plt.figure(figsize=(25,20),dpi=300)
plt.subplots_adjust(wspace =0.3, hspace =0.3)
for n,i in enumerate(X[col_cate].columns):
plt.subplot(3,2,n+1)
plt.title(i,fontsize=15)
plt.grid(linestyle='--')
X[col_cate][i].hist(color='darkcyan',alpha=0.5)
对数值型变量绘制直方图 查看数据分布
col_num = ['age', 'coupon_used_in_last6_month', 'coupon_used_in_last_month']
X[col_num].hist(bins=20,figsize=(15,10),color ="darkcyan")
将未进行独热编码的特征删除
x = [2,3,4,5,6]
XX.drop(XX.columns[x], axis=1, inplace=True)
XX
三、建模(训练逻辑回归模型)
#分离训练集与测试集
XX_train,XX_test,Y_train,Y_test = train_test_split(XX,data['coupon_ind'],train_size=0.75)
#训练逻辑回归模型,这里由于目标值样本不均衡,采用加权的方式建立模型
model = LogisticRegression(C=1e4,random_state=100,class_weight='balanced')
model.fit(XX_train, Y_train)
#查看训练集的概率
prob = model.predict_proba(XX_train)
pd.DataFrame(prob).apply(lambda x:round(x,4))
四、模型评估
查看预测结果
#查看预测结果的准确率、召回率、f1-score
pred = model.predict(XX_test)
print(classification_report(Y_test,pred,labels=[1,0],target_names=['是','否']))
混淆矩阵及可视化
#做出混淆矩阵
confusion = confusion_matrix(Y_test,pred)
confusion
#混淆矩阵可视化
plt.matshow(confusion,cmap=plt.cm.Blues, alpha=0.8)
plt.title('混淆矩阵')
plt.colorbar()
plt.ylabel('预测')
plt.xlabel('实际')
plt.show()
计算ROC曲线AUC值并可视化
print('截距为:',model.intercept_)
print('回归系数为:',model.coef_)
print('训练集正确率',model.score(XX_train,Y_train))
print('预测值正确率',accuracy_score(Y_test,pred))
#计算ROC曲线AUC值
from sklearn.metrics import roc_curve,auc
fpr,tpr,threshold = roc_curve(Y_test,pred)
roc_auc = auc(fpr,tpr)
print('ROC曲线AUC值:',roc_auc)
plt.figure(figsize=(6, 5))
# 绘制ROC曲线。
plt.plot(fpr, tpr, label="ROC")
# 绘制(0, 0)与(1, 1)两个点的连线,该曲线(直线)为随机猜测的效果。
plt.plot([0,1], [0,1], lw=2, ls="--", label="随机猜测")
# 绘制(0, 0), (0, 1), (1, 1)三点的连线(两条线),这两条线构成完美的roc曲线(auc的值为1)。
plt.plot([0, 0, 1], [0, 1, 1], lw=2, ls="-.", label="完美预测")
plt.xlim(-0.01, 1.02)
plt.ylim(-0.01, 1.02)
plt.xticks(np.arange(0, 1.1, 0.1))
plt.yticks(np.arange(0, 1.1, 0.1))
plt.xlabel('False Positive Rate(FPR)', fontsize=13)
plt.ylabel('True Positive Rate(TPR)', fontsize=13)
plt.grid()
plt.title(f"ROC曲线-AUC值为{auc(fpr, tpr):.5f}", fontsize=14)
plt.legend()
plt.show()