线性分类模型
线性模型也可用于分类问题。我们首先来看二分类。我们可以利用下面的公式预测:
y^=w[0]x[0]+w[1]x[1]+...+w[p]*x[p]+b>0
这个公式与线性回归的公式非常相似,但我们没有返回特征的加权求和,而是为预测设置了阈值(0)。如果函数值小于0,我们就预测类别-1,如果函数值大于0,我们就预测类别+1。对于所有用于分类的线性模型,这个预测规则都是通用的。同样,有很多不同的方法来找出系数(w)和截距(b)。
对于用于回归的线性模型,输出y^是特征的线性函数,是直线、平面或超平面(对于更高维的数据集)。对于用于分类的线性模型,决策边界是输入的线性函数。换句话说,(二元)线性分类器是利用直线、平面或超平面来分开两个类别的分类器。
学习线性模型有很多种算法。这些算法的区别在于以下两点:
1.系数和截距的特定组合对训练数据拟合好坏的度量方法;
2.是否使用正则化,以及使用哪种正则化方法。
不同的算法使用不同的方法来度量“对训练集拟合好坏”。由于数学上的技术原因,不可能调节w和b使得算法产生的误分类数量最少。对于我们的目的,以及对于许多有用而言,上面第一点(称为损失函数)的选择并不重要。
最常见的两种线性分类算法是Logistic回归(logistic regression)和线性支持向量机(linear support vector machine,线性SVM)。
import sys print("Python version:{}".format(sys.version)) import pandas as pd print("pandas version:{}".format(pd.__version__)) import matplotlib print("matplotlib version:{}".format(matplotlib.__version__)) import matplotlib.pyplot as plt import numpy as np print("Numpy version:{}".format(np.__version__)) import scipy as sp print("Scipy version:{}".format(sp.__version__)) import IPython print("IPython version:{}".format(IPython.__version__)) import sklearn print("scikit-learn version:{}".format(sklearn.__version__)) import mglearn
Python version:3.7.1 (default, Dec 10 2018, 22:54:23) [MSC v.1915 64 bit (AMD64)]
pandas version:0.23.4
matplotlib version:3.0.2
Numpy version:1.15.4
Scipy version:1.1.0
IPython version:7.2.0
scikit-learn version:0.20.1
from sklearn.linear_model import LogisticRegression from sklearn.svm import LinearSVC X,y=mglearn.datasets.make_forge() fig,axes=plt.subplots(1,2,figsize=(10,3)) for model,ax in zip([LinearSVC(),LogisticRegression()],axes): clf=model.fit(X,y) mglearn.plots.plot_2d_separator(clf,X,fill=False,eps=0.5,ax=ax,alpha=.7) mglearn.discrete_scatter(X[:,0],X[:,1],y,ax=ax) ax.set_title("{}".format(clf.__class__.__name__)) ax.set_xlabel("Feature 0") ax.set_ylabel("Feature 1") axes[0].legend()
image.png
在上述图中,forge数据集的第一个特征位于x轴,第二个特征位于y轴,与前面相同。
图中分别展示了LinearSVC和LogisticRegression得到的决策边界,都是直线,将顶部归为类别1的区域和底部归为类别0的区域分开了。换句话说,对于每个分类器而言,位于黑线上方的新数据点都会被划为类别1,而在黑线下方的点都会被划为类别0。
两个模型得到了相似的决策边界。注意,两个模型中都有两个点的分类是错误的。两个模型默认使用L2正则化,就像Ridge对回归所做的那样。
正则化
对于LogisticRegression和LinearSVC,决定正则化强度的权衡参数叫作C。C值越大,对应的正则化越弱。换句话说,如果参数C值较大,那么LogisticRegression和LinearSVC将尽可能将训练集拟合到最好,而如果C值较小,那么模型更强调使系数向量(w)接近于0。
参数C的作用还有另一个有趣之处。较小的C值可以让算法尽量适应“大多数”数据点,而较大的C值强调每个数据点都分类正确的重要性。
mglearn.plots.plot_linear_svc_regularization()
image.png
在上述左1图中,C值很小,对应强正则化。