尝试为疾病创建分类器,但返回了错误的输出

我正在尝试制作一个应用程序,该应用程序可以将患者的症状作为输入,并输出三种最可能的疾病。

x_train, x_test, y_train, y_test = sklearn.model_selection.train_test_split(x, y, test_size=0.4)inputs = keras.Input(shape=(9,))hidden_1 = keras.layers.Dense(12, activation='selu')(inputs)hidden_2 = keras.layers.Dense(12, activation='relu')(hidden_1)outputs = keras.layers.Dense(32, activation='sigmoid')(hidden_2)model = keras.Model(inputs=inputs, outputs=outputs)model.compile(optimizer='adam',              loss='categorical_crossentropy',              metrics=['categorical_accuracy'])model.summary()model.fit(x_train, y_train, epochs=200)  # starts trainingprediction = model.predict(x_test)print(prediction)scores = model.evaluate(x_test, y_test, verbose=0)print(scores)print(prediction[0])print(y_test[0])model.save("modeldisease.h5")

但是当我将这个模型保存并加载到另一个Python文件中时,输出列表看起来像这样:

  [[0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00  1.000000e+00 0.000000e+00 0.000000e+00 1.842211e-21 0.000000e+00  0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 1.000000e+00  1.000000e+00 1.000000e+00 1.000000e+00 1.000000e+00 0.000000e+00  0.000000e+00 0.000000e+00 0.000000e+00 1.000000e+00 0.000000e+00  0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00  1.000000e+00 0.000000e+00]]100.0 100.0 100.0HEPATITE A HEPATITE_ALCOOLICA REFLUXO_GASTROESOFAGICOProcess finished with exit code 0

我哪里做错了?它不应该只返回一个预测列表,其中的所有值加起来等于1吗?数据集链接: https://drive.google.com/file/d/1LFCtuBKodGkm1NNdv3QdXOwzlSqdip5q/view?usp=sharing

完整代码:

from tensorflow import kerasimport numpy as npimport sklearnfrom sklearn import preprocessingimport pandas as pddata = pd.read_csv("DATA.csv", sep=";")obj_data = data.select_dtypes(include=["object"]).copy()obj_data_names = []for col in obj_data.columns:    obj_data_names.append(col)for col_name in obj_data_names:    data[col_name] = data[col_name].astype('category')    data[col_name + "_cat"] = data[col_name].cat.codes    data[col_name] = data[col_name + "_cat"]    data.drop(col_name + "_cat", 1, inplace=True)print(data)data.fillna(0, inplace=True)x = np.array(data.drop(["Doenca"], 1))y = np.array(data["Doenca"])x = preprocessing.normalize(x)y = keras.utils.to_categorical(y)x_train, x_test, y_train, y_test = sklearn.model_selection.train_test_split(x, y, test_size=0.4)inputs = keras.Input(shape=(9,))hidden_1 = keras.layers.Dense(12, activation='selu')(inputs)hidden_2 = keras.layers.Dense(12, activation='relu')(hidden_1)outputs = keras.layers.Dense(32, activation='sigmoid')(hidden_2)model = keras.Model(inputs=inputs, outputs=outputs)model.compile(optimizer='adam',              loss='categorical_crossentropy',              metrics=['categorical_accuracy'])model.summary()model.fit(x_train, y_train, epochs=200)  # starts trainingprediction = model.predict(x_test)print(prediction)scores = model.evaluate(x_test, y_test, verbose=0)print(scores)print(prediction[0])print(y_test[0])model.save("modeldisease.h5")for i in range(len(y_test)):    max_expected = np.amax(y_test[i])    #print(max_expected)    y_expected = np.where(y_test[i] == max_expected)    print(y_expected[0])    max_predicted = np.amax(prediction[i])    #print(max_predicted)    y_predicted = np.where(prediction[i] == max_predicted)    print(y_predicted[0])    classes = ["ACNE", "AIDS", "ALERGIA", "ARTRITE", "ARTROSE", "CATAPORA", "COLESTASE", "DENGUE", "DIABETES", "ENXAQUECA", "ESPONDILOSE",               "FEBRE_TIFOIDE", "GASTROENTERITE", "GRIPE", "HEPATITE_ALCOOLICA", "HEPATITE A", "HEPATITE B", "HEPATITE C", '"HEPATITE D',               "HEPATITE E", "HIPERTENSAO", "HIPERTENSAO", "HIPERTIROIDISMO", "HIPOGLICEMIA", "HIPOTIREODISMO", "IMPETIGO", "INFECCA_URINA",               "MALARIA", "PNEUMONIA", "PSORIASE", "REFLUXO_GASTROESOFAGICO", 'TUBERCULOSE', "ULCERA GASTRICA"]    print(f"Valor esperado: {classes[int(y_expected[0])]}, Valor previsto: {classes[int(y_predicted[0])]}")# print(prediction[0][0])# print(round(prediction[0][0]))# print(classes[round(int(prediction[0][0]))])#print(y_test)#print(prediction)

加载代码:

from tensorflow import kerasmodel = keras.models.load_model("modeldisease.h5")result = model.predict([(12, 40, 39, 17, 0, 0, 0, 0, 0)])print(result)sortedshit = result[0].argsort()[-3:][::-1]p1 = result[0][sortedshit[0]]p2 = result[0][sortedshit[1]]p3 = result[0][sortedshit[2]]classes = ["ACNE", "AIDS", "ALERGIA", "ARTRITE", "ARTROSE", "CATAPORA", "COLESTASE", "DENGUE", "DIABETES", "ENXAQUECA",           "ESPONDILOSE",           "FEBRE_TIFOIDE", "GASTROENTERITE", "GRIPE", "HEPATITE_ALCOOLICA", "HEPATITE A", "HEPATITE B", "HEPATITE C",           '"HEPATITE D',           "HEPATITE E", "HIPERTENSAO", "HIPERTENSAO", "HIPERTIROIDISMO", "HIPOGLICEMIA", "HIPOTIREODISMO", "IMPETIGO",           "INFECCA_URINA",           "MALARIA", "PNEUMONIA", "PSORIASE", "REFLUXO_GASTROESOFAGICO", 'TUBERCULOSE', "ULCERA GASTRICA"]print(p1*100, p2*100, p3*100)print(classes[sortedshit[0]], classes[sortedshit[1]], classes[sortedshit[2]])

回答:

使用softmax激活函数代替sigmoid:

outputs = keras.Dense(32,activation='softmax')(hidden_2)

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注