常见的机器学习监督式的学习任务包括回归任务和分类任务。这个部分来说明一下分类算法。
本质
给定一个对象X,将其划分到预定义好的某一个类别Yi中的算法。比如经典的mnist数据,将手写数字分类成不同的数字。
首先来说明二元分类器
二元分类器
简单来说,二元分类器就是将事情分成是与非。接上面的例子,比如判断一个数字5,在二元分类器中就是用来分成两个类别:5or非5。此时随机梯度是一个很好的选择(SGD)。因为SGD可以独立处理实例,一次一个。
from sklearn.linear_model import SGDClassifier
sgd_clf = SGDClassifier(random_state=42)
训练时完全随机的特点,使得其有效处理非常大的数据集。
性能考核
首先来看交叉验证法
使用交叉验证测量精度
这个方法中,使用分层抽样的方式来实现,对训练集进行训练,然后对测试集进行预测,最后得出正确的结果。
from sklearn.model_selection import cross_val_score
cross_val_score(sgd_clf, X_train, y_train, cv=3, scoring="accuracy")
其中cv=3表示3折,然后每次留其中1折用来预测,其余用来测验。
混淆矩阵
混淆矩阵是用来评估分类器性能的一个很好方法,总体思路就是统计A类别实例被分为B类的次数。例如想查看数字3和数字5被混淆的次数,可以通过混淆矩阵第五行第三列来进行查看。
from sklearn.model_selection import cross_val_predict
这里使用predict 与 score不同。返回的不是评估分数,而是每个折叠的预测。
from sklearn.metrics import confusion_matrix
confusion_matrix(y_train, y_train_pred)
使用如下方法来实现获取混淆矩阵,只需要给出目标类别y_train——5和预测类别y_train_pred即可。
精度和召回率
判断分类性能的方式还有使用精度和召回率。
精度=TP/TP+FP,召回率=TP/TP+FN。两个用于不同类别分类器的分别,比如对于视频级别审批方面,往往对精度要求更高,而在抓捕小偷方面,往往对召回率的要求更高。
from sklearn.metrics import precision_score, recall_score
如果对精度和召回率都没有过多要求的时候,通过这两种指标,很难综合的判断一个分类器的分数。这个时候可以引入另外一个概念,f1分数。
F1=2/(1/精度+1/召回率)
from sklearn.metrics import f1_score
在分析的过程中,SGDClassifier使用分别类别的方法是基于决策函数计算出一个分值。如果该值大于所设定的值,则判别为正类,反之则为负类。这个过程中,如果增加阀值,会增加精度降低召回率。反之则会增加召回率,降低精度。
ROC曲线
与精度/召回率曲线很相似,不过他所应用的是真正类率(召回率)/假正类率(FPR)。FPR=FN/FN+TN
from sklearn.metrics import roc_curve
fpr, tpr, thresholds = roc_curve(y_train_5, y_scores)
多类别分类器
上面讲述了二元分类器,多类别分类器可以区分两个其上的类别。有一些算法直接可以区分多个类别,比如(随机森林分类器或者朴素贝叶斯分类器),也有一些二元分类器算法,比如支持向量机,可以通过其他的方式来实现多元分类。
举个例子,基于上面的数字识别,将数字分成十个类别。一种方法是训练10个二元分类器,每个数字一个。最后那个分数高,就识别为哪一个类。这就是一对多策略(OvA)
另一种方法,通过建设多个二元分类器。10*9/2=45个,最后那个类别获胜最多,判断类别。这就是OvO方法,主要优点在于,每个分类器只需要用到部分训练集对其必须区分的两个类别进行训练。
多标签分类器
比如在人脸识别的应用中,就是一个很典型的多标签分类器。现有A、B、C三个人的照片数据,识别出三张脸结果为[1,0,0]。则表示识别为A。
如果在数据中,某一个人的照片过多,在最后预测中会有一定的影响。这样对每个标签设置一个等于其自身支持的权重
from sklearn.metrics import f1_score
f1_score=(y_train, y_train_pred, average="weight")