Стандартные ошибки из регрессии logisti c в тесте значимости keras - PullRequest
2 голосов
/ 30 марта 2020

У меня есть две независимые переменные (x1, x2), которые я использую, чтобы предсказать y (двоичное). С регрессией logisti c я мог бы просто использовать стандартные ошибки каждого оцененного коэффициента, чтобы проверить их на значимость.

Однако , у меня есть глубокая сеть, основанная на inputA (некоторые text) и inputB (числовые данные).

Это означает, что мне пришлось бы извлечь стандартные ошибки из последнего слоя, чтобы проверить значимость коэффициента inputB. В противном случае было бы невозможно проверить, действительно ли inputB значительно добавляет к модели. Как извлечь стандартные ошибки из регрессионного прогона logisti c в модели глубокого обучения (керас)?

#### Network
# define two sets of inputs
inputA = Input(shape=(32,))
inputB = Input(shape=(128,))

# the first branch operates on the first input
x = Dense(8, activation="relu")(inputA)
x = Dense(4, activation="relu")(x)
x = Model(inputs=inputA, outputs=x)

# the second branch opreates on the second input
y = Dense(64, activation="relu")(inputB)
y = Dense(32, activation="relu")(y)
y = Dense(4, activation="relu")(y)
y = Model(inputs=inputB, outputs=y)

# combine the output of the two branches
combined = concatenate([x.output, y.output])

# our model will accept the inputs of the two branches and
# then output a single value
preds = Dense(1, activation='sigmoid',name='output')(combined) 
model = Model(inputs=[x.input, y.input], outputs=[preds])

model.compile(loss='binary_crossentropy',optimizer='adam', metrics=['acc'])

model.fit([x_train,numeric], y_train, epochs=40, batch_size=50)

Редактировать:

Теперь я нашел эту полезную ссылку:

https://stats.stackexchange.com/questions/89484/how-to-compute-the-standard-errors-of-a-logistic-regressions-coefficients

Итак, я предполагаю, что мог бы использовать y_pred = model.predict(inputs=[x_train,numeric], verbose=1) # gives probabilities

, а затем, Я должен ввести combined в следующий код ... но как мне это сделать ... или мой подход ошибочен?

#### Standard Error testing
# Design matrix -- add column of 1's at the beginning of your X_train matrix
X_design = np.hstack([np.ones((combined.shape[0], 1)), combined])

# Initiate matrix of 0's, fill diagonal with each predicted observation's variance
V = np.diagflat(np.product(y_preds, axis=1))


# Covariance matrix
covLogit = np.linalg.inv(np.dot(np.dot(X_design.T, V), X_design))

Может кто-нибудь добавить несколько предложений / проверок?

Edit2

Меня смущает то, что у меня есть два входа: числовой c -вход numeric и ненулевой c вход x_train. Чтобы проверить коэффициенты, мне нужно создать матрицу в виде комбинированного ввода (который фактически заполнен комбинированным вводом).

Затем я могу использовать прогноз моделей, чтобы проверить значимость коэффициентов последних слоев (как описано в ссылочной ссылке для тестирования коэффициентов).

Но как мне ввести составной ввод .. или я где-то ошибаюсь?

1 Ответ

4 голосов
/ 04 апреля 2020

Не уверен, что этот ответ хорош для вас ....

Что бы я сделал?

  • Проверьте сеть только с inputA.
  • Проверьте сеть только с inputB.
  • Проверка объединенной сети.

Я выберу победителя.


Получение количества каждого входного сигнала, который пропускает сеть:

Если вы получите вес последнего слоя, у вас будет два тензора:

  • A (1,) значение смещения

Получить их:

w, b = model.get_layer("output").get_weights()

Свести w (это не имеет значения, потому что у вас есть только 1 выходная единица ) и посмотрите, сколько сеть оценивает каждый из входов. Следуя порядку, в котором вы объединили x и y:

w = w.reshape((-1,))
weights_x = w[:4] #the first 4 weigths are multiplying `x.output`   
weights_y = w[4:] #the last 4 weights are multiplying `y.output`
...