predict_proba() 只返回0和1的概率,几乎没有中间值

-2 投票
1 回答
66 浏览
提问于 2025-04-14 16:57

我正在做一个乳腺癌检测的分类问题。我从Kaggle上下载了数据集:https://www.kaggle.com/datasets/yasserh/breast-cancer-dataset

我想预测:

a) 肿瘤是良性还是恶性

b) 肿瘤是恶性的概率(0到1之间)。

我正在使用随机森林分类器来实现这个目标。

我遇到的问题是,当我使用 rf_classifier.predict_proba() 方法时,得到的概率值中有很多是1和0,但中间值很少。理想情况下,我希望概率列中的所有值都是0到1之间的小数。

这个方法是否是实现目标的正确方式?如果是的话,怎么解决这个问题呢?

分类器的表现非常好。

这是我代码的相关部分:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
scaler = StandardScaler()

X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

rf_classifier = RandomForestClassifier()
rf_classifier.fit(X_train, y_train)

y_pred = rf_classifier.predict(X_test)

y_pred_proba = rf_classifier.predict_proba(X_test)[:, 1]

results = np.column_stack((y_test[:200], y_pred[:200], y_pred_proba[:200]))
np.set_printoptions(precision=2, suppress=True)
print("Actual | Predicted | Probability")
print(results)

输出:

output

分类报告:

Classification report

1 个回答

1

概率的值在0到1之间,只有当一个叶子节点里同时包含良性和恶性样本时才成立。比如说,如果一个叶子节点里有九个良性样本和一个恶性样本,那么这个样本是恶性的概率就是10%。反过来也是一样。

当你在随机森林中遍历到一个包含混合样本的叶子节点(也就是同时有良性和恶性样本)时,输出的概率会是小数。

不过在你的模型中,大部分叶子节点都是纯的,这样就会得到0和1的预测结果。

撰写回答