如何在Python多分类场景下获取模型预测结果的概率及解决Random Forest分类器相关报错
嘿,我来帮你搞定这个问题,咱们一步步拆解:
核心需求:获取单个预测结果的百分比概率
首先你用predict_proba的方式完全错了——它要接收的是特征数据(和predict的输入格式完全一致),而不是predict输出的类别结果。下面是实现你需求的正确代码:
# 你的单样本特征输入 sample_features = [[22,8,50,9,20,47,50,38,0,0,0]] # 1. 获取模型预测的疾病类别 predicted_disease = pickle_model.predict(sample_features)[0] # 取[0]是因为输入是单样本,返回的是数组 # 2. 获取所有疾病类别的预测概率 all_probs = pickle_model.predict_proba(sample_features)[0] # 同样取[0]对应单样本的概率数组 # 3. 把类别和概率对应起来,转成百分比 class_names = pickle_model.classes_ # 模型训练时的所有类别名称 disease_prob_map = dict(zip(class_names, all_probs)) predicted_prob_percent = disease_prob_map[predicted_disease] * 100 # 输出你想要的格式 print(f"{predicted_disease}疾病的预测概率为{predicted_prob_percent:.1f}%")
这样就能直接得到类似Allergy疾病的预测概率为90%的输出了。
解决你遇到的两个报错问题
咱们来逐个看你代码里的错误原因:
错误1:accuracy_score的样本数不一致
你定义的actual是特征数组(np.array((22,8,50,9,20,47,50,38,0,0,0)),长度11),而p是模型输出的疾病类别标签(长度1)——这俩完全不是同一类数据!
accuracy_score需要的是真实的疾病类别标签和预测的疾病类别标签,比如如果这个样本的真实疾病是Allergy,你应该把actual定义为np.array(["Allergy"]),而不是特征值。
错误2:混淆矩阵的多分类目标错误
同样的问题:你传给confusion_matrix的actual是特征数组(不是真实类别),predict是预测类别,sklearn根本搞不清这俩的目标类型,所以报错“multiclass and unknown targets”。
另外补充一点:tn, fp, fn, tp = ...ravel()只适用于二分类问题,你的疾病预测是多分类(多个疾病类别),这种拆分方式完全不适用,别再这么用啦。
完整的模型评估示例(如果需要)
如果你要做模型整体评估,假设你有测试集的特征和真实类别,正确的代码应该是这样:
from sklearn.metrics import accuracy_score # 假设你有测试集数据(特征+真实疾病标签) X_test = [ [22,8,50,9,20,47,50,38,0,0,0], [18, 6, 45, 7, 15, 40, 45, 35, 1, 0, 0] # 另一个样本的特征 ] y_test = ["Allergy", "Cold"] # 对应样本的真实疾病 # 获取所有测试样本的预测结果和概率 y_pred = pickle_model.predict(X_test) y_pred_probs = pickle_model.predict_proba(X_test) # 计算模型准确率(这时候y_test和y_pred都是类别标签,维度一致) print(f"模型整体准确率:{accuracy_score(y_test, y_pred):.2f}") # 逐个输出每个样本的预测详情 for idx, (true_disease, pred_disease, probs) in enumerate(zip(y_test, y_pred, y_pred_probs)): # 找到预测类别的概率并转百分比 pred_prob = probs[list(class_names).index(pred_disease)] * 100 print(f"\n样本{idx+1}:") print(f"真实疾病:{true_disease}") print(f"预测疾病:{pred_disease},预测概率:{pred_prob:.1f}%")
内容的提问来源于stack exchange,提问作者user15874399
相关产品推荐
相关产品推荐

