小言_互联网的博客

qiuzitao机器学习(七):桑坦德银行客户交易预测项目

456人阅读  评论(0)

数据挖掘实战–桑坦德银行客户交易预测项目

一、项目介绍:

这是2019年Kaggle的比赛:

kaggle官网: https://www.kaggle.com/c/santander-customer-transaction-prediction/leaderboard
 
百度云数据集:https://pan.baidu.com/s/1Ph655Ha07eVjCmJoloybsg

赛题介绍:桑坦德银行客户交易预测。您能确定谁进行交易吗?也就是预测是否为目标用户,即 target = 1或者0。二分类。

一共有8800多条队伍,奖金65000美金。其评分机制采用的是ROC曲线。

二、简单介绍ROC曲线


ROC曲线和AUC值一起,他们具有评价学习器性能,检验分类器对客户进行正确排序的能力。

分类器产生的结果通常是一个概率值而不是直接的0/1变量,通常数值越大,代表正例的可能性越大。即ROC曲线越包在外面效果就越好。

图(a)绿色的线就是ROC曲线,随着截断点的变小,TPR随着FPR的变化。注意观察横纵坐标,分别为FPR、TPR。

纵轴:TPR = 正例分对的概率 = TP/(TP+FN),也就是查全率、召回率、反馈率(Recall),也称灵敏度(Sensitivity)。

横轴:FPR = 负例分错的概率 = FP/(FP+TN),也叫做假警报率。

曲线下方的绿色阴影面积就是AUC值。

ROC 曲线下面积代表分类器随机预测真正类(Ture Positives)要比假正类(False Positives)概率大的确信度。

截断点:很多学习器是为测试样本而产生一个实值或概率去进行预测,然后将这个预测值与一个分类阈值进行比较,若大于阈值分为正类,否则为反类,因此分类过程可以看作选取一个截断点。(通常截取点为0.5,大于0.5为正例,小于0.5为负例)

选择不同的截断点对结果的影响很大,截断点的取值区间是【0,1】,如果截断点靠近1,则被判断为正例的数量会变少;如果截断点靠近0,则被判断为正例的数量会变多。横轴的取值范围为【0,1】,x点代表FPR的概率;纵轴的取值范围为【0,1】,y点代表TPR的概率

不同任务中,可以选择不同的截断点,若更注重”查准率”,应选择排序中靠前的位置进行截断,反之若注重”查全率”,则选择靠后位置截断。因此排序本身质量的好坏,可以直接导致学习器不同泛化性能的好坏,这就是ROC曲线的大概思想。

在一个二分类模型中,对于所得到的连续结果,假设已确定一个阀值,比如说 0.6,大于这个值的实例划归为正类,小于这个值则划到负类中。如果减小阀值,减到0.5,固然能识别出更多的正类,也就是提高了识别出的正例占所有正例 的比类,即TPR,但同时也将更多的负实例当作了正实例,即提高了FPR。为了形象化这一变化,在此引入ROC曲线。

三、数据探索、清洗

①导包、库

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt  
import seaborn as sns
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False      
plt.style.use("ggplot") #使用 ggplot  的绘图风格
from sklearn.model_selection import train_test_split
from sklearn.feature_selection import SelectFromModel
from  sklearn import model_selection

②导入训练集并查看数据

data_train = pd.read_csv('train.csv')
data_train.info()
data_train['target'].unique()
data_train.head()


ID_code:用户名

target:用户行为结果。0代表没有交易行为,1代表有交易行为

Var_(0 - 199):涉及到的用户特征变量

共计20万用户信息,涉及特征变量200个。

③导入测试集并查看数据

data_test = pd.read_csv('test.csv')
data_test.info()
data_test.head()


ID_code:用户名

Var_(0 - 199):涉及到的用户特征变量

共计20万用户信息,涉及特征变量200个。

④缺失值查询和补充

由于数据量较大,因此首先要进行缺失值的查询,在此处定义缺失值查询函数:

def missing_data(data):
    total = data.isnull().sum()
    percent = (data.isnull().sum()/data.isnull().count()*100)
    tt = pd.concat([total, percent], axis=1, keys=['Total', 'Percent'])
    types = []
    for col in data.columns:
        dtype = str(data[col].dtype)
        types.append(dtype)
    tt['Types'] = types
    return(np.transpose(tt))
missing_data(data_train)
#missing_data(data_test)

缺失值查询函数的作用在于输出每列元素中缺失的总数以及缺失值相应的百分比,一般来说缺失值相较于数据集比例极小时,可采用均值填充或删除等手法。若缺失值在总元素中占据比例较大,则应当选用其他填补法进行填充(较为典型的有拉格朗日插值法)。


通过缺失值查询函数,我们了解到,容量为20万用户的数据集中并未包含缺失值,这对于我们后续的操作提供了较大的便利性。

四、特征工程,数据可视化

①数据的描述性统计

data_train.describe()


通过描述性统计分析,我们发现各特征单位之间差距较小,单位较为接近。所以无需进行无量纲化处理。

对于不同特征之间数据差异较大的情况,需要进行无量纲化处理(归一化、标准化)

对于不同的特征向量,比如年龄、购买量、购买额,在数值的量纲上相差十倍或者百千倍。如果不归一化处理,就不容易进行比较、求距离,模型参数和正确率精确度就会受影响,甚至得不出正确的结果。

稀疏类型的数据集(稀疏数据是指:数据集中绝大多数数值缺失或者为零的数据)会需要通过计算稀疏相似度或通过数据变化进行处理,而稠密型数据则可以免去大量的数据处理工作,故数据预处理阶段大多需要将稀疏数据转化为稠密数据。

②查看训练集中分类为0与分类为1的用户分布情况

count_classes = pd.value_counts(data_train['target'], sort=True).sort_index()
count_classes.plot(kind='bar') 
plt.title("target 类别统计")
plt.xlabel("target")
plt.ylabel("个数")
print(count_classes)
x = 0,1
plt.xticks(x, x, rotation=0)#调节x坐标的倾斜度,rotation是度数,默认为90
for x, count_classes in zip(x, count_classes):
    plt.text(x, count_classes , '%.2f' % count_classes, ha='center', va='bottom')


我们看到训练集train中,0型用户与1型用户数量分布是不平衡的,即出现了数据偏斜情况,这也要求我们在训练模型时对数据均衡性问题进行处理。


转载:https://blog.csdn.net/qiuzitao/article/details/105717580
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场