使用混淆矩阵遇TypeError报错,求问题排查与解决方法
混淆矩阵报错问题
报错信息
TypeError: loop of ufunc does not support argument 0 of type float which has no callable exp method
已做排查
已确认所有库均正确导入,且已将虚拟变量转换为float类型,但问题仍未解决。
使用的库及代码
导入库代码
import pandas as pd import numpy as np # 数据拆分库 from sklearn.model_selection import train_test_split # 数据可视化库 import matplotlib.pyplot as plt import seaborn as sns # 取消显示列数限制 pd.set_option("display.max_columns", None) # 构建逻辑回归模型相关库 import statsmodels.stats.api as sms from statsmodels.stats.outliers_influence import variance_inflation_factor import statsmodels.api as sm from statsmodels.tools.tools import add_constant from sklearn.linear_model import LogisticRegression # 评估指标相关库 from sklearn.metrics import ( f1_score, accuracy_score, recall_score, precision_score, confusion_matrix, roc_auc_score, precision_recall_curve, roc_curve, make_scorer ) # 决策树分类器相关库 from sklearn.tree import DecisionTreeClassifier from sklearn import tree # 模型调优相关库 from sklearn.model_selection import GridSearchCV from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay from sklearn.datasets import make_classification from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay from sklearn.model_selection import train_test_split
模型性能评估函数
def model_performance_classification_statsmodels( model, predictors, target, threshold=0.5 ): """ 计算分类模型各项性能指标的函数 model: 分类器 predictors: 自变量 target: 因变量 threshold: 将样本分类为1类的阈值 """ # 判断预测概率是否大于阈值 pred_temp = model.predict(predictors) > threshold # 四舍五入得到分类结果 pred = np.round(pred_temp) acc = accuracy_score(target, pred) # 计算准确率 recall = recall_score(target, pred) # 计算召回率 precision = precision_score(target, pred) # 计算精确率 f1 = f1_score(target, pred) # 计算F1分数 # 构建指标结果DataFrame df_perf = pd.DataFrame( {"Accuracy": acc, "Recall": recall, "Precision": precision, "F1": f1,}, index=[0], ) return df_perf
混淆矩阵绘制函数
def confusion_matrix_statsmodels(model, predictors, target, threshold=0.5): """ 绘制带百分比的混淆矩阵 model: 分类器 predictors: 自变量 target: 因变量 threshold: 将样本分类为1类的阈值 """ y_pred = model.predict(predictors) > threshold cm = confusion_matrix(target, y_pred) labels = np.asarray( [ ["{0:0.0f}".format(item) + "\n{0:.2%}".format(item / cm.flatten().sum())] for item in cm.flatten() ] ).reshape(2, 2) plt.figure(figsize=(6, 4)) sns.heatmap(cm, annot=labels, fmt="") plt.ylabel("真实标签") plt.xlabel("预测标签")
内容的提问来源于stack exchange,提问作者Catryna Rodriguez
相关产品推荐
相关产品推荐

