Bootstrap

传统机器学习模型要怎么来判断每个特征到底是怎么来预测的?

前面一篇文章推出了:图像分类算法,要怎么解释到底是因为什么才判断为A类比、B类比?这种是针对图像模型来进行模型细节分析。与图像相对的还有更加常见的文本数据训练出来的模型,比如推荐模型、搜索模型、风控模型等,这些数据学习出来的模型要怎么来判断到底哪个特征对某个分类最起作用?

1:auc/acc/信息增益等(其中信息增益仅仅适用于决策树模型、逻辑回归模型、ftrl)

拿auc来举例吧,往大范围了说,直接可以拿整个的数据,不管你有100类,还是1000类,只要把label标签变成0 1这种二分类,那么就能计算出来每个特征的auc值,然后判断每个特征在整个数据上的重要性。

再往小范围说,如果是想看某个类别的数据中,哪个特征起的作用最大,可以选用acc这个指标来进行评价。分别用每个特征去预测,看哪个特征取得的acc最高,那就哪个特征的重要性最大了

2:上面都是一些比较常见,而且也比较粗鄙的方法,如果想要更加精细的了解到底在预测过程中,哪个特征对哪个类到底在多大程度,多大概率能起到作用,就像ace论文(上一篇文章)中说到的判断模型到底是因为什么细节才最终预测为了A类别那种精细的程度。

我拿神经网络模型+多分类来举例

众所周知,神经网络模型中,有一层一层的权重,输入层也有很多的特征

(1)一些序列特征会被预训练好的编码模型先转换为“固定维度”的权重,比如是128维度;

(2)还有的会在模型训练中随机初始化这个权重,然后在训练过程中进行迭代更新;

(3)再比如像deepfm还会对每个特征都变换到固定维度(有时候会把所有的特征进行分类,分成N个类别,每个类别会变换到不同的维度 阿里17年双十一做法);

(4)widedeep对于数值型特征还是直接进行concat

上面这些举例的情况,都说明输入层都是一个个我们人类能够理解的特征,所以像ace论文中那样还要划分找到不同的块,然后聚类的操作就不用了。

具体做法是这样:  首先对整体样本(假设有1000类)进行筛选,筛选的原则是你的模型能够正确预测的样本,如果acc是0.8的话,那么最终剩下来的样本就是有 4/5,然后选出来其中一个类别,我们暂且叫A类别,假设选出来5000条样本

然后,用你要判断的某个特征(其他特征全部置默认值)输入到模型中,看最终得分是多少,你会得到5000个得分,得分是float型,然后分桶为20个,统计每个桶的数量,就可以根据数量来判断这个特征“多大概率”会影响到这个类的判断,以及多大程度也可以一起分析出来

3:要想知道N个特征中,是哪些特征影响了某个样本的最终判别,该怎么做?

还是和2中的思路一样,找出来每个特征最终的得分情况,对那些得分为0或者在0上下浮动很小的特征,就可以判断为这些特征对这个样本的预测重要性不大,而那些偏离0非常大的特征就是最终影响到这个样本分类的特征。

分析这个还有一定的好处,你可以把预测错误的样本给找出来,然后看看到底是啥特征(哪些特征)最终使得模型错误预测了这个样本,然后针对这些情况,想一些新的特征 或者 提出一些模型改进的意见来!

;