求助:如何用Sklearn Python获取模型预测目标值的出现占比?
问题分析与解决
问题描述
以train_1、train_2、train_3、train_4为特征,result_cor为目标变量训练机器学习模型,需要统计预测结果中值为1或2的出现占比,但现有代码运行后准确率始终为100.0%或0.0%,无法获取目标占比数据。
代码问题诊断
- 训练数据误用:模型训练时直接使用了完整数据集
x和y,而非拆分后的训练集treino_x和treino_y,导致模型提前学习了所有数据信息,后续单一样本预测的准确率失去参考意义。 - 无效验证逻辑:手动修改训练集的首个样本并将其作为预测输入,同时把修改后的标签作为真实值计算准确率,这是在验证自定义的虚构数据,无法反映模型的实际性能。
- 缺失目标统计逻辑:代码中没有针对测试集的预测结果,统计1和2出现占比的相关逻辑。
修正后的代码
from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import train_test_split import pandas as pd import numpy as np sheet_id = '1CfnVwuqysTYNPKLVhgjJ44Af8VDcdN1l' dados = pd.read_excel(f'https://docs.google.com/spreadsheets/export?id={sheet_id}&format=xlsx') # 提取特征与目标变量 x = dados[['train_1','train_2','train_3','train_4']] y = dados['result_cor'] # 转为Series格式更适配sklearn接口 # 拆分训练集与测试集(random_state保证结果可复现) treino_x, teste_x, treino_y, teste_y = train_test_split(x, y, test_size=0.33, random_state=42) # 初始化并训练模型 modelo = DecisionTreeClassifier() modelo.fit(treino_x, treino_y) # 对测试集进行预测 previsoes = modelo.predict(teste_x) # 统计预测结果中1和2的占比 total_pred = len(previsoes) count_1 = np.sum(previsoes == 1) count_2 = np.sum(previsoes == 2) ratio_1 = (count_1 / total_pred) * 100 ratio_2 = (count_2 / total_pred) * 100 print(f"预测结果中值为1的占比: {round(ratio_1, 2)}%") print(f"预测结果中值为2的占比: {round(ratio_2, 2)}%")
关键说明
- 使用拆分后的训练集训练模型,测试集用于验证模型泛化能力,避免数据泄露。
- 通过
np.sum(previsoes == 目标值)统计对应数值的出现次数,再除以总预测数得到占比。 - 若需要查看模型完整分类性能,可添加
from sklearn.metrics import classification_report,然后执行print(classification_report(teste_y, previsoes))输出详细指标。
内容的提问来源于stack exchange,提问作者Cleber Souza
相关产品推荐
相关产品推荐

