DNNClassifier Tensorflow相关的分类查询

时间:2019-01-08 07:29:02

标签: python python-3.x tensorflow classification

我在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 个答案:

答案 0 :(得分:1)

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

ML中的Logits指的是应用softmax函数获得的非标准化对数概率。 Logistic指的是对二进制分类应用诸如S型激活函数之类的东西以产生类似于概率的东西。如果您采用指数对logit进行归一化和缩放,那么在3类情况下,您将获得“概率”列。在2类的情况下,您可以看到与逻辑输出相对应的概率输出为1-p和p。在2类的情况下,通常您只能负担一个输出节点,因为结果是0/1类型。这就是为什么您会看到两种结果的原因。

输出始终以每个类别的概率表示。通过查看与最大概率相对应的输出节点,可以看到网络认为此输入属于哪个类。但是通常,您会通过查看预期输出是否位于系统认为该特定数据点的输出如此多的顶部来衡量系统的运行状况。因此,我们有概率查看它是否不是第一个猜测,也许是第二个,是否有把握,等等。 因此,可以从概率列中推断出您的输出。 “类别”列还通过推断哪个概率最大来相应地告诉同一件事。