抽搐人偶师 2024-03-12 09:54 采纳率: 0%
浏览 7

关于随机森林多分类的问题

最近在学习随机森林做多分类,做的是多类型的设备识别,代码是自己摸索着写的,求帮我看看代码有问题吗?有没有什么错误的地方?

import numpy as np
import os
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, classification_report
import pickle
import pandas as pd
from sklearn.metrics import roc_auc_score, roc_curve
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc


input_directory = "IoT_Labels_Extend"
all_files = sorted(os.listdir(input_directory))
counter = 1
data = None
labels = None

for i, item in enumerate(all_files, start=1):
    print(f"{i}: {item[:-4]}")

for item in all_files:
    if counter == 1:
        # 加载目标设备
        data = np.genfromtxt(os.path.join(input_directory, item), delimiter='\t')
        labels = [counter] * (data.shape[0])
    else:
        temp_data = np.genfromtxt(os.path.join(input_directory, item), delimiter='\t')
        temp_labels = [counter] * (temp_data.shape[0])
        # 合并训练集
        data = np.concatenate((data, temp_data), axis=0)
        # 合并标签
        labels.extend(temp_labels)
    counter = counter + 1
x_train, x_test, y_train, y_test = train_test_split(data, labels, test_size=0.3, random_state=42)
# 一百棵树,并且计算袋外准确度
rf = RandomForestClassifier(n_estimators=100, class_weight='balanced', oob_score=True)
# 训练
rf.fit(x_train, y_train)
# 使用测试集作为输入,进行预测
predicted = rf.predict(x_test)
print(predicted)
# 根据标签计算准确率
accuracy = accuracy_score(y_test, predicted)
# 输出袋外准确度
print(rf.oob_score_)
# 输出预测准确率
print(accuracy)
# 打印分类报告
print(classification_report(y_test, predicted))

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-12 09:55
    关注

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

    根据您提供的代码,我注意到您在使用随机森林进行多分类时的一些关键点。首先,让我们分析并确认代码逻辑是否正确:

    1. 您从指定目录下读取多个文件,并将数据合并到一个numpy数组data中,同时将对应的标签存储在列表labels中。每个文件对应一类设备,通过循环和计数器counter来标记类别。

    2. 数据预处理部分看起来没有明显问题,但需要注意的是,labels的值应当是各个类别的标识符(如0、1、2等),而不是文件读取顺序的计数器。确保在加载文件时,将counter映射到实际类别ID上。

    3. 将数据划分为训练集和测试集,并使用RandomForestClassifier进行训练。这里设置了100棵树,并启用了袋外(out-of-bag, OOB)评估。

    4. 训练模型后,预测测试集结果,并计算准确率和其他评价指标。

    针对可能出现的问题及改进意见:

    • 标签编码:确保标签labels被适当地编码为数值类型,例如对于多分类任务,通常会将其转换为0、1、2...n的形式,n为类别总数。
    # 假设类别总数为 n_classes
    n_classes = len(all_files)
    label_mapping = {i: idx for idx, i in enumerate(range(1, n_classes + 1))}
    labels = [label_mapping[cls_id] for cls_id in counter_list]
    
    • 检查数据格式:确保输入数据的特征与目标变量之间具有正确的对应关系。您的代码中直接使用了np.genfromtxt读取的数据,需要保证每列数据都能作为有效特征用于分类。

    • 模型评估:目前代码中只计算了准确率和OBB得分,针对多分类任务,还可以考虑绘制ROC曲线或计算每个类别的精度、召回率和F1分数。

    以下是修改后的代码片段,用于对标签进行正确编码(假设类别编号从0开始):

    # ...
    unique_labels = list(set(counter_list))  # 获取所有不同的类别标签
    n_classes = len(unique_labels)
    label_mapping = {i: idx for idx, i in enumerate(unique_labels)}
    labels = [label_mapping[label] for label in labels]
    
    # 确保y_train和y_test也是编码后的类别标签
    y_train = np.array([label_mapping[lbl] for lbl in y_train])
    y_test = np.array([label_mapping[lbl] for lbl in y_test])
    
    # ...
    

    最后,您可以尝试调整随机森林中的参数以优化模型性能,例如max_depthmin_samples_split等。另外,由于您提到是多类型的设备识别,如果类别不平衡,启用class_weight='balanced'是一个好的选择,不过也要视具体情况而定。

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 3月12日
  • 创建了问题 3月12日

悬赏问题

  • ¥15 ogg dd trandata 报错
  • ¥15 高缺失率数据如何选择填充方式
  • ¥50 potsgresql15备份问题
  • ¥15 Mac系统vs code使用phpstudy如何配置debug来调试php
  • ¥15 目前主流的音乐软件,像网易云音乐,QQ音乐他们的前端和后台部分是用的什么技术实现的?求解!
  • ¥60 pb数据库修改与连接
  • ¥15 spss统计中二分类变量和有序变量的相关性分析可以用kendall相关分析吗?
  • ¥15 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?
  • ¥20 神经网络Sequential name=sequential, built=False
  • ¥16 Qphython 用xlrd读取excel报错