Рекурсивный выбор функций может не дать более высокую производительность? - PullRequest
1 голос
/ 26 апреля 2020

Я пытаюсь проанализировать приведенные ниже данные, сначала смоделировав их с помощью логистической регрессии c, а затем сделал прогноз, рассчитал точность & auc; затем выполнил рекурсивный выбор объектов и снова вычислил точность & au c, подумал, что точность и au c будут выше, но на самом деле они оба ниже после выбора рекурсивных функций, не уверен, ожидается ли это? Или я что-то пропустил? Спасибо!

Данные: https://github.com/amandawang-dev/census-training/blob/master/census-training.csv

census-training


для логистики c регрессия, Точность: 0,8111649491571692; AU C: 0,824896256487386

после выбора рекурсивной функции, точность: 0,8130075752405651; AU C: 0,7997315631730443

import pandas as pd
import numpy as np
from sklearn import preprocessing, metrics
from sklearn.model_selection import train_test_split


train=pd.read_csv('census-training.csv')
train = train.replace('?', np.nan)
for column in train.columns:
    train[column].fillna(train[column].mode()[0], inplace=True)
x['Income'] = x['Income'].str.contains('>50K').astype(int)
x['Gender'] = x['Gender'].str.contains('Male').astype(int)

obj = train.select_dtypes(include=['object']) #all features that are 'object' datatypes
le = preprocessing.LabelEncoder()
for i in range(len(obj.columns)):
    train[obj.columns[i]] = le.fit_transform(train[obj.columns[i]])#TODO  #Encode input data

train_set, test_set = train_test_split(train, test_size=0.3, random_state=42)

from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix, classification_report, roc_curve, roc_auc_score
from sklearn.metrics import accuracy_score


log_rgr = LogisticRegression(random_state=0)


X_train=train_set.iloc[:, 0:9]
y_train=train_set.iloc[:, 9:10]


X_test=test_set.iloc[:, 0:9]
y_test=test_set.iloc[:, 9:10]

log_rgr.fit(X_train, y_train)

y_pred = log_rgr.predict(X_test)

lr_acc = accuracy_score(y_test, y_pred)

probs = log_rgr.predict_proba(X_test)
preds = probs[:,1]
print(preds)
from sklearn.preprocessing import label_binarize
y = label_binarize(y_test, classes=[0, 1]) #note to myself: class need to have only 0,1
fpr, tpr, threshold = metrics.roc_curve(y, preds)

roc_auc = roc_auc_score(y_test, preds)

print("Accuracy: {}".format(lr_acc))
print("AUC: {}".format(roc_auc))

from sklearn.feature_selection import RFE


rfe = RFE(log_rgr, 5)
fit = rfe.fit(X_train, y_train)

X_train_new = fit.transform(X_train)
X_test_new = fit.transform(X_test)

log_rgr.fit(X_train_new, y_train)
y_pred = log_rgr.predict(X_test_new)

lr_acc = accuracy_score(y_test, y_pred)

probs = rfe.predict_proba(X_test)
preds = probs[:,1]
y = label_binarize(y_test, classes=[0, 1]) 

fpr, tpr, threshold = metrics.roc_curve(y, preds)
roc_auc =roc_auc_score(y_test, preds)

print("Accuracy: {}".format(lr_acc))
print("AUC: {}".format(roc_auc))

1 Ответ

3 голосов
/ 26 апреля 2020

Просто нет гарантии , что любой тип выбора функции (назад, вперед, рекурсивно - назовите его) на самом деле приведет к повышению производительности в целом. Вовсе нет. Такие инструменты существуют только для удобства - они могут работать, а могут и нет. Лучший гид и конечный судья - это всегда эксперимент.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...