数据分析之问题理解和评估指标

136 阅读4分钟

数据挖掘通用化流程

步骤

上图是进行数据挖掘时需要经历的每一个步骤:

  1. 问题建模:对于问题我们拥有了很好的理解,搭建好基本的框架后,进行下一个步骤
  2. 数据分析:数据分析可以为后面的步骤做铺垫
  3. 数据清洗:将脏数据,异常数据,缺失数据或不规范的数据进行清洗,清洗好的数据用于后面的特征工程和训练
  4. 特征工程:构建有价值的特征,这些特征模型是学习不到的,所以我们将这些信息提供给模型,让它可以直接去拿到这样一个信息来去辅助模型更加准确的进行预测。
  5. 模型训练:如果选择一些合适的模型?如何对模型进行调参?
  6. 模型验证:检验模型的效果如何,假设模型效果比较差的话,需要重新回到数据分析部分,不断进行优化
  7. 模型预测:将上一个步骤所产生的模型用于数据预测
  8. 计算排名:即生成最终的结果

名词解析

数据集: 一组样本的集合。

样本: 数据集的一行。一个样本包含一个或多个特征,此外还可能包含一个标签。

特征: 在进行预测时使用的输入变量。

注意:标签是不能作为特征进行训练,但是它和特征去构建一些新的一些特征去使用

问题理解

业务理解

以还款情况为例

假设用户进行借款了,我们预测他什么时候还款,那么我们可以思考一下:影响还款情况的因素有哪些?

上图中我们把影响用户还款情况的因素分成了3部分:还款意愿,还款能力以及其它因素。用户的还款意愿强弱,是直接影响用户还款情况的,比如用户是否存在欺诈倾向,这时候我们可以查询该用户是否黑名单、是否是欺诈团体、所提供的信息是否真实等。还款能力也会影响到用户的还款情况,比如收入水平、消费水平、共债水平(即用户可能多平台借款)、工作变动等。其他因素主要是工作日和节假日。

数据理解

常见的数据包括赛题数据、业务数据等

image.png

评价指标

我们去理解问题时需要了解评价指标

分类指标

  • 典型的有监督学习任务,样本标签为离散型。包括二分类和多分类问题。

  • 应用场景:

    • 信用风险评估
    • 预测肿瘤细胞是良性还是恶性
    • 邮件的分类:正常邮件/垃圾邮件
    • 电信客户流失分析

许多分类问题中,由于类别分布不平衡,正确率无法有效评价分类效果,需要借助一些特定的指标来评价模型。

正确率:TP+TNTN+FN+FP+TP\frac {TP+TN} {TN+FN+FP+TP}

召回率:TPTP+FN\frac {TP} {TP+FN}

精确率:TPTP+FP\frac {TP} {TP+FP}

F1 = 2 精确率 召回率精确率+召回率F_1 = \frac {2\ast 精确率 \ast 召回率} {精确率+召回率}

P-R曲线

  • P-R曲线用来表现模型的分类性能

  • 横轴为召回率(recall),纵轴为精确率(precision)

  • 通过调整分类阈值,可以得到不同的P-R值,从而得到一条 曲线

  • 曲线越靠近(1,1)性能越好

图源:周志华.机器学习.清华大学出版社.2016

由图中我们可以看见在召回率很高的情况下,精确率很难达到高值

ROC曲线与AUC

真正率(TPR)=TPTP+FN\frac {TP} {TP+FN}

假正率(FPR)=FPTN+FP\frac {FP} {TN+FP}

ROC曲线:

  • 考察模型在“一般情况下” 的预测能力
  • 横轴为FPR,纵轴为TPR
  • 曲线越靠近(0,1)证明模型整体预测能力越强

AUC:

  • ROC曲线与横轴FPR之间的面积
  • 取值为[0.5, 1]
  • 数值越大证明模型整体预测能力越强

计算AUC

sklearn.metrics.roc_auc_score(y_true, y_score, *, average='macro', sample_weight=None, max_fpr=None, multi_class='raise', labels=None)[source])

部分参数解析:

参数说明
y_trus真实标签
y_score依次指定每个样本为正类的概率
average一个字符串,用于多分类问题
from sklearn.metrics import roc_auc_score
roc_auc_score((test_y, probs))

对数损失函数

  • 对数损失(log loss),又称逻辑损失(logistic loss)或交叉熵损失(cross-entropy loss),常用于评估分类模型的概率输出

  • 二分类问题对数损失函数公式为: 1n (yilogpi+(1yi)log(lpi))-\frac 1 n \sum(y_ilogp_i+(1-y_i)log(l-p_i))

    • 真实标签取值为{0,1}
    • yiy_i为第i个样本的真实类别
    • pip_i表示第i个样本类别为1的概率

对数损失函数值越小,模型越好

from sklearn.metrics import log_loss
print('损失函数', log_loss(test_y, probs))
print('损失函数的总和', log_loss(test_y, probs, normalize=False))

回归指标

典型的有监督任务,样本的标签为连续型,如收入、销量等

应用场景:

  • 流行病学:吸烟对死亡率和发病率影响的早期证据来自采用了回归分析的观察性证据
  • 金融:资本资产定价模型利用线性回归以及Beta系数的概念分析和计算投资的系统风险
  • 经济学:预测消费支出,固定投资支出,存货投资,一国出口产品购买,劳动力需求,劳动力供给

均方误差(mean squared error):MSE=1n(yiyi)2MSE=\frac 1 n\sum(y_i-y_i^\Box)^2

yiy_i是真实值,yiy_i^\Box是预测值

平均绝对误差(mean absolute error) :MAE=1nyiyiMAE=\frac 1 n\sum|y_i-y_i^\Box|

中值绝对误差(median absolute error): MedAE=median(y1y1,y2y2,...,yiyi)MedAE=median(|y_1-y_1^\Box|,|y_2-y_2^\Box|,...,|y_i-y_i^\Box|)

均方对数误差(mean squared log error):MSLE=1n(log(yi+1)log(yi+1))2MSLE=\frac1n\sum(log(y_i+1)-log(y_i^\Box+1))^2

决定系数R2R^2 (coefficient of determination):R2=SSRSST=1SSESSTR^2=\frac{SSR}{SST}=1-\frac{SSE}{SST}

SST=(yiyi)2SST=\sum(y_i-y_i^\Box)^2

SSE=(yiyi)2SSE=\sum(y_i-y_i^\Box)^2

SSR=(yiyi)2SSR=\sum(y_i^\Box-y_i^\Box)^2

from sklearn.metrics import median_absolute_error
from sklearn.metrics import r2_score

pres_y = lr.predict(test_x)
pres_y_train = lr.predict(train_x)

print('训练集的均方差:', round(mean_squared_error(train_y, pres_y_train), 3))
print('训练集的平均绝对误差:', round(median_absolute_error(train_y, pres_y_train), 3))
print('训练集的中值绝对误差:', round(median_absolute_error(train_y, pres_y_train), 3))
print('训练集的决定系数:', round(r2_score(train_y, pres_y_train), 3))

print('测试集的均方差:', round(mean_squared_error(test_y, pres_y), 3))
print('测试集的平均绝对误差:', round(median_absolute_error(test_y, pres_y), 3))
print('测试集的中值绝对误差:', round(median_absolute_error(test_y, pres_y), 3))
print('测试集的决定系数:', round(r2_score(test_y, pres_y), 3))

离线验证

时序验证

假设我们需要根据历史数据预测未来3天的数据时,假设预测值与未来3天的真实值越相近,就说明两者相关性越高。我们选择是离测试节就未来三天比较近的一部分数据来去作为我们的验证集(离时间分隔点进行划分,选择较近的一部分),将验证集与测试集进行验证

K折交叉验证

我们将数据分为K份,进行K次模型预测,我们选择其中一折数据作为验证集对模型进行验证