许多线性分类模型只适用于二分类,不能轻易推广到多类别问题(除了logisitic回归)。将二分类算法推广到多分类算法的一种常见的方法是“一对其余”。在“一对其余”中对每个类别都学习一个二分类模型,将这个类别与所有其他类别尽量分开,这样就生成了类别个数一样多多的二分类。 在测试点上运行所有二分类器来进行预测,在对应类别上分数最高的分类器“胜出”,将这个类别标签返回作为预测结果。每个类别都对应一个二分类器,这样每个类别也就有一个系数(w)向量和一个截距(b)。 多分类logistic回归背后的数学与“一对其余”方法稍微有所不同。不过也是对每个类别都有一个系数向量和一个解决,也使用了相同的预测方法。 下面我们将“一对其余”方法应用在一个简单的三分类数据上。我们用到了一个二维数据及,每个类别的数据都是从一个高斯分布中蔡阳得出,代码如下: import matplotlib.pyplot as plt from sklearn.datasets import make_blobs x, y = make_blobs(random_state=42) #导入数据集 #以下代码进行绘图 mglearn.discrete_scatter(x[:, 0], x[:, 1], y) plt.xlabel('Feature 0') plt.ylabel('Feature 1') plt.legend(['Class 0', 'Class 1', 'Class 2']) 运行结果如下图所示: 包含三个类别的二维玩具集 现在,我们在这个数据集上加上一个LinearSVC分类器,新增对应代码如下: linear_svm = LinearSVC().fit(x, y) #线性分类器适配对应的x,y print('Coefficient shape: ', linear_svm.coef_.shape) print('intercept shape: ', linear_svm.intercept_.shape) mglearn.discrete_scatter(x[:, 0], x[:, 1], y) line = np.linspace(-15, 15) for coef, intercept, color in zip(linear_svm.coef_, linear_svm.intercept_, ['b', 'r', 'g']): #分类颜色设定 plt.plot(line, (line * coef[0] + intercept) / coef[1], c=color) plt.ylim(-10, 15) plt.xlim(-10, 8) plt.xlabel('Feature 0') plt.ylabel('feature 1') plt.legend(['class 0', 'class 1', 'class 2', 'line class 0', 'line class 1', 'line class 2'], loc=(1.01, 0.3)) mglearn.plots.plot_2d_classification(linear_svm, x, fill=True, alpha=.7) mglearn.discrete_scatter(x[:, 0], x[:, 1], y) line = np.linspace(-15, 15) for coef, intercept, color in zip(linear_svm.coef_, linear_svm.intercept_, ['b', 'r', 'g']): #分类颜色设定 plt.plot(line, (line * coef[0] + intercept) / coef[1], c=color) plt.ylim(-10, 15) plt.xlim(-10, 8) plt.xlabel('Feature 0') plt.ylabel('feature 1') plt.legend(['class 0', 'class 1', 'class 2', 'line class 0', 'line class 1', 'line class 2'], loc=(1.01, 0.3)) 对应的运行结果如下: 三个“一对其余”分类器学到的决策边界 有运行结果我们得出,coef_的形状是(3,2),说明coef_每行包含三个类别之一的系数向量每列包含某个特征(这里的数据集有两个特征)对应的系数值。而现在的intercept是一个一位数组,保存每个类别的截距。 将这三个二分类器给出的直线可视化后我们可以看到,训练集中所有类别0的点都在于类别0对应的直线上方,这说明这个二分类器属于“类别0”的那一侧。类别0可以看出是属于大于0的异类,而类别1和2应该都属于小于0这一类。 中间的三角形区域属于哪一类呢,三个二分类器都将这一区域的点华为“其余”,即最接近的那条线对应的类别。 多分类模型的优点、缺点和参数:线性模型的主要参数是正则化,在回归模型中叫做alpha,在linearSVC和logistic-Regression中叫做C。alpha值较大或C值较小,说明模型简单,特别是对于回国模型而言,调节这些参数非常重要。 另外还需要确认使用L1正则化还是L2正则化,默认使用L2正则化,但是如果所有特征中只有几个是需要的,那么则使用L1正则化。线性模型的训练速度非常快,预测速度也很快。可以将其应用大非常大的数据集,同时对于稀疏数据也很有效。 如果你的数据包含数十万甚至上百万个样本,可能需要研究如何利用LogisticRegression和Ridge模型的solver=‘sag’选项,在处理大数据时,这一数据别默认值更快。 线性模型的另一个优点是利用我们见过的用于回归和分类的公式,理解如何进行预测是相对容易的。 缺点是:我们很多时候并不清楚为什么会是这样,如果你的数据集中包含高度相关的特征,这一问题尤为突出。这种情况很难对其系数做出解释。 如果特征量大于样本数量,线性模型的表现都非常好。它也常用于非常大的数据集,只因为训练其他模型并不可行。但是在耕地为的空间中,其他模型的泛化性能更好。我们将会在下节介绍的朴素贝叶斯分类器等将会用来处理此类问题。 |
|
来自: 星光闪亮图书馆 > 《Python学习》