0

голосов
0

ответ
22

Просмотры

Design neural network to find inputs with highest probability of class

I am designing a neural network for classification with the aim to find the inputs with the highest probability that they belong to one of two classes. There are two classes, class A and class B. I have a set of data of which I want to find the inputs that have the highest probability that they belong to class B. This is different to conventional classification in that I'm not interested in the correct labelling of all inputs. I'm only interested in the correct labelling of the inputs that are labelled with a high probability to belong to class B. So the accuracy of the network could be calculated like this: Train the neural network Feed the validation data into the network Sort the resulting outputs, together with the known targets, by the returned probability for class B Take the top N samples, e.g. top 1% (now we have the outputs with the highest probability for class B) Count how many of the taken samples were actually of class B The accuracy is the number of actual instances of class B counted, divided by the number of samples taken N Say, we have a simple network like this: model = keras.Sequential([ keras.layers.Dense(7, input_dim=len(inputs_training[0]), activation=tf.nn.relu, kernel_regularizer=keras.regularizers.l2(0.0)), keras.layers.Dense(7, activation=tf.nn.relu, kernel_regularizer=keras.regularizers.l2(0.000001)), keras.layers.Dense(7, activation=tf.nn.relu, kernel_regularizer=keras.regularizers.l2(0.000001)), keras.layers.Dense(1, activation=tf.nn.sigmoid, kernel_regularizer=keras.regularizers.l2(0.00000)) ]) model.compile(optimizer='adam', loss=binary_crossentropy, metrics=['accuracy']) model.fit( np.array(inputs_training), np.array(targets_training), epochs=15, verbose=0, class_weight={0: 1, 1: 4} ) The problem is that, the more features (inputs) I add, the less accurate the prediction becomes - even though each features performs well on it's own. For example, I can use a single feature that gives me 40% accuracy in the top 1%. If I add two more features that perform similarly on their own, the accuracy drops to, say, 25-30%. Class B makes about 15% of the data. The second problem is that the accuracy in the top 1% fluctuates a lot. I have tried: Changing the number of layers / neurons, epochs Changing the class weights Changing regularisation parameters, including using l1 Trying different loss functions I speculate that none of this works because the neural network is optimising for the classification of all inputs, not optimizing to produce the highest accuracy in the top 1%. Is there a way how I can stir the neural network to optimize so that the most probable results are correct, but the remaining 99% can tend to be mislabelled? Demo code: https://pastebin.com/CnDpCjdp
ig-dev
2

голосов
1

ответ
3.8k

Просмотры

Командная строка: Показывает список опций и позволяет пользователю выбрать [закрыт]

Предполагая, что у меня есть список опций: опции = [ «Вариант 1», «Вариант 2», «Вариант 3»] И я хотел бы пользователю выбрать опцию в командной строке, например, что-то вроде этого: Пожалуйста, выберите: 1 ) Вариант 1 2) Вариант 2 3) Вариант 3 Введите номер: Так что я ищу для реализации следующих функций: выбор = let_user_pick (опция) # возвращает целое Как бы один идти об этом в Python?
ig-dev
3

голосов
1

ответ
88

Просмотры

Почему сложение разобранного двойники медленнее, чем при использовании BigDecimal в Java?

Почему результат + = Double.parseDouble (numberAsString) с результатом является двойным примитивно, медленнее, чем результат = result.add (новый BigDecimal (numberAsStrings)) с результатом будучи BigDecimal? Ориентиры: @Setup общественного ничтожной beforeEach () {numbersAsStrings = новый String [NUMBER_COUNT]; двойная currentNumber = 1; для (INT I = 0; г <NUMBER_COUNT; я ++) {numbersAsStrings [I] = String.valueOf (currentNumber); currentNumber + = 0,1; }} @Benchmark общественный двойной addUpDoublesParsedFromString () {двойной результат = 0; для (INT I = 0; я <numbersAsStrings.length; я ++) {результат + = Double.parseDouble (numbersAsStrings [I]); } Возвращаемый результат; } @Benchmark общественного BigDecimal addUpBigDecimalsFromString () {BigDecimal результат = новый BigDecimal (0); для (INT I = 0; г <numbersAsStrings.length; я ++) {результат = result.add (новые BigDecimal (numbersAsStrings [я])); } Возвращаемый результат; } Так как примитивы обычно имеют репутацию вычисления быстрее, чем не-примитивов результаты поразительны (по крайней мере, для меня): Benchmark Образцы Режим Забей Единицы ошибки tnbnBigDecimalVsDouble.addUpDoublesParsedFromString thrpt 4 484,070 59,905 OPS / s tnbnBigDecimalVsDouble.addUpBigDecimalsFromString thrpt 4 1024.567 170.329 OPS / с Это 1024.567 OPS / с для добавления BigDecimals но только 484,070 OPS / с для того, используя примитивный (протестированные в JMH). Почему это так? Если есть способ оптимизировать добавление двойных примитивов, выделенных из строк за пределами скорости BigDecimal, пожалуйста, включите это в ответе.
ig-dev