机器学习-支持向量机SVM(下)
参数C的进阶
- 支持向量机分类器, 是在数据空间中找出一个超平面作为决策边界, 利用这个决策边界来对数据进行分类, 并使分类误差尽量小的模型.
- 所以软间隔让决定两条虚线超平面向量可鞥来自于同一个类别的样本点, 而硬间隔的时候两条虚线超平面比速是由两个不同类别的支持向量决定
二分类SVC中样本不均衡问题: 重要参数class_weight
- 首先分类模型天生会倾向于多数类, 让多数类更容易被判断正确, 少数类杯牺牲掉
- 其次, 模型的评估指标会失去意义
- 改善样本不均衡问题, {标签的值1:权重1, "标签的值2":权重2}的字典, 则参数C将会自动 被设为: 标签的值1的C: 权重1*C, 标签的值2的C: 权重2*C, 或者使用"balanced"模式, 这个模型使用y的值自动调整与输入数据中的类频率成反比的权重为n_samples/(n_classes*np.bincount(y))
- 从准确率来看, 不做样本平衡的时候准确率反而更高, 做了样本平衡准确率反而变低了, 这是因为做了样本平衡后, 为了有效的捕捉出少数类, 模型无吃撒好难过了许多多数类样本, 而多数被分错的样本数量大于少数被分正确的样本数量, 使得模型整体的精确性下降.
SVC模型评估指标
- 在寻找捕获少数类能力和多数类判错后需要付出的成本,如果一个模型在能够尽量捕获少数类的情况下, 还能尽量对多数类判断正确, 则这个模型就非常优秀, 为了评估这样的能力, 引入新的模型评估指标: 混淆矩阵和ROC曲线
混淆矩阵
- 混淆矩阵时二分类问题的多维衡量指标体系, 在样本不平衡时机及其有用,在混淆矩阵中, 我们将少数类认为时是正例, 多数类认为是负例, 普通混淆矩阵, 一般使用{0,1}来表示, 混淆矩阵中各种各样的名称和定义让大家难以理解和记忆
预测值 | |||
1 | 0 | ||
真实值 | 1 | 11 | 10 |
0 | 01 | 00 |
- 在混淆矩阵中, 永远是真实值在前, 预测值在后, 其实可以看出, 11和00的对角线就是全部预测正确的, 01和10的对角线就是全部预测错误的, 基于混淆矩阵, 我们有6个不同的模型评估指标, 这些评估指标的范围都在[0,1]之间, 所以11和00为分子的指标都是越接近1越好, 所以01和10为分子的 模型的整体效果: 准确率
- 准确率: 就是所有预测正确的样本除以总样本, 通常来说越接近1越好
- 精确度, 又叫查准率, 表示所有被我们预测为少数类的样本中, 真正的少数类所占的比例 在支持向量机中, 精确度是将多数类判错所需付出成本的衡量
- 当每一次将多数类判断错误的成本非常高昂的时候,我们会追求高精确度
- 召回率Recall, 又被称为敏感系数, 表示所有真实为1的样本中, 被我们预测正确的样本所占的比例, 在支持向量机中, 召回率越高, 代表我们尽量捕捉除了越多的少数类, 召回率越低, 代表我们没有捕捉出足够的少数类
- 如果我们希望不计一切代价, 找出少数类, 那我们就会追求高召回率, 相反我们如果的目标不是尽量捕捉少数类, 那我们无法捕捉少数类的代价更高, 注意, 召回率和精确度的分子是相同的, 只是分母不同, 而召回率和精确度是此消彼长的, 两者之间的平衡代表了捕捉少数类的需求和尽量不要误伤多数类的需求平衡
- 为了同时兼顾精确度和召回率, 我们创造了两者调和平均数作为考量两者[平衡的综合性指标, 称之为F1 measure, 两个数之间的调和平局倾向于靠近两个数中比较小的哪一个, 因此我们追求尽量高的F1 measure,能够保证我们的精确度和召回率都比较高, F1 measure在[0,1]之间分布, 越接近1越好
- 从Recall延伸出来的另一个 评估指标叫做: 假负率, 它等于1-Recall, 用于衡量所有真实为1的样本中, 被我们判断为0的概率
- 从Recall延伸出来的另一个 评估指标叫做: 假负率, 它等于1-Recall, 用于衡量所有真实为1的样本中, 被我们判断为0的概率
- 判错多数类的考量, 特异度和假正率
- 特异度: 表示所有真实为0的样本中, 被正确预测为0的样本中所占的比例
- 假正率: 特异度是衡量一个模型将多数类判断正确的能力, 而 1-特异度就是一个模型讲多数类判断错误的能力, 这种能力叫做假正率
ROC曲线
- 模型在尽量捕捉少数类的时候, 误伤多数类的情况下的变化就是ROC曲线
- 概率和阈值
- 在不同的阈值下, 我们的模型评估指标会发生变化, 我专门正利用这一点, 来观察Recall和FPR之间如何让相互影响, 但是注意,并不是升高阈值, 就一定能够增加或者减少Recall, 一切要根据数据的实际分布来进行判断
- SVM中接口decision_function返回的值也因此被我们认为是SVM中的置信度
- ROC曲线通常是凸型的, 对于一条凸型ROC曲线来说, 曲线越靠近左上角越好, 越往下越糟糕, 曲线如果再虚线的下方, 则证明模型完全无法使用, 但是它也有可能是一条凹形的型曲线, 对于一条凹形ROC曲线来说, 应该越靠近右下角越好, 凹形曲线代表模型的预测结果与真实情况完全相反, 那也不算非常糟糕, 只要我们手动将模型的结果逆转, 就可以得到一条左上方的弧线了, 最糟糕的是, 无论曲线是凹形还是凸型, 曲线位于图像中间, 和虚线非常靠近, 那我们拿它无能为力
- 随着recall的变大, FPR的大小越小越好, 所以我们希望找到最优点, 其实是Recall和FPR差距最大的点, 这个点,叫做约登指数
- 最佳阈值选取出来, 由于我们使用的是decision_function来画ROC曲线, 所以我们选择出来的最佳阈值其实就是阈值问题 如哦我们使用的是概率,我们选取的最佳阈值就会是一个概率值了, 只要我们让这个距离/概率以上的点, 都为正类, 让这个距离/概率以下的点都为负值, 模型就是最好的了, 技能捕捉出少数类, 又能够尽量不误伤多数类, 整体的精确性和对少数类的捕捉得到了保证
处理缺失值
- 如果是分类特征, 我们则曹勇众数进行填补, 如果四连续型特征, 我们则采用均值来填补