В Python я пытаюсь решить проблему линейной оптимизации с помощью пакета пульпы.
Я имею n непрерывных показателей и дихотомическая цель. Мне нужно выбрать подмножество индикаторов M и порог для каждого индикатора, чтобы, если по крайней мере, индикаторы P выше их порога, запись классифицируется как 1.
Проблема оптимизации должна определить эти переменные: < /p>
Число M переменной подмножества < /li>
Число P минимального индикатора, которого можно нарушить < /li>
Порог для каждой переменной < /li>
< /ul>
Окончательная область - неправильно классифицировать как 1 не более 10 0s цели, максимизируя классификацию 1s < /p>
В дальнейшем мой пример кода… Я не понимаю, почему он настраивает очень высокие пороговые значения, и никакие записи не классифицируются как 1. < /p>
import pandas as pd
import numpy as np
from imblearn.over_sampling import SMOTE
from pulp import LpMaximize, LpProblem, LpVariable, lpSum, value
# Sample data
np.random.seed(42)
data = pd.DataFrame(np.random.rand(1000, 10), columns=[f'X{i}' for i in range(10)]) # 10 continuous indicators
data['target'] = np.random.choice([0, 1], size=1000, p=[0.7, 0.3]) # Binary target (30% ones)
# Parameters
M = 5 # Number of selected indicators
S = 3 # Minimum number of indicators above threshold to classify as 1
max_false_positives = 100 # Maximum allowed misclassified 0s
# Define model
model = LpProblem("Indicator_Selection", LpMaximize)
# Decision variables
X = {i: LpVariable(f'X_{i}', cat='Binary') for i in range(data.shape[1] - 1)} # Indicator selection
T = {i: LpVariable(f'T_{i}', lowBound=-100, upBound=100, cat='Continuous') for i in range(data.shape[1] - 1)} # Thresholds
Y = {j: LpVariable(f'Y_{j}', cat='Binary') for j in range(len(data))} # Predicted labels
# Auxiliary binary variables to represent whether each indicator exceeds its threshold
Z = {(j, i): LpVariable(f'Z_{j}_{i}', cat='Binary') for j in range(len(data)) for i in X}
# Constraint: Select exactly M indicators
model += lpSum(X for i in X) = T, 0 otherwise)
M_large = 1 # Upper bound for continuous values
for j in range(len(data)):
for i in X:
model += Z[j, i] >= (data.iloc[j, i] - T) / M_large
model += Z[j, i]
Подробнее здесь: https://stackoverflow.com/questions/794 ... -with-pulp
Максимизация классификации Corretc с помощью пульпы ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение