分类是在一群已经知道类型的样本中,训练一种分类器,让其能够对某种未知的样本进行分类。分类算法的分类过程就是建立一种分类模型来描述预定的数据集或概念集,通过分析由属性描述的数据库元组来构造模型。
分类算法是属于一种有监督机器学习,每个分类器都是需要训练数据。分类算法的大体有三个过程:训练、评估和调优。
训练是有监督学习算法分析和推理训练数据,使得算法可以产生输出结果的过程。训练之前我们已经将特征提取完成,将这些特征集送入我们选择的算法中,这个算法对这些数据和输出已经识别和学习。算法得到的解结果就是一个分类模型。我们期望该模型可以预测未来新数据的类别。
评估即是评价模型的预测性能,检验它的学习效果如何。通常我们会使用验证数据集,也称为测试集。将测试集输入到该模型中,得到的结果是否为本身真实的类别。一般情况下,我们会把一份数据分成两份,一份用于训练,一份用于测试。评估指标一般有准确率、召回率和F1 source等。
调优就是参数优化,我们想要得到更高准确率,减少预测的错误。通常每个模型的核心算法都是带着各种参数的数学公式,这些参数反映了模型的复杂度和学习能力。我们通过调节这些参数来反复的训练模型,以得到理想的预期效果。
目前比较常用的分类算法有:朴素贝叶斯、决策树、逻辑回归、支持向量机、随机森林k-近邻(KNN)等,这些算法在sklearn库都已经完成实现,所以我们的目标并不会去详细说明每个算法是怎么计算的,这里仅仅将一些核心的数学公式以及这些算法的使用上的优缺点。
贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。而朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法。
朴素贝叶斯法利用贝叶斯定理首先计算联合概率分布,再计算条件概率分布。这里的“朴素”是指的假设每个特征和其他特征是独立的。
从这个方程中,结合MAP(Maximum A Posteriori,最大后验概率)决策规则建立贝叶斯分类器。分类器可以表示为:
在现实情况下,数据和特征可能并不是独立的,但是该算法在许多分类的场景下还是可以高效的工作,比如常见的文档分类和垃圾邮件过滤,它们需要一些训练数据来估计必要的参数。
以上就是朴素贝叶斯的核心计算公式,还有一种叫多项式朴素贝叶斯是上面算法的扩展,看名字其实可以得出,这里的分类类型或者是输出特征是大于2的。
在scikit-learn库中的MultinomialNB就是一个很好的多项式朴素贝叶斯的实现,后面我们在文本分类的时候会使用这个库的函数作为一个构建分类器。
逻辑回归(Logistic Regression)是一种用于解决二分类(0 or 1)问题的机器学习方法,用于估计某种事物的可能性。
逻辑回归虽然名字里带“回归”,实际上是一种分类方法,主要用于两分类问题,输出只有两种,分别代表两个类别。比如某一封邮件是不是垃圾邮件,结果为是或者否。
Logistic回归通过使用logistic函数估计概率,来衡量标签与一个或多个特征之间的关系。
逻辑回归模型的假设是:
Logistic函数当z趋近于无穷大时,趋近于1;当z趋近于无穷小时,趋近于0。
模型的返回值始终处在0和1之间,其实也就是表示数据属于某一个分类的概率,例如:
这里选择0.5作为阈值,只是一般的做法,在实际应用中,可以根据实际情况选择不同的阈值。
当然这仅仅是逻辑回归算法的基础模型,实际上的实现并没这样一个函数就可以解决,不过这里我们并不会重点考虑算法的实现细节。
在scikit-learn库中的LogisticRegression就是一个逻辑回归算法的实现,之后在分文分类案例中也是用到此模型作为一个分类器。
逻辑回归分类算法实现简单,也被广泛应用于工业问题上,此外它还具有计算量小,速度快,占用储存资源低,易于实现和理解。
当然如果特征空间很大时,逻辑回归的性能并不是好,也不能很好处理多类特征,处理两分问题是优势同样也是其局限性。
除了上述两个小节中常用的分类算法,还有比如支持向量机、决策树分类器等分类算法。这些算法均在scikit-learn库中都有实现,如表所示是各个分类算法的优缺点以及在sklearn库的相关实现的函数名。
分类算法 | 优点 | 缺点 | Sklearn实现 |
---|---|---|---|
朴素贝叶斯 | 1.对小规模的数据表现很好,可以处理多分类任务,适合增量式训练2.对缺失数据不太敏感,算法也比较简单,常用于文本分类。 | 分类类别比较多或者属性之间相关性较大时,分类效果不好 | MultinomialNB |
逻辑回归 | 1. 速度快、易于实现2. 更容易地更新模型吸收新的数据 | 特征处理复杂,需要归一化和较多的特征工程。 | LogisticRegression |
支持向量机 | 1.可以解决小样本下机器学习的问题,提高泛化性能2.可以解决高维、非线性问题 | 对缺失数据敏感,内存消耗大,难以解释。 | SVC |
决策树 | 1.不需要任何领域知识或参数假设,适合高维数据2.处理速度快,短时间内处理大量数据3.能够同时处理数据型和常规性属性 | 1.对于各类别样本数量不一致数据,信息增益偏向于那些具有更多数值的特征2. 易于过拟合,不支持在线学习 | DecisionTreeRegressor |
随机森林 | 1.训练速度快,实现比较简单,容易做成并行化方法2.对于不平衡的数据集来说,它可以平衡误差3.如果特征缺失一部分,仍可维持准确度 | 在分类较多的属性值上效果不佳 | RandomForestClassifier |
当我们完成了一个模型的训练之后,我们需要知道这个模型的性能如何。通常会使用以下几个指标来评价:准确率(Accuracy)、精确率(Precision)、召回率(Accuracy)、F1值(F1 source)。
在说明上面几个指标的含义之前,先需要知道混淆矩阵,如表所示。
如上表中所示,要了解各个评价指标,首先需要知道混淆矩阵,混淆矩阵中的P表示Positive,即正例或者阳性,N表示Negative,即负例或者阴性。
表中TP(预测正确)表示实际为正被预测为正的样本数量,FN(预测错误)表示实际为正但被预测为负的样本的数量。FP(预测错误)表示实际为负但被预测为正的样本数量,TN表示实际为负被预测为负的样本的数量(预测正确)。
另外,TP+FP=P’表示所有被预测为正的样本数量,同理FN+TN为所有被预测为负的样本数量,TP+FN为实际为正的样本数量,FP+TN为实际为负的样本数量。
准确率(accuracy)定义为模型分类正确的数量占总样本的数量的比例,即:
虽然准确率可以判断总的正确率,但是在样本不平衡(正样本和负样本数量差距大)的情况下,并不能作为很好的指标来衡量结果。
精确率(precision)定义为模型分类预测为正实际也为正的样本占预测为正的样本的比例,即:
召回率(recall)定义为实际为正的样本中被预测为正的样本占实际为正的样本的比例,即:
F1 score是另外的一个准确性的指标,通过计算精确率和召回率的调和平均值,其计算公式为:
理论上这几个指标越接近于1越能表示当前分类器的效果越好,但是不可能把分类器做到预测100%准确率。
在sklearn中的metrics包下已经包含了各个指标的计算公式,所以当模型训练完成后,使用测试集验证模型时可以直接使用此包下方法,返回结果即是相关指标的数值。