Логистическая регрессия не перебирает комбинации функций в кадре данных, чтобы найти лучшую комбинацию.Python

Программы на Python
Ответить
Anonymous
 Логистическая регрессия не перебирает комбинации функций в кадре данных, чтобы найти лучшую комбинацию.

Сообщение Anonymous »

Я написал функцию для поиска наилучшего сочетания заданных функций фрейма данных, оценки f1 и оценки AUC, используя LogisticReгрессию. Проблема в том, что когда я пытаюсь передать список комбинаций фреймов данных, используя комбинации itertools, LogisticReгрессия не распознает каждую комбинацию как собственную переменную X/кадр данных.
Я начинаю с кадр данных из 10 столбцов функций и 10 тыс. строк. Когда я запускаю приведенный ниже код, я получаю ошибку ValueError: X имеет 10 функций, но LogisticReгрессия ожидает на входе 1 функцию.

Код: Выделить всё

def find_best_combination(X, y):
#initialize variables
best_f1 = 0
best_auc = 0
best_variables = []

# get all possible combinations of variables
for i in range(1, X.shape[1]):
for combination in combinations(X.columns, i):
X_subset = X[list(combination)]
logreg = LogisticRegression()
logreg.fit(X_subset, y)
y_pred = logreg.predict(X_subset)

f1 = f1_score(y, y_pred)
auc = roc_auc_score(y, logreg.predict_proba(X)[:,1])
# evaluate performance on current combination of variables
if f1> best_f1 and auc > best_auc:
best_f1 = f1
best_auc = auc
best_variables = combination
return best_variables, best_f1, best_auc
и ошибка

Код: Выделить всё

C:\Users\katurner\Anaconda3\lib\site-packages\sklearn\base.py:493: FutureWarning: The feature names should match those that were passed during fit. Starting version 1.2, an error will be raised.
Feature names unseen at fit time:
- IBE1273_01_11.0
- IBE1273_01_6.0
- IBE7808
- IBE8439_2.0
- IBE8557_7.0
- ...

warnings.warn(message, FutureWarning)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
~\AppData\Local\Temp\2\ipykernel_15932\895415673.py in 
----> 1 best_combo = ml.find_best_combination(X,lg_y)
2 best_combo

~\Documents\Arcadia\modeling_library.py in find_best_combination(X, y)
176             # print(y_test)
177             f1 = f1_score(y, y_pred)
--> 178             auc = roc_auc_score(y, logreg.predict_proba(X)[:,1])
179             # evaluate performance on current combination of variables
180             if f1> best_f1 and auc > best_auc:

~\Anaconda3\lib\site-packages\sklearn\linear_model\_logistic.py in predict_proba(self, X)
1309         )
1310         if ovr:
-> 1311             return super()._predict_proba_lr(X)
1312         else:
1313             decision = self.decision_function(X)

~\Anaconda3\lib\site-packages\sklearn\linear_model\_base.py in _predict_proba_lr(self, X)
459         multiclass is handled by normalizing that over all classes.
460         """
--> 461         prob = self.decision_function(X)
462         expit(prob, out=prob)
463         if prob.ndim == 1:

~\Anaconda3\lib\site-packages\sklearn\linear_model\_base.py in decision_function(self, X)
427         check_is_fitted(self)
428
--> 429         X = self._validate_data(X, accept_sparse="csr", reset=False)
430         scores = safe_sparse_dot(X, self.coef_.T, dense_output=True) + self.intercept_
431         return scores.ravel() if scores.shape[1] == 1 else scores

~\Anaconda3\lib\site-packages\sklearn\base.py in _validate_data(self, X, y, reset, validate_separately, **check_params)
598
599         if not no_val_X and check_params.get("ensure_2d", True):
--> 600             self._check_n_features(X, reset=reset)
601
602         return out

~\Anaconda3\lib\site-packages\sklearn\base.py in _check_n_features(self, X, reset)
398
399         if n_features != self.n_features_in_:
--> 400             raise ValueError(
401                 f"X has {n_features} features, but {self.__class__.__name__} "
402                 f"is expecting {self.n_features_in_} features as input."

ValueError: X has 10 features, but LogisticRegression is expecting 1 features as input.
Я ожидаю, что функция вернет комбинацию best_variables и связанных с ними best_f1, best_auc.
Я также пробовал запустить функцию, используя тренируйся, тестируй, разделяй. Когда я добавляю поезд, тест, разделение в приведенный ниже код, функция запускается, но возвращает «[], 0, 0» для best_variables, best_f1, best_auc.

Код: Выделить всё

def find_best_combination(X, y):
#initialize variables
best_f1 = 0
best_auc = 0
best_variables = []
# get all possible combinations of variables
for i in range(1, X.shape[1]):
for combination in combinations(X.columns, i):
X_subset = X[list(combination)]
X_train, X_test, y_train, y_test = train_test_split(X_subset, y, test_size=0.2, stratify=y, random_state=73)
logreg = LogisticRegression()
logreg.fit(X_train, y_train)
y_pred = logreg.predict(X_test)
f1 = f1_score(y_test, y_pred)
auc = roc_auc_score(y_test, logreg.predict_proba(X_test)[:,1])
# evaluate performance on current combination of variables
if f1> best_f1 and auc > best_auc:
best_f1 = f1
best_auc = auc
best_variables = combination
return best_variables, best_f1, best_auc
Я не уверен, что происходит под капотом обучения, тестирования и разделения, что позволяет функции выполнять итерацию, а не выдавать ошибки, как раньше.

Подробнее здесь: https://stackoverflow.com/questions/751 ... -dataframe
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»