渣渣 2019-01-13
在本文中,我们将介绍可视化学习的SVM模型及其在真实世界数据上的性能的技术。
本文包含以下部分:
在机器学习线性分类器中,任何一个模型都有一个假设函数在模型输入和预测输出之间的映射。
Logistic回归,Naive Bayes和判别分析等许多模型都是线性模型的例子。
线性模型相对于神经网络(非线性模型)的主要优点是特征权重直接对应于模型中特征的重要性。因此,很容易理解机器学习模型“学到了什么”。
训练L1正则化回归模型,很明显我们机器学习数据集中的大多数特征与预测输出完全无关。特征0,1对模型做出了正贡献,而给定示例中特征2,3,4的存在导致对输出的负贡献。
任何线性模型的核心是输入示例和参数/权重向量之间的点积。在线性回归的情况下,这是整个假设函数。其中逻辑回归通过sigmoid函数馈送点积,使得输出在0和1之间,因此适用于二元分类问题。
在考虑分类问题时,线性模型的缺点是最终的决策边界是直线、平面或超平面,其系数等于模型的权重/参数,因此只能对线性可分的数据进行分类,这在处理更复杂的分析问题时是一个很大的限制。
我们可以看到简单的线性模型无法将两个“嘈杂的双曲线”分开,因为它只能通过数据拟合平面/直线。第二个例子使用非线性模型(实际上是一个核技巧,我们很快就会得到这个)
支持向量机(SVM)是唯一可以对不可线性分离的数据进行分类的线性模型。
您可能会问作为线性模型的SVM如何使线性分类器拟合非线性数据。直观地使用简单的线性回归模型,我们可以手动设计x,x²,x³,...特征,以尝试实现非线性数据点集的拟合。
虽然特征X是我们预测y的唯一自变量,,它与x具有固有的非线性关系,我们可以设计x²和x³特征来改善我们对y的拟合。
将这种直觉传递给我们的SVM,当我们设计x²特征时,我们基本上将特征x乘以它自身。因此,假设我们通过将特征x1,x2,x3 ......的组合相乘来从我们的数据集中设计特征,然后理论上我们最终可以得到一个空间,在这个空间中,您的工程特征可以线性分离。以前面的简单示例为例,看看下面的数据如何在x³特征空间中转换为几乎线性的趋势。
我们可以看到通过将x轴从x的原始特征空间变换到x³的特征空间,如何将模型视为x³和y之间的线性关系。
不幸的是,要使用复杂的数据集来实现这一点,需要创建的不仅仅是三维空间(特征x,x²,x³),而实际上是高维特征空间,对于我们机器学习数据集中的每个示例来说,计算成本非常高。下面我展示一个函数ø(x)的例子,它采用我们的原始特征x并将它们组合起来以创建二阶多项式特征。
在我们继续之前:我将使用x的符号来表示数据点/训练示例,用上标来表示特定的数据点,用下标来表示特定的特征。
这是一个典型的高维空间,如果我们最初有100个特征,那么这个特征将产生100 * 100工程特征。这在计算上是昂贵的,在这种情况下Big-O(n²)时间复杂度,考虑必须编写两个嵌套的for循环来生成由ø(x)产生的所有组合。
幸运的是,对于我们来说,有一种解决这个计算复杂性难题的方法!当我们推导出SVM的优化问题时,结果是,训练输入x的特征向量只出现在整个优化公式中的一个位置(用红色突出显示)。
此点积用于我们的原始特征空间,因此现在可以取代它(使用函数ø特征空间)。
那么这有助于降低计算复杂度吗?根据点积的定义,我们取ø(x(i))的第i个条目并将其乘以ø(x(j))的第i个条目,然后将所有这些相加以获得一个scaler。应用此我们得到:
我们可以通过核技巧的简单代数操作完全去除计算ø(x)。现在,我们拥有高维特征空间的所有优势,而无需额外的计算复杂性
核技巧是原始方程的一个非常简单的重新排列,我们可以看到我们完全删除了ø(x)并且只需要使用我们的原始输入特征执行计算,但仍然具有计算高维空间的效果。
我们现在要做的就是将涉及ø(x)的点积替换为核等价物(K(x ^ i,x ^ j)):
简单替换,请注意我们的内核在这里使用x和z只是为了删除上标符号。
类似地,当我们想要使用我们的模型进行预测时,我们从不明确地计算高维空间的权重,而是使用核技巧来进行预测:
总之,我们可以用核函数技巧把一个非线性数据集转换成一个线性可分的数据集,只是在高维空间中。在SVC实现中,Sklearn预装了许多内核,包括Radius Basis Kernel (RBF) 和多项式核,每个核都有自己的超参数,可以通过交叉验证进行实验调整,以获得最佳结果。
我们说线性模型的巨大好处是模型的权重/参数可以被解释为特征的重要性。一旦我们设计了高维或无限维特征集,模型的权重隐含地对应于高维空间,这对帮助我们的理解没有用。
相反,我们可以做的是拟合逻辑回归模型,该模型在给定原始特征的情况下估计标签y为1的概率,其中f(x)是SVM决策函数:
我们使用最大似然估计来拟合该逻辑回归模型的参数,该技术称为Platt Scaling。
那么这如何帮助我们理解SVM的工作原理呢?我们只需拟合模型并在机器学习数据集中选择一个点进行评估,然后通过一系列值一次扰乱一个特征,同时保持其他特征的固定。我们可以使用它来绘制模型对每个特征的灵敏度图表。
SKlearn在SVC模型中内置了这个特性,您只需在初始化时确保probability=true,然后使用clf.predict_proba(X)函数来获得概率。
在实践中,我发现,不仅仅是围绕单个点进行评估,通常更好地对相关点的集合进行采样,例如。40个负面例子并按特征平均概率分布,以获得更具代表性的东西。
这是NFL Punt Analytics Kaggle比赛时所做的一个例子,研究各种特征对脑震荡的影响:
我取了所有负面的例子并对它们的概率进行了平均,我用红色标出了玩家最有可能遭受脑震荡的区域。如果你有一堆像playerrole这样的one hot编码变量,一个技巧就是将它们聚合到一个条形图中,然后看看特征出现和不出现之间的净概率变化。
当您处理涉及SVM的高维模型时,能够可视化模型如何对数据点进行分类而不仅仅依赖于F1分数或ROC AUC等指标,这将是一件好事。
虽然有些人可能会使用主成分分析等技术来对分类进行可视化,但这样做会破坏我们的特征空间的尺寸,从而扭曲我们想要实现的视觉效果。
我发现一种很好的技术称为“Histogram of projects”,它涉及为训练和测试集绘制SVM决策函数输出的分布图。
在SKlearn的SVC实现中很容易获得决策函数,只需调用decision_function(X)。您需要跟踪数据集标签,以便对投影直方图进行颜色编码,如下所示:
投影的直方图很容易解释。直方图x轴标识特定训练示例距SVM的决策边界的距离(由中心虚线指示)
支持向量机在决策边界两边都有一个等于1的分离边界,这是对偶优化问题的一个强制约束(“支持向量”是位于这些边界上的数据点)。您会注意到,在上面的模型中,有一些泄漏进入了边缘区域,并且确实从一个类跨越到决策边界的另一边的类。这是因为我们设置了正则化超参数C > 0(它允许在一些错误分类和最小化SVM目标函数之间进行权衡)。
尽管使用高维特征空间,该图表仍然成功地可视化了决策边界区域和所有分类,并且没有损失维数。在混淆矩阵中看到的所有指标(即真阳性、假阳性、真阴性和假阴性的数量)也可以通过直方图看到。它还使我们能够观察一个模型是否很好地泛化到测试集。如果测试集的决策函数输出分布与训练集相似,那么我们可以说这个模型在泛化方面有很好的表现。该模型还可用于确定给定的超参数下机器学习数据集是否线性可分。
当一个数据集对于一个类相对于另一个类具有不成比例的数量时,我们说它是不平衡的。
现实世界数据集的示例,其不平衡超过3000:1
这通常发生在现实世界的数据中,无论是识别恶性组织,信用卡欺诈还是运动中的脑震荡,都是由于我们希望正确识别事件的相对罕见性。
对于使用不平衡数据的机器学习(ML)模型,有两种普遍接受的做法:
选项1:SMOTE
我们可以通过两种方式重新采样数据,方法是删除现有实例(欠采样)或添加新实例(过采样)。最常被接受的方法是使用称为SMOTE的算法对少数类进行过采样
它比名称简单得多,对于数据集中的每个少数点,它选择k个最近的其他少数点实例(通常是5个),并沿着“连接”现有少数点实例的直线随机插入新的少数点实例。
这是一个合理的事情,因为我们只是假设通过在类似的现有示例之间进行插值,我们将获得同一类的新示例。
我们可以看到SMOTE如何沿着现有点生成新的数据点
这往往会显着改善机器学习模型的性能,并有助于推广少数实例的决策边界。
选项2:将权重引入目标函数
另一种可以采用的方法是在目标函数中赋予较高的权重来对少数样本进行误分类。这将“激励”算法正确分类少数实例。
一个合理的经验法则是将训练样例作为最少的特征的10倍。如果您有大量的训练数据,最好使用少于50,000个训练样例,因为sklearn中的SVC实现具有O(n³)复杂度,这意味着收敛到解决方案的时间随着训练实例的数量而立即增长。
它通常值得在较小的机器学习数据集上进行训练,并调整机器学习模型的超参数。您可以为模型选择保留一个小的交叉验证测试集。尽管您可能使用的实际数据比例很小,但您在测试剩余数据集时模型的概括程度会令您感到惊讶。
注意:如果您对此不熟悉,建议使用sklearn的列车测试拆分模块并设置随机种子,以便您可以重现结果。