Ниже приведено воспроизводимое решение, которое использует dplyr
и встроенный набор данных mtcars
.
Прогулка по коду: сначала создайте функцию is_outlier
, которая вернет логическое значение TRUE/FALSE
, если переданное ему значение является выбросом. Затем мы выполняем «анализ / проверку» и построим данные - сначала мы group_by
нашу переменную (cyl
в этом примере, в вашем примере это будет PortugesOutcome
), и мы добавим переменную outlier
в вызов mutate
(если переменная drat
является outlier [обратите внимание, что это соответствует RatioPort2Dutch
в вашем примере], мы передадим значение drat
, в противном случае мы вернем NA
, чтобы значение не было график). Наконец, мы построим результаты и построим текстовые значения через geom_text
и эстетическую метку, равную нашей новой переменной; кроме того, мы компенсируем текст (сдвинем его немного вправо) с помощью hjust
, чтобы мы могли видеть значения рядом с точками outlier, а не поверх них.
library(dplyr)
library(ggplot2)
is_outlier <- function(x) {
return(x < quantile(x, 0.25) - 1.5 * IQR(x) | x > quantile(x, 0.75) + 1.5 * IQR(x))
}
mtcars %>%
group_by(cyl) %>%
mutate(outlier = ifelse(is_outlier(drat), drat, as.numeric(NA))) %>%
ggplot(., aes(x = factor(cyl), y = drat)) +
geom_boxplot() +
geom_text(aes(label = outlier), na.rm = TRUE, hjust = -0.3)
Слой Keras LSTM ожидает, что входной сигнал будет 3
тусклым, как (batch_size, seq_length, input_dims)
, но вы ошиблись. Попробуйте это
input_dims = train_x.shape[1]
seq_length = #decide an integer
model = Sequential()
model.add(LSTM(128, activation='relu', input_shape=(seq_length, input_dims), return_sequences=True))
Также вам нужно изменить ваши данные на три dim, где новые dim будут представлять последовательность, как
Я использовал игрушечный набор данных, чтобы показать пример, здесь данные и метки изначально имеют форму ((150, 4), (150,))
, используя следующий скрипт:
seq_length = 10
dataX = []
dataY = []
for i in range(0, 150 - seq_length, 1):
dataX.append(data[i:i+seq_length])
dataY.append(labels[i+seq_length-1])
import numpy as np
dataX = np.reshape(dataX, (-1, seq_length, 4))
dataY = np.reshape(dataY, (-1, 1))
# dataX.shape, dataY.shape
Вывод: ((140, 10, 4), (140, 1))
Теперь вы можете безопасно передать его модели.
Примечание: я подготовил набор данных для модели many-to-one
, но вы можете использовать его соответствующим образом.