分享

python机器学习:用于多分类的线性模型

 星光闪亮图书馆 2019-09-05

许多线性分类模型只适用于二分类,不能轻易推广到多类别问题(除了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'])

运行结果如下图所示:

python机器学习:用于多分类的线性模型

包含三个类别的二维玩具集

现在,我们在这个数据集上加上一个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))

对应的运行结果如下:

python机器学习:用于多分类的线性模型

三个“一对其余”分类器学到的决策边界

有运行结果我们得出,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’选项,在处理大数据时,这一数据别默认值更快。

线性模型的另一个优点是利用我们见过的用于回归和分类的公式,理解如何进行预测是相对容易的。

缺点是:我们很多时候并不清楚为什么会是这样,如果你的数据集中包含高度相关的特征,这一问题尤为突出。这种情况很难对其系数做出解释。

如果特征量大于样本数量,线性模型的表现都非常好。它也常用于非常大的数据集,只因为训练其他模型并不可行。但是在耕地为的空间中,其他模型的泛化性能更好。我们将会在下节介绍的朴素贝叶斯分类器等将会用来处理此类问题。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多