Обратное предсказание верно в Scikit Learn Logistic Legression - PullRequest
1 голос
/ 05 апреля 2019

В следующем минимальном воспроизводимом наборе данных я разделил набор данных на обучающий и тестовый наборы данных, поместил логистическую регрессию в обучающий набор данных с помощью scikit learn и прогнозировал y на основе x_test.

Однако прогнозы y_pred или y верны, только если обратное вычисление (например, 0 = 1 и 1 = 0) рассчитывается следующим образом: 1 - y_pred. Почему это так? Я не могу понять, имеет ли это отношение к масштабированию x (я пробовал с StandardScaler и без него), что-то, связанное с логистической регрессией или вычислением оценки точности.

В моем большом наборе данных это также имеет место даже при использовании различных семян в качестве случайного состояния. Я также попробовал эту логистическую регрессию с тем же результатом.

EDIT как указано @Nester, он работает без стандартного масштабатора для этого минимального набора данных. Доступен больший набор данных здесь , standardScaler ничего не делает с этим большим набором данных, я сохраню меньший набор данных OP, так как это может помочь в объяснении проблемы.

# imports
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import StandardScaler

# small dataset
Y = [1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0]
X =[[0.38373581],[0.56824121],[0.39078066],[0.41532221],[0.3996311 ]
    ,[0.3455455 ],[0.55867358],[0.51977073],[0.51937625],[0.48718916]
    ,[0.37019272],[0.49478954],[0.37277804],[0.6108499 ],[0.39718093]
    ,[0.33776591],[0.36384773],[0.50663667],[0.3247984 ]]


x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.15, random_state=42, stratify=Y)
clf = make_pipeline(StandardScaler(), LogisticRegression())
clf.fit(x_train, y_train)
y_pred = clf.predict(x_test)

y_pred = 1 - y_pred #          <- why?

accuracy_score(y_test,y_pred)
1.0

Большая точность набора данных:

accuracy_score(y_test,y_pred)
0.7  # if inversed

спасибо за чтение

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

X и Y вообще не имеют никакого отношения. Следовательно, модель работает плохо. Есть основания говорить, что 1-pred работает лучше. Если у вас более двух классов, то ситуация будет еще хуже.

%matplotlib inline 
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.15,  stratify=Y)
clf = make_pipeline(StandardScaler(), LogisticRegression())
clf.fit(x_train, y_train)
import matplotlib.pyplot as plt
plt.scatter(clf.named_steps['standardscaler'].transform(x_train),y_train)
plt.scatter(clf.named_steps['standardscaler'].transform(x_test),y_test)
print(clf.score(x_test,y_test))

enter image description here

Отношения такие же для вашего большего набора данных.

enter image description here

Попробуйте определить другие особенности, которые могут помочь вам в прогнозировании Y.

1 голос
/ 05 апреля 2019

Вы пытались запустить модель без StandardScaler ()? Ваши данные выглядят так, будто их не нужно масштабировать.

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