DNNClassifier TensorFlow 相关分类查询

Posted

技术标签:

【中文标题】DNNClassifier TensorFlow 相关分类查询【英文标题】:DNNClassifier Tensorflow related classification queries 【发布时间】:2019-06-02 20:47:09 【问题描述】:

我在 csv 中有输入和输出:training.csv 输出格式为-1,0, or 1,可以看到输出列。 以下是我用于DNNClassifier 的代码:

import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import tensorflow as tf
from sklearn.model_selection import train_test_split
from tensorflow.contrib.tensorboard.plugins import projector
import csv
import os
print(os.listdir("input"))

data = pd.read_csv("training.csv")
data = data.fillna(0)
print((data.columns))

data[:-1] = data[:-1].apply(lambda x: (x - x.min()) / (x.max()-x.min()) )

feat_cols=[]
for i in range(len(data.columns)-1):
    feat_cols.append(tf.feature_column.numeric_column(data.columns[i]))

data['output'] = data['output'].astype('int64')
data.info()

input_x = data.drop('output',axis=1)
input_y = data['output']

input_x.shape

X_train, X_test, y_train, y_test = train_test_split(input_x, input_y, test_size = 0.10, random_state = 0)

# write an input function
input_func = tf.estimator.inputs.pandas_input_fn(x=X_train, y=y_train, batch_size=10, num_epochs=1000, shuffle=True,target_column="output")

# Dense neural network means every neuron is connected to every neuron in the next stage
dnn_model = tf.estimator.DNNClassifier(hidden_units=[10,10], feature_columns=feat_cols, n_classes=3,model_dir="DNN1",        
                                       activation_fn=tf.nn.leaky_relu,optimizer=tf.train.AdamOptimizer(learning_rate=0.0001) )
# no need to create embedded columns, all columns are already embedded

# PULL THE LEVER, KRONK!
output = dnn_model.train(input_fn=input_func, steps=1000)
print("this is output====>   ",output)

# Evaluate the model
eval_input_func = tf.estimator.inputs.pandas_input_fn(x=X_test, y=y_test, batch_size=10, num_epochs=1, shuffle=False,)
results = dnn_model.evaluate(eval_input_func)
print(results)

# Make some predictions
pred_input_func = tf.estimator.inputs.pandas_input_fn(x=X_train, batch_size=10, num_epochs=1, shuffle=False)
predictions = dnn_model.predict(pred_input_func)
my_pred=list(predictions)

for i in predictions:
    print(i)

data1 = pd.DataFrame(my_pred)

data1.head()

data1.to_csv("pred_class.csv")

n_classes = 3 时,我得到的输出为:Gist holding the output 当n_classes = 2 时,我得到的输出为:Gist holding the output

我的问题:

1) 当n_classes = 3 时,我看到包含logit 的列,但是当n_classes=2 我看到额外列为logistic。为什么会这样?这个单独的列的目的是什么?

2) 为什么分类器不以 3 的形式对输出进行分类,因为输出列有 3 个不同的输出?

3)分类器是在预测输出的下一步还是output列中的对应结果?

4) 哪个是我的输出列,以便我可以检查预测的输出?是logit 还是logistic

请给我建议。我希望我的问题很清楚。

【问题讨论】:

【参考方案1】:

对于 3 个类别,最终输出层会将概率分布视为多项变量,而对于 2 个类别,它将是一个二元变量。

ML 中的 Logits 是指应用 softmax 函数获得的非归一化对数概率。逻辑是指将 sigmoid 激活函数之类的东西应用于二进制分类以产生类似于概率的东西。如果您通过取指数来标准化和缩放您的 logits,您将在 3 个类的情况下获得概率列。如果有 2 个类,您可以看到概率输出对应于您的逻辑输出,即 1-p 和 p。在 2 个类的情况下,通常您可以承受只有一个输出节点,因为结果是 0/1 类型。这就是为什么您会看到两种结果。

输出总是根据每个类别的概率。您可以通过查看与最大概率对应的输出节点来了解网络认为该输入属于哪个类。但通常,您将通过查看您的预期输出是否在系统认为该特定数据点的众多输出中排在首位,从而衡量系统的运行情况。所以我们有可能看看它是否不是第一个猜测,也许是第二个猜测,如果是,那么有什么信心等等。 所以你的输出可以从概率列中推断出来。 classes 列也相应地通过推断哪个概率是最大的来告诉同样的事情。

【讨论】:

这是一个很酷的答案。猜猜我的激活函数不是softmax,而是relu。我仍然可以从您在答案中推断出的几点来理解。谢谢你的解释

以上是关于DNNClassifier TensorFlow 相关分类查询的主要内容,如果未能解决你的问题,请参考以下文章

DNNCLassifier Tensorflow 上的 label_keys 类型错误

在 Tensorflow 的 DNNClassifier 估计器中记录设备信息

Tensorflow DNNClassifier 和 scikit-learn GridSearchCV 问题

导入tensorflow贡献学习python学习

如何在TensorFlow中创建自定义估算器?

根据 CPU 上的批量大小、哈希桶大小、内存等调整 Tensorflow 估计器?