多目标和多类预测

2024-01-12

我对机器学习和张量流比较陌生。我想训练数据,以便可以进行 2 个目标和多个类别的预测。这是可以做的事情吗?我能够为 1 个目标实现该算法,但不知道如何为第二个目标实现该算法。

数据集示例: 一年中的某一天温度流量能见度

316 8   1   4
285 -1  1   4
326 8   2   5
323 -1  0   3
10  7   3   6
62  8   0   3
56  8   1   4
347 7   2   5
363 7   0   3
77  7   3   6
1   7   1   4
308 -1  2   5
364 7   3   6

如果我训练(DayOfYear 温度流),我可以很好地预测能见度。但我也需要以某种方式预测 Flow。我非常确定 Flow 会影响可见性,所以我不确定如何处理。

这是我的实现

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import os
import urllib

import numpy as np
import tensorflow as tf

# Data sets
TRAINING = "/ml_baetterich_learn.csv"
TEST = "/ml_baetterich_test.csv"
VALIDATION = "/ml_baetterich_validation.csv"

def main():

  # Load datasets.
  training_set = tf.contrib.learn.datasets.base.load_csv_without_header(
      filename=TRAINING,
      target_dtype=np.int,
      features_dtype=np.int,
      target_column=-1)
  test_set = tf.contrib.learn.datasets.base.load_csv_without_header(
      filename=TEST,
      target_dtype=np.int,
      features_dtype=np.int,
      target_column=-1)
  validation_set = tf.contrib.learn.datasets.base.load_csv_without_header(
      filename=VALIDATION,
      target_dtype=np.int,
      features_dtype=np.int,
      target_column=-1)

  # Specify that all features have real-value data
  feature_columns = [tf.contrib.layers.real_valued_column("", dimension=3)]

  # Build 3 layer DNN with 10, 20, 10 units respectively.
  classifier = tf.contrib.learn.DNNClassifier(feature_columns=feature_columns,
                                              hidden_units=[10, 20, 10],
                                              n_classes=9,
                                              model_dir="/tmp/iris_model")
  # Define the training inputs
  def get_train_inputs():
    x = tf.constant(training_set.data)
    y = tf.constant(training_set.target)

    return x, y

  # Fit model.
  classifier.fit(input_fn=get_train_inputs, steps=4000)

  # Define the test inputs
  def get_test_inputs():
    x = tf.constant(test_set.data)
    y = tf.constant(test_set.target)

    return x, y

  # Define the test inputs
  def get_validation_inputs():
    x = tf.constant(validation_set.data)
    y = tf.constant(validation_set.target)

    return x, y

  # Evaluate accuracy.
  accuracy_test_score = classifier.evaluate(input_fn=get_test_inputs,
                                       steps=1)["accuracy"]

  accuracy_validation_score = classifier.evaluate(input_fn=get_validation_inputs,
                                       steps=1)["accuracy"]

  print ("\nValidation Accuracy: {0:0.2f}\nTest Accuracy: {1:0.2f}\n".format(accuracy_validation_score,accuracy_test_score))

  # Classify two new flower samples.
  def new_samples():
    return np.array(
      [[327,8,3],
       [47,8,0]], dtype=np.float32)

  predictions = list(classifier.predict_classes(input_fn=new_samples))

  print(
      "New Samples, Class Predictions:    {}\n"
      .format(predictions))

if __name__ == "__main__":
    main()

方案一:多头模型

您可以使用多头 DNNEstimator 模型。这将 Flow 和 Visibility 视为两个独立的 softmax 分类目标,每个目标都有自己的一组类。我不得不修改load_csv_without_header支持多个目标的辅助函数(这可能更清晰,但这不是这里的重点 - 请随意忽略它的细节)。

import numpy as np
import tensorflow as tf
from tensorflow.python.platform import gfile
import csv
import collections

num_flow_classes = 4
num_visib_classes = 7

Dataset = collections.namedtuple('Dataset', ['data', 'target'])

def load_csv_without_header(fn, target_dtype, features_dtype, target_columns):
    with gfile.Open(fn) as csv_file:
        data_file = csv.reader(csv_file)
        data = []
        targets = {
            target_cols: []
            for target_cols in target_columns.keys()
        }
        for row in data_file:
            cols = sorted(target_columns.items(), key=lambda tup: tup[1], reverse=True)
            for target_col_name, target_col_i in cols:
                targets[target_col_name].append(row.pop(target_col_i))
            data.append(np.asarray(row, dtype=features_dtype))

        targets = {
            target_col_name: np.array(val, dtype=target_dtype)
            for target_col_name, val in targets.items()
        }
        data = np.array(data)
        return Dataset(data=data, target=targets)

feature_columns = [
    tf.contrib.layers.real_valued_column("", dimension=1),
    tf.contrib.layers.real_valued_column("", dimension=2),
]
head = tf.contrib.learn.multi_head([
    tf.contrib.learn.multi_class_head(
        num_flow_classes, label_name="Flow", head_name="Flow"),
    tf.contrib.learn.multi_class_head(
        num_visib_classes, label_name="Visibility", head_name="Visibility"),
])
classifier = tf.contrib.learn.DNNEstimator(
    feature_columns=feature_columns,
    hidden_units=[10, 20, 10],
    model_dir="iris_model",
    head=head,
)

def get_input_fn(filename):
    def input_fn():
        dataset = load_csv_without_header(
            fn=filename,
            target_dtype=np.int,
            features_dtype=np.int,
            target_columns={"Flow": 2, "Visibility": 3}
        )
        x = tf.constant(dataset.data)
        y = {k: tf.constant(v) for k, v in dataset.target.items()}
        return x, y
    return input_fn

classifier.fit(input_fn=get_input_fn("tmp_train.csv"), steps=4000)
res = classifier.evaluate(input_fn=get_input_fn("tmp_test.csv"), steps=1)

print("Validation:", res)

选项 2:多标记头

如果您将 CSV 数据以逗号分隔,并保留一行可能具有的所有类的最后一列(以某些标记(例如空格)分隔),则可以使用以下代码:

import numpy as np
import tensorflow as tf

all_classes = ["0", "1", "2", "3", "4", "5", "6"]

def k_hot(classes_col, all_classes, delimiter=' '):
    table = tf.contrib.lookup.index_table_from_tensor(
        mapping=tf.constant(all_classes)
    )
    classes = tf.string_split(classes_col, delimiter)
    ids = table.lookup(classes)
    num_items = tf.cast(tf.shape(ids)[0], tf.int64)
    num_entries = tf.shape(ids.indices)[0]

    y = tf.SparseTensor(
        indices=tf.stack([ids.indices[:, 0], ids.values], axis=1),
        values=tf.ones(shape=(num_entries,), dtype=tf.int32),
        dense_shape=(num_items, len(all_classes)),
    )
    y = tf.sparse_tensor_to_dense(y, validate_indices=False)
    return y

def feature_engineering_fn(features, labels):
    labels = k_hot(labels, all_classes)
    return features, labels

feature_columns = [
    tf.contrib.layers.real_valued_column("", dimension=1), # DayOfYear
    tf.contrib.layers.real_valued_column("", dimension=2), # Temperature
]
classifier = tf.contrib.learn.DNNEstimator(
    feature_columns=feature_columns,
    hidden_units=[10, 20, 10],
    model_dir="iris_model",
    head=tf.contrib.learn.multi_label_head(n_classes=len(all_classes)),
    feature_engineering_fn=feature_engineering_fn,
)

def get_input_fn(filename):
    def input_fn():
        dataset = tf.contrib.learn.datasets.base.load_csv_without_header(
            filename=filename,
            target_dtype="S100", # strings of length up to 100 characters
            features_dtype=np.int,
            target_column=-1
        )
        x = tf.constant(dataset.data)
        y = tf.constant(dataset.target)
        return x, y
    return input_fn

classifier.fit(input_fn=get_input_fn("tmp_train.csv"), steps=4000)
res = classifier.evaluate(input_fn=get_input_fn("tmp_test.csv"), steps=1)

print("Validation:", res)

我们正在使用DNNEstimator with a multi_label_head,它使用 sigmoid 交叉熵而不是 softmax 交叉熵作为损失函数。这意味着每个输出单位/logit 都通过 sigmoid 函数传递,这给出了数据点属于该类的可能性,即这些类是独立计算的,并且不像 softmax 交叉熵那样是相互排斥的。这意味着您可以有 0 到len(all_classes)为训练集中的每一行设置的类和最终预测。

另请注意,类表示为字符串(并且k_hot转换为令牌索引),以便您可以在电子商务设置中使用任意类标识符,例如类别 UUID。如果第 3 列和第 4 列中的类别不同(流 ID 1!= 可见性 ID 1),您可以将列名称添加到每个类 ID 之前,例如

316,8,flow1 visibility4 285,-1,flow1 visibility4 326,8,flow2 visibility5

有关如何进行的说明k_hot作品,请参阅我的另一个答案 https://stackoverflow.com/questions/45159133/does-tf-one-hot-supports-sparsetensor-as-indices-parameter/47657743#47657743。我决定使用k_hot作为一个单独的函数(而不是直接定义它feature_engineering_fn因为它是一个独特的功能,并且 TensorFlow 可能很快就会有类似的实用功能。

请注意,如果您现在使用前两列来预测最后两列,那么您的准确性肯定会下降,因为最后两列高度相关,并且使用其中一列将为您提供有关另一列的大量信息。实际上,您的代码仅使用了第三列,如果目标是预测第三列和第四列,那么无论如何这都是一种作弊。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多目标和多类预测 的相关文章

随机推荐

  • pandas to_numeric downcast='signed' 返回 float64

    我有一个数据集 其中 pandas read csv 处理适当地将一些连续数字列 特征 变量数据从对象转换为 float64 int64 或 uint8 但不是其他数据 因此 然后我尝试使用以下指定向下转换参数的 pandas to num
  • 如何使用 Javascript 停止 YouTube 中的视频?

    情况 here http yvoschaap com videowall q sunset 20beautiful我在那里按了一些视频 Problem 我尝试在 Firebug 控制台中通过 Javascript 停止视频 player s
  • 从另一个表和不同的数据库更新表

    基本上 我想做的是 我的第一个数据库 prc 中有一个表 users 如下所示 prc user id user 45 name user Test login user test pwd user test 在我的第二个数据库 名为 pr
  • 使用 awk 替换 CSV 文件中的列值

    我有这个文件 错误日志 00 00 00 284 501 00 00 00 417 5 5294100071980 00 00 02 463 501 00 00 05 169 501 00 00 05 529 501 00 00 05 73
  • Delphi - 通用 TList 排序

    我正在使用 Generics Collections TList 和 Sort 方法 它工作正常 但我想最后对空值或空值进行排序 按升序和降序排序 如何实施 这是我的排序功能 function TForm SortByColumn Colu
  • 按行项目条件更改 MudBlazor 表背景颜色

    我正在尝试更改 mudblazor 表中一行的颜色 问题是 我无法添加根据行元素的条件更改颜色的功能
  • WPF 中的 PagedCollectionView 等效项?

    net 3 5 或 4 0 中是否有像 Silverlight 中的 PagedCollectionView 这样的 WPF 等效类 不 没有 但你可以从这里获取 https silverlight svn codeplex com svn
  • 确定可能的项目组的算法

    我正在摸不着头脑试图做到这一点 这让我筋疲力尽 我知道事情没那么复杂 我有很多物品 这个数量可以等于或大于三 然后我需要确定完成总数的项目组的可能组合 唯一的限制是小组应该有三个或更多项目 不超过 但包括 七个项目 例如 如果我有 7 个项
  • 为单词的前 n 个字符添加下划线

    我想在链接中的单词的前几个字符下划线 类似于 CSS 第一个字母的工作方式 但字母数量可变 或者 在单词字母的前半部分下划线可能会很有用 有什么方法可以使用 HTML CSS 或 Javascript 相对简单地完成此操作吗 我不是开发人员
  • Uncrustify 折叠 多行函数调用

    我的函数调用如下所示 没有明显的原因 func a b c 有没有办法让 uncrustify 将函数折叠成一行 我已经尝试了两天了 没有断断续续的 我让它适用于函数声明 但我没有让它适用于函数调用 当我们这样做时 我也有如下所示的函数 f
  • 为什么是语句(j++);禁止?

    下面的代码是错误的 看一下关于ideone http ideone com vSoRsM public class Test public static void Main int j 5 j if we remove the and th
  • 地点选择器启动后关闭

    我无法从我的片段启动 Google 地点选择器 按照所有步骤和论坛查找根本原因 但无法解决我的问题 Links 谷歌地点选择器 https developers google com places android api placepick
  • 领域:谓词返回 LazyFilterCollection - 如何转换为 Results

    我正在过滤我的数据库查询NSPredicate直接在数据库上 但我想进一步过滤返回的值 Results
  • 在react-navigation createStackNavigator中使用mobx存储

    我想在react navigation中的createStackNavigator中使用Mobx存储变量 具体来说 我想使用商店动态更改初始路线 以便用户可以更改初始屏幕 这可能吗 一些东西在 const stack createStack
  • 使用现有的 InputStream 作为附件内容通过 javax.mail 发送电子邮件

    是否可以使用发送电子邮件javax mail并使用 现有的 InputStream对于电子邮件附件内容 目前我正在构建电子邮件消息 如下所示 final MimeMessage message new MimeMessage session
  • 将水印图像放置在其他图像上(C#、ASP.Net)

    如何将水印图像添 加到其他图像上 我可以将文本作为水印放置在图像上 但现在我想将图像而不是文本放在那里 我如何在 C 中执行此操作 再说一次 我有图像 X 我想将其用作水印符号 我希望这个符号出现在我的网站上显示的所有图像上 所以我将在图像
  • 将标准输入(读取主机)重定向到 Powershell 脚本

    这是一个示例 powershell 脚本 in read host prompt input write host in 这是一个示例 test txt 文件 hello 我们想通过piped从 powershell 输入 这是我尝试过的一
  • 高效地从字符串流中读取格式化行

    为了从文本文件加载大量顶点 我将整个文件加载到内存中 然后我想扫描每一行以查找三个浮点数 以下有效 但我想知道它是好还是浪费 std stringstream sstr sstr lt lt file rdbuf file is an if
  • C++ 函数参数采用指针的地址作为参数。这是如何使用的?它是做什么用的?

    想象一个这样的函数 function Human human Implementation 你能解释一下 到底是什么吗 它有什么用 与仅传递指针或引用有何不同 您能提供一个小的且具有解释性的样本吗 谢谢 它就像一个双指针 您通过引用传递指针
  • 多目标和多类预测

    我对机器学习和张量流比较陌生 我想训练数据 以便可以进行 2 个目标和多个类别的预测 这是可以做的事情吗 我能够为 1 个目标实现该算法 但不知道如何为第二个目标实现该算法 数据集示例 一年中的某一天温度流量能见度 316 8 1 4 28