如何解决Keras模型预测和sklearn混淆矩阵结果问题
我对Keras模型,预测和混淆矩阵有疑问。
我想将此Keras教程更改为多个课程。
https://www.tensorflow.org/tutorials/structured_data/feature_columns
我读入数据并将6个string
目标类编码为int
dataframe = pd.read_csv("my_csv.csv")
target = 'some_target'
labelencoder = LabelEncoder()
dataframe[target] = labelencoder.fit_transform(dataframe[target])
然后我拆分数据,创建列,创建模型并拟合
train,test = train_test_split(dataframe,test_size=0.2)
train,val = train_test_split(train,test_size=0.2)
# A utility method to create a tf.data dataset from a Pandas Dataframe
def df_to_dataset(dataframe,target,shuffle=True,batch_size=32):
dataframe = dataframe.copy()
labels = dataframe.pop(target)
ds = tf.data.Dataset.from_tensor_slices((dict(dataframe),labels))
if shuffle:
ds = ds.shuffle(buffer_size=len(dataframe))
ds = ds.batch(batch_size)
return ds,labels
feature_columns = []
f = feature_column.categorical_column_with_vocabulary_list(
field,unique_categories)
feature_columns.append(feature_column.embedding_column(f,dimension=8))
f2 = feature_column.categorical_column_with_vocabulary_list(
field,unique_categories)
indicator_column = feature_column.indicator_column(f2)
feature_columns.append(indicator_column)
feature_columns.append(feature_column.numeric_column(field))
feature_layer = tf.keras.layers.DenseFeatures(feature_columns)
batch_size = 32
train_ds,train_labels = df_to_dataset(train,batch_size=batch_size)
val_ds,val_labels = df_to_dataset(val,shuffle=False,batch_size=batch_size)
test_ds,test_labels = df_to_dataset(test,batch_size=batch_size)
model = tf.keras.Sequential([
feature_layer,layers.Dense(128,activation='relu'),layers.Dropout(.1),layers.Dense(1,activation='softmax')
])
# get hps
optimizer = 'adam'
loss_function = tf.keras.losses.BinaryCrossentropy(from_logits=True)
metrics = ['accuracy']
epochs = 1
model.compile(optimizer=optimizer,loss=loss_function,metrics=metrics)
model.fit(train_ds,validation_data=val_ds,epochs=epochs)
loss,accuracy = model.evaluate(test_ds)
print("Accuracy",accuracy)
predicted = model.predict(test_ds)
cf = confusion_matrix(test_labels,predicted)
当我运行model.predict时,输出结果很奇怪
[1.]
[1.]
[1.]
[1.]
[1.]
[1.]
[1.]
[1.]
混乱矩阵也不正确
[ 0 33 0 0 0 0]
[ 0 499 0 0 0 0]
[ 0 14 0 0 0 0]
[ 0 1089 0 0 0 0]
[ 0 360 0 0 0 0]
[0 4 0 0 0 0]
我为目标尝试了不同的编码,改变了损耗但无济于事
# mlb = MultiLabelBinarizer()
# dataframe[target] = mlb.fit_transform(dataframe[target])
loss='categorical_crossentropy'
我在这里做什么错了?
还尝试了6种输出神经元
model = tf.keras.Sequential([
feature_layer,layers.Dense(6,activation='softmax')
])
但出现错误
ValueError: logits and labels must have the same shape ((None,6) vs (None,1))
编辑:
print(type(train_ds))
# <class 'tensorflow.python.data.ops.dataset_ops.BatchDataset'>
print(train_ds)
# <BatchDataset shapes: ({feature1: (None,),feature2: (None,feature3: (None,feature4: (None,) ...
print(type(train_labels))
# <class 'pandas.core.series.Series'>
编辑: 取得一些进展。原来损耗函数和目标暗淡是依赖的: Tensorflow : logits and labels must have the same first dimension
如果您具有一维整数编码目标,则可以使用sparse_categorical_crossentropy作为损失函数
因此将损失更改为:
sparse_categorical_crossentropy
现在,当我运行model.predict输出看起来更好
[0.02313532 0.39231667 0.0117254 0.42083895 0.15037686 0.00160678]
[2.3085043e-02 3.3588389e-01 8.1730038e-03 4.8321337e-01 1.4923279e-01
4.1199493e-04]
[8.1658429e-03 3.3901721e-01 2.3666199e-03 5.3861737e-01 1.1167890e-01
1.5400720e-04]
[8.6198252e-04 1.2048376e-01 1.3487167e-02 4.1729528e-01 4.4759643e-01
2.7547608e-04]
[0.06842247 0.31534496 0.02852604 0.40057638 0.17933881 0.0077913 ]
[0.05149424 0.34782204 0.02664029 0.34621894 0.22060096 0.00722347]
然后获得最高预测指数并传递到混淆矩阵
predictions_index = np.argmax(predicted,axis=1)
cf = confusion_matrix(test_labels,predictions_index)
混乱矩阵看起来更好
[ 0 3 0 27 2 0]
[ 0 37 0 386 54 0]
[ 0 0 0 14 1 0]
[ 0 13 0 968 124 0]
[ 0 4 0 309 49 0]
[0 0 0 6 2 0]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。