Как можно получить значения вероятности для каждого класса с помощью метода прогнозирования на модели ANN на Керасе - PullRequest
0 голосов
/ 28 марта 2020

Я новичок в предметах глубокого обучения, мне нужна помощь для получения индивидуальных вероятностей для каждого класса на модели искусственной нейронной сети (ANN) Keras. У меня есть набор каталогов exopl anet от PHL, и я пытаюсь делать прогнозы в зависимости от того, пригоден ли pl anet, пригоден для обитания или нет. На данный момент я пробовал ANN с некоторыми важными столбцами, такими как

dataToLearn = data[["P_DISTANCE","S_HZ_OPT_MIN", "S_HZ_OPT_MAX", "S_HZ_CON_MIN", "S_HZ_CON_MAX", "P_TYPE", "P_ESI", "P_HABITABLE"]]
class_names = list(dataToLearn.columns)

. Я избавился от некоторых значений 'nan',

dataToLearn = dataToLearn.dropna(how='all')
dataToLearn = dataToLearn.dropna(subset=['P_TYPE', 'P_ESI'])

затем предварительно обработали данные,

labelencoder_pType = LabelEncoder()
dataToLearn["P_TYPE"] = labelencoder_pType.fit_transform(dataToLearn["P_TYPE"])
onehotencoder = ColumnTransformer([("P_TYPE", OneHotEncoder(),[5])], remainder = "passthrough")
dataToLearn = onehotencoder.fit_transform(dataToLearn)
#Dummy Variable Trap
dataToLearn = dataToLearn[:,1:]
dataToLearn = pd.DataFrame(dataToLearn)

X = dataToLearn.iloc[:,:10].values
Y = dataToLearn.iloc[:,10].values
Y = pd.get_dummies(Y).values
x_train, x_test, y_train, y_test = train_test_split(X,Y,test_size = 0.35)
y_test = y_test.astype(np.float64)
y_train = y_train.astype(np.float64)
sc_X = ColumnTransformer([("",StandardScaler(),slice(0,10))])
x_train = sc_X.fit_transform(x_train)
x_test = sc_X.transform(x_test)

, как вы можете видеть, у вас есть горячее кодирование выходных (Y) значений, но я не уверен, нужно ли мне это делать в мультиклассовых задачах. На следующем шаге я построил классификатор, как показано ниже.

def build_classifier():
    classifier = Sequential() # initialize neural network
    classifier.add(Dense(units = 10, kernel_initializer = 'uniform', activation = 'relu', input_dim = x_train.shape[1]))
    classifier.add(Dense(units = 8, kernel_initializer = 'uniform', activation = 'relu'))
    classifier.add(Dropout(0.3))
    classifier.add(Dense(units = 8, kernel_initializer = 'uniform', activation = 'relu'))
    classifier.add(Dropout(0.3))
    classifier.add(Dense(units = 3, kernel_initializer = 'uniform', activation = 'softmax'))
    classifier.compile(optimizer = 'RMSprop', loss = 'categorical_crossentropy', metrics = ['accuracy'])
return classifier
classifier = KerasClassifier(build_fn = build_classifier, batch_size = 32, epochs = 150)
accuracies = cross_val_score(estimator = classifier, X = x_train, y = y_train, cv = 10, n_jobs = -1)
accuracyMean = accuracies.mean()
classifier.fit(x_train, y_train)

Затем предсказал x_test с помощью

y_pred = classifier.predict(x_test)

Проблема в том, что я не могу получить прогнозируемый массив (y_pred) с То же самое измерение, что и у y_test, который закодирован в горячем виде в соответствии с тремя вариантами. В y_pred я всегда получаю 0 (не пригодный для обитания) или 2 (возможно пригодный для обитания) результат и никогда не 1 (пригодный для обитания), но в форме одного столбца, я думаю, что причина сбоя модели при прогнозировании 1 (пригодного для жизни) случая заключается в редкости этого случая в наборе данных. Но я до сих пор не знаю, почему y_pred имеет форму одного столбца, и я не могу найти хорошее объяснение того, как сделать мультиклассовую классификацию по керасу ANN на inte rnet.

1 Ответ

0 голосов
/ 28 марта 2020
  1. Попробуйте добавить class_weight, назначьте высокий вес для класса 1
class_weight = {0: 1.,
                1: 50.,
                2: 2.}

classifier.fit(x_train, y_train, clf__class_weight = class_weight)
Чтобы получить вероятность класса с последовательной моделью Keras
y_pred = classifier.predict_proba(x_test)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...