m0_65734590 2024-05-20 19:16 采纳率: 75%
浏览 1
已结题

随机森林调优时精确率为空值

机器学习中,使用随机森林建模,并调优,没有报错,但是为什么精确率和f1值计算为空值

img

img

img

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-20 19:16
    关注

    引自免费微信小程序:皆我百晓生

    在您提供的代码中,看起来您正在使用随机森林进行分类任务,并且尝试对模型进行调优。从您给出的结果来看,测试集的精度(Precision)和召回率(Recall)显示为 NaN,这通常意味着在某些类别中没有预测正确的样本,导致分母为零。

    解决这个问题的方法包括:

    1. 检查数据分布:确保您的数据集中每个类别的样本都有足够的数量,特别是对于少数类。如果某个类别的样本数量过少,可能会导致上述问题。
    2. 调整模型参数:尝试调整模型的超参数,比如减少树的数量(n_estimators),增大最小分裂样本数(min_samples_split),增大最小叶子节点样本数(min_samples_leaf)等,这样可能会使得模型更保守,从而避免过拟合,提高泛化能力。
    3. 使用其他评估方法:当类别不平衡时,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技术来改善模型性能。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 5月28日
  • 已采纳回答 5月20日
  • 创建了问题 5月20日

悬赏问题

  • ¥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/规格书