精华内容
下载资源
问答
  • 分类问题(四)多元分类
    千次阅读
    2020-02-19 13:37:00

    多元分类

    之前介绍过二元分类器,可以将数据分成两个类别(例如“数字5”和“非数字5”)。多元分类器(也称为多项式分类器)可以区分两个以上的类别。

    有些算法(例如随机森林或朴素贝叶斯)可以直接处理多个类别。其他如SVM、线性分类器则是严格的二元分类器。不过我们仍有很多不同的办法可以让二元分类器实现多元分类的功能。

    例如,其中一种将手写数字分类成10个类别(0-9)的方式是训练10个二元分类器,每个二元分类器分类一个数字(例如0-分类器、1-分类器,2-分类器,等等…)。然后在做图片分类时,将图片送入到所有分类器,并获取它们的决策分数,最后使用最高决策分数判断这张图片属于哪个类别。这种方式称为one-versus-all(OvA)策略,也称为one-versus-the rest。

    另一种策略是为每对数字训练一个分类器:一个用于分类0与1,下一个用于分类0与2,接下来一个分类1与2,依次类推。这个称为one-versus-one(OvO)策略。如果有N个类别的话,我们需要训练N×(N-1)/2 个分类器。对于MNIST问题来说,意味着要训练45个二元分类器,非常耗时且麻烦。OvO主要的好处是:每个分类器仅需要在部分训练集上(这部分训练集需要包含要区分的两个类别数据)进行训练即可。

    一些算法如SVM,它随着数据集的扩大,它本身的扩展并不会随着有很大的提升,所以比较适合OvO。它可以在很多个小的训练集上训练多个分类器,而不需要在一个大的训练集上训练少数几个分类器。对于大多数二元分类算法来说,OvA是更合适的。

    在sk-learn中,如果使用了一个二元分类算法训练一个多分类问题,则它会自动运行OvA(除了SVM,它会自动使用OvO)。下面我们试试SGDClassifier:

    sgd_clf.fit(X_train, y_train)
    sgd_clf.predict(X_test[:5])
    >[7 2 1 0 4]

     

    可以看到用法其实很简单。在它底层,其实是训练了10个二元分类器,并在预测时将图片送到10个分类器中,从中取决策分数最高分作为判断分类的类别。

    进一步验证的话,我们可以调用decision_function() 方法,它这次对每条数据返回的不会一个分数,而是10个分数,每个类别一个分数:

    sgd_clf.decision_function(X_test[:1])
    >array([[-27972.77566096, -52417.77039463, -14344.98217961,
             -1308.44575644, -19922.84531732,  -9208.91066356,
            -38331.13646795,   8007.54256279,  -4273.31795296,
             -5951.32911022]])
    
    np.argmax(digit_scores)
    >7
    
    sgd_clf.classes_
    >array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=uint8)
    
    sgd_clf.classes_[7]
    >7

     

    可以看到最高分数是7,所以最后将它分类为数字7。

    这里需要注意的是:在一个分类器被训练好后,它会将目标类别作为list存储在它的classes_ 属性中,按值的大小排列。在这个例子中,classes_数组中每个类别的索引正好是对应了类别(例如,索引5的值正好对应的是数字5),但是一般情况下其实并不会是这么碰巧。

     

    如果我们希望强行让sk-learn使用one-versus-one或是one-versus-all,则可以使用OneVsOneClassifier或OneVsRestClassifier类。仅需要创建一个二元分类器的实例,然后传入到它的构造器即可。例如下面的代码创建了一个多元分类器,使用的是OvO策略,基于的是SGDClassifier:

    from sklearn.multiclass import OneVsOneClassifier
    
    ovo_clf = OneVsOneClassifier(SGDClassifier(random_state=42))
    ovo_clf.fit(X_train, y_train)
    ovo_clf.predict(X_test[:5])
    >array([7, 2, 1, 0, 4], dtype=uint8)
    
    len(ovo_clf.estimators_)
    >45

     

    可以看到一共训练了45个二元分类器。

    下面我们训练一个RandomForestClassifier,非常简单,并且比前几个速度快地多:

    forest_clf.fit(X_train, y_train)
    forest_clf.predict(X_test[:5])
    >array([7, 2, 1, 0, 4], dtype=uint8)

     

    这次sk-leran并没有运行OvA或OvO,因为随机森林分类器可以直接将数据分类为多个类别。我们可以调用predict_proba() 获取每条数据被分类为每个类别的概率:

    forest_clf.predict_proba(X_test[1:2])
    >array([[0. , 0. , 0.7, 0.2, 0. , 0. , 0.1, 0. , 0. , 0. ]])
    

     

    可以看到这个分类器有70%的确信度认为这张图片属于第2个类别(从0起始),也就是数字2。它同时也认为这张图片应属于3和6,对应的确信度分别为20%与10%。

    接下来我们评估一下这些分类器,如之前一样,使用交叉验证。使用cross_val_score() 方法来评估SGDClassifier的准确率:

    cross_val_score(sgd_clf, X_train, y_train, cv=3, scoring='accuracy')
    >array([0.87082583, 0.87089354, 0.88628294])

     

    可以看到在所有测试折上,准去率均达到了87%以上。如果是一个完全随机的分类器,则它的准确率应为10%。相对于10%的准确率,我们这个分类器明显已经好了很多,但是还可以做的更好。例如,将它们做一个标准化:

    from sklearn.preprocessing import StandardScaler
    
    scaler = StandardScaler()
    X_train_scaled = scaler.fit_transform(X_train.astype(np.float64))
    cross_val_score(sgd_clf, X_train_scaled, y_train, cv=3, scoring='accuracy')
    >array([0.89957009, 0.89344467, 0.89963495])

     

    可以看到正确率提高到了89%以上。在训练完模型后,根据机器学习项目流程,下一步我们会尝试去优化模型,其中一个方法就是误差分析,也是接下来介绍的内容。

     

    更多相关内容
  • 机器学习中的多元分类算法实现代码,实现多元分类,matlab
  • 多元分类

    千次阅读 2019-01-16 15:55:09
    多元分类举例: 将邮件分为:工作类、朋友类、家庭类以及爱好类 将医疗诊断分为:没有疾病、感冒、流感 将天气分为:晴天、多云、下雨、下雪 这些都是一对多的例子。 对于二元分类,我们只用一个分类器就可以...

    多元分类举例:

    将邮件分为:工作类、朋友类、家庭类以及爱好类

    将医疗诊断分为:没有疾病、感冒、流感

    将天气分为:晴天、多云、下雨、下雪

    这些都是一对多的例子。

    对于二元分类,我们只用一个分类器就可以将训练集分成正类和负类。但对于多元我们怎么分类呢?

    对于多元,我们这里以三元为例将其分为3类。分类过程为:

    我们首先将class1看为正类,其他的看作负类,画出分类器,继续将class2看作正类,其他的看作负类,画出分类器,最后将class3看作正类,其余的看作负类,画出分类器。

    这里我们一共得到3个分类器,即我们将一个三元分类分为3个二元分类。

    我们给出一个新的输入值x,期望获得预测,我们要做的就是,在比如3个分类器运行输入x,然后选择h最大的类别,也就是要选择分类器,选择出3个中可信度最高效果最好的那个分类器,无论i是多少,我们都能得到一个最高的概率值,我们预测y就是那个值。

    展开全文
  • 但是如果我们很清楚地知道机器学习如果用一句话来概括就是:通过大量的训练,使得机器把输入的数据整理出有用的知识输出,这种输出或者是分类或者是回归。分类问题是要预测类别,回归问题是要预测值。 如下图,训练...

    机器学习是一个比较广阔的知识领域,涉及到很多数学统计和计算机的相关知识。 要想深入了解,需要系统学习和大量的时间。 但是如果我们很清楚地知道机器学习如果用一句话来概括就是:通过大量的训练,使得机器把输入的数据整理出有用的知识输出,这种输出或者是分类或者是回归。分类问题是要预测类别,回归问题是要预测值。

    如下图,训练数据集输入给训练模型,模型达到一定的准确率后,可以进行测试,把测试数据输入给模型,得到预期要得到的结果。

    所以,如果我们要了解机器学习,主要就是要了解中间的训练环节,也就是机器学习的训练模型。这部分才是机器学习的核心。如果我们对训练模型有一定地了解了。我们可以从我们要处理的实际问题出发,采用相依的训练模型,来做机器学习的应用,得到我们想要的结果。我们就能回答机器到底能学习什么和如何学习的问题。

    下面我们将详细讲述如下机器学习训练模型,也叫做训练方法: 二元分类,多元分类,打分,排名,概率预测,树模型,规则模型,线性模型,基于距离的模型,概率模型,梯度下降,多项式回归,正则化线性回归,逻辑回归,支持向量机,决策树,集成学习,随即森林,深度神经网络,卷积神经网络,递归神经网路,强化学习,偏好学习,多任务学习,在线学习。这些模型有的只用于分类,有的只用于回归,也有的既能用于分类还能用于回归。

    二元分类(binary classification),是机器学习里比较早就应用的学习模型,比较著名的应用就是垃圾邮件分类识别。 二元分类一般分为正例(positive)和反例(negative)。其他还有医疗诊断和信用卡欺诈识别。分出垃圾邮件和特殊疾病的类都是正例类别(positive class)。一个简单的分类方法就是训练集上,做出一个特征树,把每个特征树的叶子上各个类别的数量标出来,选择大多数的类别,作为这个叶子的类别。这样特征树就变成了决策树。

    如上图一所示,找出一批邮件,作为训练集,垃圾邮件有20封 出现保险字样,正常邮件有5封出现保险字样,在没有保险字样的邮件里,出现彩票字样的垃圾邮件有10封,正常邮件有5封。没有出现保险和彩票字样的邮件,垃圾邮件有20封,正常邮件有40封。所以每个叶子节点,取大多数类别的值 画圈所示,就得到了一棵决策树。也可以用其他方法得到各种情况的概率大小,取概率的的类别作为最后的类别。这样,我们就可以用这个决策树去判断测试集,得到测试集的数据分类。比如我们拿一些未知的邮件,这些邮件就是测试集,去按照这个决策树的条件去判断每一封测试集的邮件,最后得出每个邮件是不是垃圾邮件。

    二元分类模型不止是决策树,还有线性模型等等,都可以把现有数据分成两类。

    了解了二元分类的过程,我们可以扩展到多元分类(multi-class classification),顾名思义就是分类不止是两类,而是多类。如果你有一个二元分类模型,比如线性模型,有很多方法可以把他们变成K 类分类器。一对多模式(one-versus-rest) ,训练K 个二元分类器,第一份分类器,把类一 C1 从其他类里分出来,第二个分类器把类二 C2 从其他类里分出来,如此继续。当我们训练第i 类时,我们把第i类 Ci的所有实例,当作正例,其他类都是反例。比方说,分第一类时,只把第一类作为正例,其他作为反例,找到第一类。还有一对一模式(one-versus-one), 在这种模式下,训练k(k-1)/2个二元分类器,每对不同的类只训练一次。

    当实现一个神经网络的时候,我们需要知道一些非常重要的技术和技巧。例如有一个包含个样本的训练集,你很可能习惯于用一个for循环来遍历训练集中的每个样本,但是当实现一个神经网络的时候,我们通常不直接使用for循环来遍历整个训练集,所以在这周的课程中你将学会如何处理训练集。

    另外在神经网络的计算中,通常先有一个叫做前向暂停(forward pause)或叫做前向传播(foward propagation)的步骤,接着有一个叫做反向暂停(backward pause) 或叫做反向传播(backward propagation)的步骤。所以这周我也会向你介绍为什么神经网络的训练过程可以分为前向传播和反向传播两个独立的部分。

    在课程中我将使用逻辑回归(logistic regression)来传达这些想法,以使大家能够更加容易地理解这些概念。即使你之前了解过逻辑回归,我认为这里还是有些新的、有趣的东西等着你去发现和了解,所以现在开始进入正题。

    逻辑回归是一个用于二分类(binary classification)的算法。首先我们从一个问题开始说起,这里有一个二分类问题的例子,假如你有一张图片作为输入,比如这只猫,如果识别这张图片为猫,则输出标签1作为结果;如果识别出不是猫,那么输出标签0作为结果。现在我们可以用字母 y来 表示输出的结果标签,如下图所示:

    展开全文
  • 权重系数确定matlab代码使用前馈神经网络和反向传播进行多元分类 该代码已用Matlab(基本版本,没有额外的工具箱)编写,并在8.3版(R2014a)上进行了测试。 所用方程式的主要参考资料是和,分别是本书的第2章和第3...
  • 分类问题是多分类问题的一种特殊情况,区别在于多分类用softmax代替sigmoid函数。 softmax函数将所有分类的分数值转化为概率,且各概率的和为1。 1 softmax函数 softmax函数首先对所有的输出值通过指数函数,将...

    0 写在前面

    • 二分类问题是多分类问题的一种特殊情况,区别在于多分类用softmax代替sigmoid函数。
    • softmax函数将所有分类的分数值转化为概率,且各概率的和为1。

    1 softmax函数

    • softmax函数首先对所有的输出值通过指数函数,将实数输出映射到正无穷
    • 然后将所有的结果相加作为分母
      在这里插入图片描述

    2 数据预处理

    • 首先
    • 下面这段代码可以直接运行!
    首先cluster数据,形状为500×2,各元素值为1。然后用normal()函数,以4为均值,2 为标准差生产data0
    其他同理
    
    import torch
    import matplotlib.pyplot as plt
    
    cluster = torch.ones(500, 2)
    data0 = torch.normal(4*cluster, 2)
    data1 = torch.normal(-4*cluster, 1)
    data2 = torch.normal(-8*cluster, 1)
    label0 = torch.zeros(500)
    label1 = torch.ones(500)
    label2 = 2*label1
    
    x = torch.cat((data0, data1, data2), ).type(torch.FloatTensor)
    y = torch.cat((label0, label1, label2), ).type(torch.LongTensor)
    
    plt.scatter(x.numpy()[:, 0], x.numpy()[:, 1], c=y.numpy(), s=10, lw=0, cmap='Accent')
    plt.show()
    
    • 根据均值,可以看出灰色的数据群是data2,蓝色数据群是data1,绿色的数据群是data0。
    • 符合正态分布的特点——中心点聚集的数据点较多,四周的数据点分散。
      在这里插入图片描述

    2.1 scatter()函数的cmap属性

    • 1 可以不写,有默认值的
    • 2 如果想花里胡哨一点的话,可以看下图
      在这里插入图片描述

    3 激活函数

    • 隐藏层激活函数采用relu(),最后分类激活函数采用softmax

    4 模型搭建

    • 一个隐藏层(维度变换从input_figure到num_hidden)
    • 一个输出层(维度变换从num_hidden到outputs)
    class Net(nn.Module):
        def __init__(self, input_feature, num_hidden, outputs):
            super(Net, self).__init__()
            self.hidden = nn.Linear(input_feature, num_hidden)
            self.out = nn.Linear(num_hidden, outputs)
    
        def forward(self, x):
            x = F.relu(self.hidden(x))
            x = self.out(x)
            x = F.softmax(x, dim=1)
            return x
    
    • 这里初始化模型,输入是2d,中间是20d,输出是3d。输入输出维度不能改变,中间的维度可以随意设定。
    net = Net(input_feature=2, num_hidden=20, outputs=3).cuda()
    inputs = x.cuda()
    target = y.cuda()
    

    5 完整代码

    • 可以直接运行!
    • 如果你觉得本文对你有帮助的话,感谢点赞收藏+评论哦!
    import torch
    import matplotlib.pyplot as plt
    
    
    cluster = torch.ones(500, 2)
    data0 = torch.normal(4*cluster, 2)
    data1 = torch.normal(-4*cluster, 1)
    data2 = torch.normal(-8*cluster, 1)
    label0 = torch.zeros(500)
    label1 = torch.ones(500)
    label2 = 2*label1
    
    x = torch.cat((data0, data1, data2), ).type(torch.FloatTensor)
    y = torch.cat((label0, label1, label2), ).type(torch.LongTensor)
    
    # plt.scatter(x.numpy()[:, 0], x.numpy()[:, 1], c=y.numpy(), s=10, lw=0, cmap='Accent')
    # plt.show()
    
    import torch.nn.functional as F
    from torch import nn, optim
    
    
    class Net(nn.Module):
        def __init__(self, input_feature, num_hidden, outputs):
            super(Net, self).__init__()
            self.hidden = nn.Linear(input_feature, num_hidden)
            self.out = nn.Linear(num_hidden, outputs)
    
        def forward(self, x):
            x = F.relu(self.hidden(x))
            x = self.out(x)
            x = F.softmax(x, dim=1)
            return x
    
    
    net = Net(input_feature=2, num_hidden=20, outputs=3).cuda()
    inputs = x.cuda()
    target = y.cuda()
    
    optimizer = optim.SGD(net.parameters(), lr=0.02)
    criterion = nn.CrossEntropyLoss()
    
    
    def draw(output):
        output = output.cpu()
        plt.cla()
    
        output = torch.max((output), 1)[1]
        pred_y = output.data.numpy().squeeze()
        target_y = y.numpy()
    
        plt.scatter(x.numpy()[:, 0], x.numpy()[:, 1], c=pred_y, s=10, lw=0, cmap='RdYlGn')
        accuracy = sum(pred_y == target_y) / 1500.0
        plt.text(1.5, -4, 'Accuracy=%s' % (accuracy), fontdict={'size':20, 'color':'red'})
        plt.show()
    
    
    def train(model, criterion, optimizer, epochs):
        for epoch in range(epochs):
            output = model(inputs)
            loss = criterion(output, target)
    
            optimizer.zero_grad()  # 梯度清零
            loss.backward()
            optimizer.step()
    
            if epoch % 100 == 0:
                draw(output)
    
    train(net, criterion, optimizer, 1000)
    

    6 输出分析

    6.1 目标

    目标就是向第二节的图像靠拢,三个数据群分别是不一样的颜色,然后accuracy接近1.

    6.2 运行过程

    • 训练100epochs的情况,效果不是很好,这里只分了2类
      在这里插入图片描述

    • 训练200epochs的情况,效果和100差不多
      在这里插入图片描述

    • 训练300epochs的情况
      在这里插入图片描述

    • 训练400epochs的情况
      在这里插入图片描述

    • 训练500epochs的情况,可以看到,data1的数据群一半已经变成黄色
      在这里插入图片描述

    • 训练600epochs的情况
      在这里插入图片描述

    • 训练700epochs的情况
      在这里插入图片描述

    • 训练800epochs的情况
      在这里插入图片描述

    • 训练900epochs的情况
      在这里插入图片描述

    • 训练00epochs的情况
      在这里插入图片描述

    7 总结

    • 训练到1000epochs的时候,accuracy已经达到0.99,能够非常明显地看出图片被分为了三类。
    • 目前所有的操作都是在训练集上完成的,以后会学习测试集上训练的情况!
      - 如果有用的话麻烦三连,点点关注哦!
    展开全文
  • 基于Fisher的多元分类

    2015-02-03 12:21:40
    基于Fisher鉴别分析实现对mnist数据集当中的手写数字0,1,2.....9进行识别
  • 1.0.逻辑回归解决多元分类 1)题目: 在本次练习中,你将使用逻辑回归和神经网络来识别手写数字(从0到9)。今天,自动手写数字识别被广泛使用,从识别信封上的邮政编码到识别银行支票上的金额。这个练习将向您展示...
  • 1.多元分类交叉熵 其中,types是分类总数,以五元分类来说,types=5; yitag是某个分类的标签值,是一个二值,即只能为0或1,例如,对于五元分类,类别就是用一个五元组表示—— [1,0,0,0,0] [0,1,0,0,0] [0,0,1,0,...
  • 多元分类问题模型实现

    千次阅读 2018-06-06 10:15:29
    多元分类问题可以用多元逻辑回归和One-vs.-all(从二元到多元)两种方法解决,以scikit-learn为例:import os import numpy as np import matplotlib.pyplot as plt import pandas as pd from sklearn.linear_model...
  • 基于加权策略的SVM多元分类器.pptx
  • 神经网络的多元分类、代价函数

    千次阅读 2020-05-23 21:45:55
    一、多元分类 二、代价函数 一、多元分类 在神经网络中实现多类别分类,采用的方法是一对多的的扩展。 举个例子:计算机视觉的例子 现在不仅仅是要识别汽车,还需要识别四个类别的对象,通过图像来辨别出哪些...
  • 机器学习(八)二元分类思想解决多元分类问题 前言 前面博文中讲到的逻辑回归解决的都是二元分类的问题,比如邮件是垃圾邮件还是非垃圾邮件;癌症是良性还是恶性等,那么实际生活中我们会遇到很多不仅仅分两类的问题...
  • 可以算的上是读后感了,保留了书上的源代码又加上了一些批注
  • 一个案例如上图所示我们要使用一些线性模型来分割这四种不同的图案,利用以前学过的二元分类我们可以将某一个种类分别从整体中分离出来。比如将图通是方块和不是方块的做二元分类,是三角形的和不是三角形的进行分类...
  • 在最近的版本中,Statistics Toolbox 包含了多变量分类方法的新功能,包括交叉验证、特征选择、朴素贝叶斯、袋装决策树、ROC 性能曲线以及与 Parallel Computing Toolbox 的集成。 在本次网络研讨会中,我们将概述 ...
  • 【神经网络】{4} ——多元分类

    千次阅读 2020-02-19 22:17:39
    如何利用神经网络解决多类别分类问题
  • 机器学习—编程练习(三):多元分类和神经网络 文件列表 ex3.m - Octave/MATLAB script that steps you through part 1 ex3 nn.m - Octave/MATLAB script that steps you through part 2 ex3data1.mat - Training ...
  • ISO聚类进行非监督分类实验操作二、最大似然分类1. 最大似然简介2. 最大似然分类实验案例三、主成分分析1. 主成分分析简介2. 主成分分析实验案例四、配套实验数据下载 一、ISO聚类 1. ISO聚类简介 ISO ...
  • 一、Multiclass Classification: One-vs-all(多元分类:一对多) (1)下图左边是二元分类的图形,右边是三元分类的图形(代表多元分类)。在二元分类中,我们可以划出一条拟合曲线(直线、曲线、圆或者椭圆等),...
  • 多元分类(Multiclass Classification) 本节介绍如何利用神经网络来处理三种或三种以上的分类。 This section introduces how to utilize theneural network to deal with the classification of three or more ...
  • %对于分类问题利用PSO 来进行参数优化(c,g),一般类别比较多的情况下,很慢 pso_option. c1 = 0.5 ; pso_option. c2 = 0.5 ; pso_option. maxgen = 200 ; pso_option. sizepop = 50 ; pso_option. k = ...
  • 分类的目的是将研究区域中的每个像元都分配到类或目录。类或目录的示例包括土地使用类型、熊更喜欢的位置以及雪崩的可能性等。
  • machine-learning-ex3(编程作业:多元分类与神经网络)吴恩达机器学习。matlab程序,运行正常。
  • keras神经网络实现多分类实例_鸢尾花分类,代码
  • 有别于其他分类算法的标签集,神经网络要对标签进行独热编码,在制作测试数据时要注意这点。 本例使用sklearn生成的3000个3类别的训练数据,多次调试后,能达到90%的正确率。 import numpy as np from s...
  • 使用逻辑回归去处理多元分类问题,该任务的难点是处理数据集的问题,数据集是没有经过任何处理的数据集,需要对数据进行处理,我这里使用了最简单的标记编码方法并对数据进行归一化
  • python情感分类

    2018-04-04 16:01:14
    python机器学习方法进行情感分析,里面含有源码,以及详细的解释,代码测试过,是完全可以调出来运行的

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 36,405
精华内容 14,562
关键字:

多元分类