本文是监督学习分类算法的第一部分,简单介绍对样本进行分类的算法,包括
- 判别分析(DA)
- 支持向量机(SVM)
- 随机梯度下降分类(SGD)
- K近邻分类(KNN)
- 朴素贝叶斯分类(NaiveBayes)
判别分析(Discriminant Analysis)
判别分析是基于条件概率的分类方法,可以分为线性判别分析(LDA)和二次型判别分析(QDA)。算法介绍
判别分析的基础是贝叶斯公式,它根据已有数据中的先验概率(可以通过样本得到)推断后验概率: 对于训练集,我们选择令值较大的那个k作为预测结果。
算法求解
假设条件随机变量服从多元正态分布,那么先验概率应为其中,为标记为k的样本数据均值,为标记为k的样本协方差矩阵。
代入贝叶斯公式得到对数后验概率:其中,是分子的对数常数,是已知样本中各分类的比例。
QDA算法就是得到能够使对数后验概率最大的k值。如果在QDA模型中假设特征之间相互独立,即只包含对角线元素,那么QDA分类器等效于高斯朴素贝叶斯分类器naive_bayes.GaussianNB。LDA算法是QDA算法的特例,即假设所有类别的y都具有相同的协方差矩阵,那么对数后验概率可以写作其中为样本与均值之间的马氏距离。因此,LDA也可以认为是在先验概率条件下采用马氏距离进行分类的方法。上式也被称为判别函数。
算法实例
假设,,即只分两类且概率相等时,判别函数得到对比两式
- 当上式大于0时说明的概率大于,则应该属于第1类,否则属于第二类。
- 当上式等于0时可以得到决策边界
- 同样可以推导3个以上类别的决策边界。
- QDA算法由于考虑了不同的协方差矩阵,可以得到二次型的决策边界。
代码
判别函数可以改写为线性形式其中的拟合数据保存在属性中,保存在属性中。
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
clf2 = LinearDiscriminantAnalysis(solver='lsqr', shrinkage=None).fit(X, y)
从代码中可以看出也要确定判别分析的算法器solver,也可以通过shrinkage进行正则化。支持向量机(Support Vector Machines)
支持向量机SVM在高维或无限维空间中构建一个超平面或一组超平面,该超平面与任何类别的最近训练数据点之间的距离最大(所谓的功能边界),所以可以实现良好的分离,可用于分类、回归或其他任务。因为通常边界越大,分类器的泛化误差越低。下图显示了线性可分离问题的决策函数,在边界上有三个样本,称为“支持向量”:支持向量机也是既可以用来进行分类也可以进行回归的模型,其分类器在Scikit-learn中包括SVC,NuSVC和LinearSVC等类。
算法
给定训练集分为两个类,研究目标是找到满足优化问题的解.SVC的目标是式子第二项也可以看做是正则化项,是控制参数。上面优化问题的对偶问题是
其中是全1向量,是半正定阶矩阵,且,其中是核(Kernel)。
通过调整核函数可以对不同的数据进行分类:NuSVC、LinearSVC和其他相关的支持向量机算法都采用了近似的目标函数。
代码
参数存储在属性中,支持向量机数据保存在属性中,参数保存在属性中。from sklearn.svm import SVC
linear_svc = svm.SVC(kernel='linear')
linear_svc = svm.SVC(kernel='rbf')
RBF是Radial Basis Function的缩写,可以进行非线性划分,效果如下:
随机梯度下降分类(SGD)
随机梯度下降分类器近似等效于线性SVMfrom sklearn.linear_model import SGDClassifier
clf = SGDClassifier(loss="hinge", penalty="l2", max_iter=5).fit(X, y)
可以通过参数设置具体的损失函数。SGDClassifier支持以下损失功能:- :(软边距)线性支持向量机;
- :平滑的铰链损失;
- :逻辑回归, 等。
- :参数的标准正则项;
- :参数的标准正则项;
- :和的凸组合。
K近邻分类(KNN)
KNN算法已经介绍过了,这里给出用KNN分类器的代码from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1).fit(X_train,y_train)
效果如下:朴素贝叶斯分类(NaiveBayes)
本文开头指出,QDA在特征相互独立的情况下等价于高斯NaiveBayes,这里的“Naive(朴素)”指的就是这种特征数据相互独立的假设。算法
给定样本属于的类别数据,由贝叶斯公式可以得到关系:在“Naive”条件下,上式可以简化为
由于是根据样本计算的常数,所以所以
在假设了之后就可以进行估计。
类别和特点
- scikit-learn 中实现了三种朴素贝叶斯分类器:GaussianNB、BernoulliNB 和MultinomialNB。
- GaussianNB 可应用于任意连续数据;
- BernoulliNB 假定输入数据为二分类数据;
- MultinomialNB 假定输入数据为计数数据(即每个特征代表某个对象的整数计数,比如一个单词在句子里出现的次数)。
- BernoulliNB 和MultinomialNB 主要用于文本数据分类。
代码
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0)
gnb = GaussianNB()
y_pred = gnb.fit(X_train, y_train).predict(X_test)