机器学习中,使用随机森林建模,并调优,没有报错,但是为什么精确率和f1值计算为空值
4条回答 默认 最新
关注 引自免费微信小程序:皆我百晓生
在您提供的代码中,看起来您正在使用随机森林进行分类任务,并且尝试对模型进行调优。从您给出的结果来看,测试集的精度(Precision)和召回率(Recall)显示为
NaN
,这通常意味着在某些类别中没有预测正确的样本,导致分母为零。解决这个问题的方法包括:
- 检查数据分布:确保您的数据集中每个类别的样本都有足够的数量,特别是对于少数类。如果某个类别的样本数量过少,可能会导致上述问题。
- 调整模型参数:尝试调整模型的超参数,比如减少树的数量(n_estimators),增大最小分裂样本数(min_samples_split),增大最小叶子节点样本数(min_samples_leaf)等,这样可能会使得模型更保守,从而避免过拟合,提高泛化能力。
- 使用其他评估方法:当类别不平衡时,F1分数可能不是一个很好的评价指标。可以考虑使用其他的评估方式,如AUC-ROC(曲线下面积)或平均精确率(Average Precision)。
根据您提供的信息,让我们首先检查数据分布,然后尝试调整模型参数并重新评估。
为了演示如何执行这些步骤,这里是一个完整的代码示例:
import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.datasets import fetch_20newsgroups from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import GridSearchCV # 加载一个示例数据集 twenty_train = fetch_20newsgroups(subset='train', remove=('headers', 'footers', 'quotes')) twenty_test = fetch_20newsgroups(subset='test', remove=('headers', 'footers', 'quotes')) # 文本特征提取 vectorizer = TfidfVectorizer() x_train = vectorizer.fit_transform(twenty_train.data) x_test = vectorizer.transform(twenty_test.data) y_train = twenty_train.target y_test = twenty_test.target # 划分训练集和验证集 x_train_tfidf, x_val_tfidf, y_train, y_val = train_test_split(x_train, y_train, test_size=0.2, random_state=1) # 定义参数网格 param_grid = { 'n_estimators': list(range(10, 400, 5)), 'max_depth': list(range(1, 400, 5)), 'max_leaf_nodes': list(range(1, 400, 5)), 'min_samples_split': list(range(2, 200, 5)), 'min_samples_leaf': list(range(1, 100, 5)) } # 使用GridSearchCV进行参数优化 grid_search = GridSearchCV(RandomForestClassifier(random_state=1), param_grid, cv=5, scoring='accuracy') grid_search.fit(x_train_tfidf, y_train) # 获取最佳参数 best_params = grid_search.best_params_ print("最优参数:", best_params) # 使用最佳参数构建新的随机森林模型 best_rfc = RandomForestClassifier(**best_params, random_state=1) best_rfc.fit(x_train_tfidf, y_train) # 训练集评估 y_pred_train = best_rfc.predict(x_train_tfidf) print("训练集结果:") print("Accuracy:", accuracy_score(y_train, y_pred_train)) print("Precision:", precision_score(y_train, y_pred_train, average='weighted')) print("Recall:", recall_score(y_train, y_pred_train, average='weighted')) print("F1 Score:", f1_score(y_train, y_pred_train, average='weighted')) print("AUC-ROC:", roc_auc_score(y_train, y_pred_train)) # 验证集评估 y_pred_val = best_rfc.predict(x_val_tfidf) print("\n验证集结果:") print("Accuracy:", accuracy_score(y_val, y_pred_val)) print("Precision:", precision_score(y_val, y_pred_val, average='weighted')) print("Recall:", recall_score(y_val, y_pred_val, average='weighted')) print("F1 Score:", f1_score(y_val, y_pred_val, average='weighted')) print("AUC-ROC:", roc_auc_score(y_val, y_pred_val))
这个例子使用了20Newsgroups数据集,这是一个预处理过的文本分类数据集。您可以将这部分替换为您实际的数据集。通过使用GridSearchCV进行参数搜索,我们能获得一组更好的超参数,然后基于这些参数构建的模型应该能够提供更有意义的评估指标。注意在计算精度和召回率时,我们使用了
average='weighted'
,这意味着结果会根据各个类别的权重进行加权求和,有助于处理类别不平衡的问题。如果您仍然遇到精度和召回率为
NaN
的情况,请检查您的数据是否存在类别分布严重不均衡的问题,或者模型是否过拟合。在这种情况下,您可能需要进一步探索正则化、欠采样、过采样或SMOTE技术来改善模型性能。本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥15 keil5在调用函数时候发生错误
- ¥15 用matlab或python实现多个表格合并单元格
- ¥15 gojs 点击按钮node的position位置进行改变,再次点击回到原来的位置
- ¥15 计算决策面并仿真附上结果
- ¥20 halcon 图像拼接
- ¥15 webstorm上开发的vue3+vite5+typeScript打包时报错
- ¥15 vue使用gojs,需求在link中的虚线上添加方向箭头
- ¥15 CSS通配符清除内外边距为什么可以覆盖默认样式?
- ¥15 SPSS分类模型实训题步骤
- ¥100 求ASMedia ASM1184e & ASM1187e 芯片datasheet/规格书