матрица путаницы показывает неверную информацию? - PullRequest
1 голос
/ 13 апреля 2020

обновление: добавлена ​​ссылка на данные, если вы хотите воспроизвести:

https://github.com/amandawang-dev/credit-worthiness-analysis/blob/master/credit_train.csv

https://github.com/amandawang-dev/credit-worthiness-analysis/blob/master/credit_test.csv

Я пытаюсь использовать регрессионную модель sklearn logisti c, чтобы предсказать, является ли кредит человека банковским счетом хорошим или плохим. Исходный набор данных выглядит следующим образом:

credit worthiness data

credit worthiness continued


Затем я преобразовал в двоичную форму первый столбец «Класс» («Хороший» = 1, «Плохой» = 0), и набор данных выглядит следующим образом:

credit worthiness data binarized

Поэтому я использовал sklearn logisti c модель для прогнозирования тестовых данных (тестовые данные совпадают с набором прогнозируемых данных, а столбец «Класс» также преобразуется в двоичную форму), и при попытке вычислить матрицу путаницы, коды, как показано ниже, затем полученная мной матрица путаницы * Оценка точности 1033 *

[[  0  54]
 [  0 138]]

равна 0,71875, я думаю, что результат матрицы путаницы неверен, потому что нет истинного положительного значения. У кого-нибудь есть идеи, как это исправить? Спасибо!

from sklearn.linear_model import LogisticRegression
import numpy as np
import pandas as pd

credit_train = pd.read_csv('credit_train.csv')
credit_test = pd.read_csv('credit_test.csv')
credit_train["Class"] = (credit_train["Class"] =="Good").astype(int)
credit_test["Class"] = (credit_test["Class"] =="Good").astype(int)
X=credit_train[['CreditHistory.Critical']]
y=credit_train['Class']
clf = LogisticRegression(random_state=0).fit(X, y)

X_test=credit_test[['CreditHistory.Critical']]
y_test=credit_test['Class']
y_pred=clf.predict(X_test)

from sklearn.metrics import confusion_matrix

cm=confusion_matrix(y_pred=y_pred, y_true=y_test)
score = clf.score(X_test, y_test)
print(score)
print(cm)

типы данных каждого столбца:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 808 entries, 0 to 807
Data columns (total 17 columns):
Class                             808 non-null int64
Duration                          808 non-null int64
Amount                            808 non-null int64
InstallmentRatePercentage         808 non-null int64
ResidenceDuration                 808 non-null int64
Age                               808 non-null int64
NumberExistingCredits             808 non-null int64
NumberPeopleMaintenance           808 non-null int64
Telephone                         808 non-null int64
ForeignWorker                     808 non-null int64
CheckingAccountStatus.lt.0        808 non-null int64
CheckingAccountStatus.0.to.200    808 non-null int64
CheckingAccountStatus.gt.200      808 non-null int64
CreditHistory.ThisBank.AllPaid    808 non-null int64
CreditHistory.PaidDuly            808 non-null int64
CreditHistory.Delay               808 non-null int64
CreditHistory.Critical            808 non-null int64
dtypes: int64(17)
memory usage: 107.4 KB

1 Ответ

1 голос
/ 14 апреля 2020

Начнем с того, что ваши классы слегка дисбалансированы, примерно 71% составляет 1:

credit_test["Class"].value_counts()

1    138
0     54

Когда вы выполняете регрессию logisti c, она оценивает среднее значение, которое является логарифмическим коэффициентом, равным 1, а затем лог-шансы, связанные с вашей зависимой переменной. Если вы посмотрите на коэффициенты:

[clf.intercept_,clf.coef_]
[array([0.59140229]), array([[0.9820343]])]

Перехват кажется правильным, то есть среднее значение составляет около exp (0,59140229) / (1 + exp (0,59140229)) = 0,643. Ваша независимая переменная CreditHistory.Critical может быть только 0 или 1, и ваш коэффициент для этого 0,9820343, результат всегда будет p> 0,5, что означает все метки 1.

Вы можете соответствовать модели без перехват, и видите, что прогноз не смещен, но в основном он не очень точен:

clf = LogisticRegression(random_state=0,fit_intercept=False).fit(X, y)
y_pred=clf.predict(credit_test[['CreditHistory.Critical']])
confusion_matrix(y_pred=y_pred, y_true=y_test)

array([[42, 12],
       [84, 54]])

Вы можете попробовать согласовать модель с несколькими другими переменными, чтобы получить информацию, она должна дать вам лучшие результаты.

...