如何筛选预测概率超80%的行并计算clf.predict的np.mean
解决思路与修正代码
嗨,咱们一步步来搞定这个问题。首先得指出你现有代码里的一个关键bug:clf.predict_proba返回的是0到1之间的概率值(不是百分比),所以原代码里用proba[0][0] < 80来判断完全不对——所有概率都会满足这个条件,导致错误删除几乎所有样本。你应该把阈值改成0.8(对应80%)才对。
接下来,在正确筛选出「至少有一项预测概率≥80%」的样本后,计算clf.predict结果的均值就很简单了,分两步:对筛选后的样本做预测,再用numpy计算均值。
下面是修正并补充完整的代码:
import numpy as np from sklearn.tree import DecisionTreeClassifier clf = DecisionTreeClassifier(random_state=1) clf.fit(X, Y) dropIndexes = [] for i in range(len(X)): proba = clf.predict_proba([X.values[i]]) # 修正:用0.8(即80%)作为阈值,判断两个概率是否都低于80% if (proba[0][0] < 0.8 and proba[0][1] < 0.8): dropIndexes.append(i) # 删除所有预测值均低于80%的行(建议用inplace=False,避免修改原始数据集) X_filtered = X.drop(dropIndexes, inplace=False) Y_filtered = Y.drop(dropIndexes, inplace=False) # 对筛选后的样本进行预测 predictions = clf.predict(X_filtered) # 计算预测结果的均值 mean_prediction = np.mean(predictions) print(f"筛选后预测结果的均值为: {mean_prediction}")
额外优化建议
如果你的样本量很大,手动循环遍历每个样本效率会很低,推荐用向量化操作替代循环,代码更简洁高效:
import numpy as np from sklearn.tree import DecisionTreeClassifier clf = DecisionTreeClassifier(random_state=1) clf.fit(X, Y) # 一次性获取所有样本的预测概率 all_probas = clf.predict_proba(X) # 生成筛选掩码:至少有一个概率≥0.8的样本标记为True keep_mask = (all_probas >= 0.8).any(axis=1) # 筛选样本 X_filtered = X[keep_mask] Y_filtered = Y[keep_mask] # 计算预测结果均值 predictions = clf.predict(X_filtered) mean_prediction = np.mean(predictions) print(f"筛选后预测结果的均值为: {mean_prediction}")
内容的提问来源于stack exchange,提问作者Miraslav
相关产品推荐
相关产品推荐

