新闻分类:人工智能多分类问题

上一节我们提到了三个非常经典的问题,他们分别是:

  1. 二分类问题(电影评论好坏倾向性判断)
  2. 多分类问题(将新闻按照主题分类)
  3. 回归问题(根据房地产数据估算房地产价格)

上一篇中,我们介绍了其中的二分类问题,这一篇我们介绍其中的多分类问题。如果你没有阅读过上一篇,请先阅读上一篇,否则下文很多内容你会不知所云。现在我们开始今天的话题:

实际的背景是这样的:路透社将新闻分为了 46 个互斥的大类,一篇文章可能归属于其中的一类或多类,我们需要做的就是将新闻报道自动归类。问题不是与上一篇一样的非黑即白、非此即彼类型的判断了,而是考虑每篇文章是不同的各个分类的概率。稍加思考,我们就会发现这个问题虽然与上个问题有如上的不同,但是其相同部分其实更多,我们只需根据不同的特殊情况进行一定的更改就好了。具体的内容下面分别说明,相同部分简略说明,如有疑问请阅读上篇文章:

  1. 数据与前文一样,都可进行相同的初始化,即按照索引,将文章数据处理为单词索引的序列串,用 one-hot 方法处理向量使其可以为网络所处理。有区别的是这一次的结果,label 也需要处理,因为结果不是两个值,也是一个张量了。
  2. 仍然采用 relu 激活的中间层,投射的空间维度不能是 16 了,这里改成 64,原因是因为结果太多,用十六个维度去包含六十四个结果的信息,会在训练的过程中丢失过多的信息,导致准确率会有较大的下降,因此这里采用 64 层。
  3. 对于损失函数,上一篇的 binary_crossentropy 就不够用了,需要修改损失函数,sparse_categorical_crossentropy 适用于多分类情况的损失函数,前者与后者之间只是接口上的不同,需要注意一下。
  4. 我们仍旧训练 20 次,也出现了上次的问题,过拟合,只不过这一次是出现在第九次的迭代后,因此我们将迭代此处改为九,重新训练网络。图我放在了代码的前面,可以查看:
    1. 最后一层的网络,激活不应该用 sigmoid,而应该用 softmax,这样才能输出类别上的概率分布。这一点与二分类分布不一样。
  5. 最后启动训练网络,进行训练,大致可以达到 80% 的准确度。
  6. 到这里就结束了,但是还有两个问题值得关注一下。我们用随机分类器随机对文章进行分类,准确率是 19%,上一篇中的二分类的可以达到 50%。我们最后每条测试数据得到的结果是一个 46 维度的向量,是各个类别的概率值,其相加为 1(由于运算精度问题,最后其实是跟 1 有可能有一个很小的偏差),最大概率的类别就是我们的预测类别。相关代码已经在最后给出,可以参考查看。

没有更多新的东西了,就简单介绍这些,图片代码如下给出:


#!/usr/bin/env python3

import copy

import numpy as np
from keras import layers
from keras import models
from keras.datasets import reuters

def classify():
    (train_data, train_labels), (test_data, test_labels) = reuters.load_data(num_words=10000)
    # print('训练集长度:', len(train_data))
    # print('测试集长度:', len(test_data))
    # print(train_data[10])

    # 查看原文
    # word_index = reuters.get_word_index()
    # reverse_word_index = dict([(value, key) for (key, value) in word_index.items()])
    # decoded_newswire = ' '.join([reverse_word_index.get(i - 3, '?') for i in train_data[0]])
    # print(decoded_newswire)

    # 输出某一标签的分类索引
    # print(train_labels[3])

    x_train = vectorize_sequences(train_data)
    x_test = vectorize_sequences(test_data)

    # 将编码转换成张量
    # y_train = np.array(train_labels)
    # y_test = np.array(test_labels)

    one_hot_train_labels = to_one_hot(train_labels)
    one_hot_test_labels = to_one_hot(test_labels)
    # one_hot_train_labels = to_categorical(train_labels)
    # one_hot_test_labels = to_categorical(test_labels)

    model = models.Sequential()
    model.add(layers.Dense(64, activation='relu', input_shape=(10000,)))
    model.add(layers.Dense(64, activation='relu'))
    model.add(layers.Dense(46, activation='softmax'))

    model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
    # model.compile(optimizer='rmsprop', loss='sparse_categorical_crossentropy', metrics=['acc'])
    # model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])

    x_val = x_train[:1000]
    partial_x_train = x_train[1000:]
    y_val = one_hot_train_labels[:1000]
    partial_y_train = one_hot_train_labels[1000:]

    history = model.fit(partial_x_train, partial_y_train, epochs=9, batch_size=512, validation_data=(x_val, y_val))

    # 图片输出测试结果
    # loss = history.history['loss']
    # val_loss = history.history['val_loss']
    # epochs = range(1, len(loss) + 1)
    # plt.plot(epochs, loss, 'bo', label='训练损失')
    # plt.plot(epochs, val_loss, 'b', label='验证损失')
    # plt.title('训练损失和验证损失')
    # plt.xlabel('迭代')
    # plt.ylabel('精度')
    # plt.legend()
    # plt.show()

    # plt.clf()
    # acc = history.history['acc']
    # val_acc = history.history['val_acc']
    # plt.plot(epochs, acc, 'bo', label='训练精度')
    # plt.plot(epochs, val_acc, 'b', label='验证精度')
    # plt.title('训练精度和验证精度')
    # plt.xlabel('迭代')
    # plt.ylabel('精度')
    # plt.legend()
    # plt.show()

    results = model.evaluate(x_test, one_hot_test_labels)
    # 80%
    print(results)

    # 如果是随机分类器
    test_labels_copy = copy.copy(test_labels)
    np.random.shuffle(test_labels_copy)
    hits_array = np.array(test_labels) == np.array(test_labels_copy)
    # 19%
    print(float(np.sum(hits_array)) / len(test_labels))

    # 预测值
    predictions = model.predict(x_test)
    print(predictions[10].shape)
    print(np.sum(predictions[10]))
    print(np.argmax(predictions[10]))

def vectorize_sequences(sequences, dimension=10000):
    results = np.zeros((len(sequences), dimension))
    for i, sequence in enumerate(sequences):
        results[i, sequence] = 1.
    return results

def to_one_hot(labels, dimension=46):
    results = np.zeros((len(labels), dimension))
    for i, label in enumerate(labels):
        results[i, label] = 1.
    return results

if __name__ == "__main__":
    classify()

原文地址:https://www.cnblogs.com/renyuzhuo/p/12222563.html

时间: 2024-11-11 23:33:19

新闻分类:人工智能多分类问题的相关文章

Magento架构师的笔记-----Magento显示当前目录的父分类和子分类的分类名

在Magento目录的分类页面里,希望在左侧导航获取到父分类和子分类,可以用以下方法:打开app/your_package/your_themes/template/catalog/navigation/left.phtml 显示父分类的分类名 1 2 3 4 5 6 7 8 9 10 $currentCat = Mage::registry('current_category'); //如果是根目录,则显示当前目录 if ( $currentCat->getParentId() == Mage

分类信息网的分类菜单,挺漂亮

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Typ

ecshop商品列表页,循环显示当前分类的二级分类以及分类下的商品

1.includes\lib_goods.php,在最末尾添加几个function /** * 获得指定分类下的子分类 * * @access public * @param integer $cat_id 分类编号 * @return array */ function get_children_tree($cat_id) { if ($cat_id >0 ) { $sql = 'SELECT count(*) FROM ' . $GLOBALS['ecs']->table('categor

magento 获取分类及其子分类 多种情况举例

1. 获取指定分类id 下的子分类 // 例如获取 分类id为 13 的子分类信息 <?php $root = Mage::getModel('catalog/category')->load(13); $subCat = explode(',',$root->getChildren()); $collection = $root ->getCollection() ->addAttributeToSelect("*") ->addFieldToFi

destoon实现调用当前栏目分类及子分类和三级分类的方法

调用当前栏目分类及子分类和三级分类是程序设计里常用的方法,本文就来详细讲述destoon实现调用当前栏目分类及子分类和三级分类的方法.具体操作如下: 在destoon中提供了如下的调用语句: 一级分类名: ? 1 {$m[catname]} 二级分类名: ? 1 {$c[catname]} 三级分类名: ? 1 {$b[catname]} 具体调用示例如下: 一.直接调用分类名称和链接: ? 1 2 3 4 5 6 {loop $maincat $i $m}<dl>    {php $chil

CS231N-线性回归+svm多分类+softmax多分类

CS231N-线性回归+svm多分类+softmax多分类 计算机视觉 这一部分比较基础,没有太多视觉相关的.. 1.线性回归 假定在著名的 CIFAR10数据集上,包含10类数据.每类数据有10000条? 目标是输入一个图片,通过模型给出一个label.线性回归的思想就是 得到到F(x)作为某个类别的分数.那么针对每个可能的label都经过一个线性函数输出一个分值,那么我们选最大的其实就是最有可能的分数. 为什么这么做是合理的? 角度1: 每个种类一个 template,每个线性函数的W的训练

24、二分类、多分类与多标签问题的区别

二分类.多分类与多标签的基本概念 二分类:表示分类任务中有两个类别,比如我们想识别一幅图片是不是猫.也就是说,训练一个分类器,输入一幅图片,用特征向量x表示,输出是不是猫,用y=0或1表示.二类分类是假设每个样本都被设置了一个且仅有一个标签 0 或者 1. 多类分类(Multiclass classification): 表示分类任务中有多个类别, 比如对一堆水果图片分类, 它们可能是橘子.苹果.梨等. 多类分类是假设每个样本都被设置了一个且仅有一个标签: 一个水果可以是苹果或者梨, 但是同时不

电影评论分类:二分类问题

???????????????????????? 电影评论分类:二分类问题 二分类问题是生活应用当中最广泛使用的机器学习算法.但是正在这里,将使用深度学习框架keras来进行对问题求解,看似大材小用,也别有一番风味. 数据集 这里使用keras自带的数据集,它包含了来自互联网电影数据库(IMDB)的50000条具有较为容易撕逼的鹅评论.数据集被奉为用于训练的25000跳屏录吧与勇于测试的25000条评论,训练集和测试集都包含50%的正面评论和50%的负面评论. 加载IMDB数据集 from ke

好还是坏:人工智能二分类问题

上一篇文章我们介绍了深度学习的 Hello World,代码写起来相比其他语言的 Hello World 有点多,且其背后的很多原理你可能还没有完全弄懂,但从宏观上来看,整体的思想是很好理解的.接下包括本篇在内的三篇文章,我们来用深度学习解决三个实际问题,也是非常经典的三个问题,分别是: 二分类问题(电影评论的好坏偏向性判断) 多分类问题(将新闻按照主题分类) 回归问题(根据房地产数据估算房地产价格) 我们解决这三个问题用到的训练模型为: 今天是第一篇,我们关注他们其中比较简单的二分类问题,代码