混淆矩阵显示错误信息?

更新:附上数据链接,以防你想重现:

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的逻辑回归模型来预测一个银行账户的信用是好还是坏。初始数据集如下所示:

credit worthiness data

credit worthiness continued


然后我将第一列“Class”二值化(’Good’=1, ‘Bad’=0),数据集如下所示:

credit worthiness data binarized

所以我使用sklearn逻辑模型来预测测试数据(测试数据与预测数据集相同,且“Class”列也进行了二值化),并尝试计算混淆矩阵,代码如下,然后我得到的混淆矩阵是

[[  0  54] [  0 138]]

准确率得分为0.71875,我认为混淆矩阵结果是错误的,因为没有真正的正值。有人有任何想法如何解决这个问题吗?谢谢!

from sklearn.linear_model import LogisticRegressionimport numpy as npimport pandas as pdcredit_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_matrixcm=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 807Data columns (total 17 columns):Class                             808 non-null int64Duration                          808 non-null int64Amount                            808 non-null int64InstallmentRatePercentage         808 non-null int64ResidenceDuration                 808 non-null int64Age                               808 non-null int64NumberExistingCredits             808 non-null int64NumberPeopleMaintenance           808 non-null int64Telephone                         808 non-null int64ForeignWorker                     808 non-null int64CheckingAccountStatus.lt.0        808 non-null int64CheckingAccountStatus.0.to.200    808 non-null int64CheckingAccountStatus.gt.200      808 non-null int64CreditHistory.ThisBank.AllPaid    808 non-null int64CreditHistory.PaidDuly            808 non-null int64CreditHistory.Delay               808 non-null int64CreditHistory.Critical            808 non-null int64dtypes: int64(17)memory usage: 107.4 KB

回答:

首先,你的类别略有不平衡,大约71%是1:

credit_test["Class"].value_counts()1    1380     54

当你运行逻辑回归时,它会估计均值,即为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]])

你可以尝试使用其他几个变量来拟合模型以获取信息,这应该会给你更好的结果。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注