Можно ли запустить модель логита только с единицами и без нулей? - PullRequest
0 голосов
/ 07 апреля 2019

Для моей диссертации я пытаюсь построить модель, которая правильно предсказывает модели из моей выборки с помощью модели logit. Во-первых, я столкнулся с проблемой, что у python нет модели logit, а есть только модель логистики. Но с этой логистической моделью я получаю ошибку в коде ниже [logreg.fit(X_train,y_train)].
Моя ошибка заключается в следующем: этому Солверу нужны образцы как минимум 2 классов в данных. Ну, мои данные состоят только из единиц и не содержат нулей. Так что эта ошибка верна, в том смысле, что так и должно быть. Есть ли способ обойти эту ошибку, чтобы я мог продолжить анализ, не ища все виды данных, чтобы также получить нули, что будет слишком много времени из-за сложности моей базы данных.

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

feature_cols =['RSIZE','EXRETAVG','NIMTAAVG','TLMTA','CASHMTA','SIGMA','PRICE','MB']
X = df[feature_cols]
y = df.Bankrupt
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=0)
logreg = LogisticRegression()
logreg.fit(X_train,y_train)
y_pred=logreg.predict(X_test)



cnf_matrix = metrics.confusion_matrix(y_test, y_pred)
print(cnf_matrix)
class_names=[0,1] # name  of classes
fig, ax = plt.subplots()
tick_marks = np.arange(len(class_names))
plt.xticks(tick_marks, class_names)
plt.yticks(tick_marks, class_names)
sns.heatmap(pd.DataFrame(cnf_matrix), annot=True, cmap="YlGnBu" ,fmt='g')
ax.xaxis.set_label_position("top")
plt.tight_layout()
plt.title('Confusion matrix', y=1.1)
plt.ylabel('Actual label')
plt.xlabel('Predicted label')
print("Accuracy:",metrics.accuracy_score(y_test, y_pred))
print("Precision:",metrics.precision_score(y_test, y_pred))
print("Recall:",metrics.recall_score(y_test, y_pred))
y_pred_proba = logreg.predict_proba(X_test)[::,1]
fpr, tpr, _ = metrics.roc_curve(y_test,  y_pred_proba)
auc = metrics.roc_auc_score(y_test, y_pred_proba)
plt.plot(fpr,tpr,label="data 1, auc="+str(auc))
plt.legend(loc=4)
plt.show()

1 Ответ

0 голосов
/ 07 апреля 2019

Короткий ответ таков: вам всегда нужно более одного класса .

Что делает любая модель, так это пытается определить, как каждая переменная (функция, ваш X) влияет на результатзависимая переменная (Y, ваши категории).Теперь, если у вас есть только одна категория в вашей зависимой переменной, то независимо от того, какое значение и комбинация значений будут у ваших X, у вас всегда будет один и тот же результат.
Это означает, что если вы тренируете свою модель только в одном классе (вашиз них), при тестировании он всегда будет возвращать 1 (и вам, в принципе, не нужно ничего тренировать и тестировать).

Примером игрушки может быть: Y, если наблюдение не выполнено в течение года.X чистая вероятность дефолта, рассчитанная по некоторой модели.

Позвольте тогда сказать, что вы были бы счастливы, если бы ваша модель прогнозировала Y=1 (по умолчанию в течение одного года), если X>0.5.
Затем вы отбираете только те случаи, где Y=1, и обучаетемодель.Вы получите простую плоскую линию (Y=1) независимо от того, какое значение примет X.
Это означает, что при тестировании вашей модели, независимо от того, какое значение будет иметь X и каков реальный результат вашей зависимостипеременная, вы всегда будете оценивать Y=1.

...