数据集

  • 数据集地址:UCI Steel Plates Faults Data Set
  • 文件说明:
该数据集包含了7种带钢缺陷类型。这个数据集不是图像数据,而是带钢缺陷的28种特征数据。
Faults.NNA				数据集(特征+分类标签)
Faults27x7_var			特征和分类类别名称

随机森林实现多分类

  • 使用的包
using DataFrames
using DecisionTree
using CSV
using Base
using Lathe.preprocess:TrainTestSplit

注:如果没有安装包,使用脚本进行安装

import Pkg
Pkg.add([PKG NAME]) 	#example:Pkg.add("CSV")
  • 加载数据集
#数据读取 data--数据集  var--参数说明
data=CSV.read("F:\\数据集\\钢板缺陷数据集\\data.txt",DataFrame)
var=CSV.read("F:\\数据集\\钢板缺陷数据集\\var.txt",DataFrame)
var=Matrix(var)[27:33]

#分割数据集为训练样本及测试样本
train,test=TrainTestSplit(data,0.9)

train=Matrix(train)
#数据集[1:27]为特征 [28:34]为类别标签
features=convert(Array,train[:,1:27])
labels=convert(Array,train[:,28:34])

#将多维类别标签转换为一维
train_labels=Array{String}(undef,size(labels,1))
for i= 1:size(labels,1)
    for j=1:size(labels[i,:],1)
        if labels[i,j]==1
            global train_labels[i]=var[j]
        end
    end
end

随机森林 多输入多输出 随机森林可以多分类吗_机器学习


随机森林 多输入多输出 随机森林可以多分类吗_随机森林 多输入多输出_02

  • 建立随机森林模型
#建立随机森林模型
#=
function build_forest(
        labels              :: AbstractVector{T},
        features            :: AbstractMatrix{S},
        n_subfeatures       = -1,                   特征的数量
        n_trees             = 10,                   树的棵数
        partial_sampling    = 0.7,                  每棵树使用的样本比例
        max_depth           = -1,                   树的最大深度
        min_samples_leaf    = 5,                    叶子节点含有的最少样本,
                                                    若叶子节点样本数小于则对该叶子节点和兄弟叶子节点进行剪枝,只留下该叶子节点的父节点
        min_samples_split   = 2,                    节点可分的最小样本数,默认值是2
        min_purity_increase = 0.0;                  节点划分的最小不纯度。假设不纯度用信息增益表示,若某节点划分时的信息增益大于等于min_impurity_decrease,
                                                    那么该节点还可以再划分;反之,则不能划分。
        rng                 = Random.GLOBAL_RNG)
=#
model=DecisionTree.build_forest(train_labels,features,-1,19,1,-1,1,2)
  • 测试集预测
#测试集处理
test=Matrix(test)
testfeatures=convert(Array,test[:,1:27])
testlabels=convert(Array,test[:,28:34])
test_labels=Array{String}(undef,size(testlabels,1))
for i= 1:size(testlabels,1)
    for j=1:size(testlabels[i,:],1)
        if testlabels[i,j]==1
            global test_labels[i]=var[j]
        end
    end
end

#预测测试集
predtest=DecisionTree.apply_forest(model,testfeatures)

#计算准确率
numacc=0
for i = 1:size(test_labels,1)
    if predtest[i]==test_labels[i]
        #全局变量 需加global
        global  numacc
        numacc+=1
    end
end
acc=numacc/size(test_labels,1)
println("准确率=",acc)

输出:

准确率=0.7891891891891892

完整代码

using DataFrames
using DecisionTree
using CSV
using Base
using Lathe.preprocess:TrainTestSplit

#数据读取 data--数据集  var--参数说明
data=CSV.read("F:\\数据集\\钢板缺陷数据集\\data.txt",DataFrame)
var=CSV.read("F:\\数据集\\钢板缺陷数据集\\var.txt",DataFrame)
var=Matrix(var)[27:33]

#分割数据集为训练样本及测试样本
train,test=TrainTestSplit(data,0.9)

train=Matrix(train)
#数据集[1:27]为特征 [28:34]为类别标签
features=convert(Array,train[:,1:27])
labels=convert(Array,train[:,28:34])

#将多维类别标签转换为一维
train_labels=Array{String}(undef,size(labels,1))
for i= 1:size(labels,1)
    for j=1:size(labels[i,:],1)
        if labels[i,j]==1
            global train_labels[i]=var[j]
        end
    end
end

#建立随机森林模型
#=
function build_forest(
        labels              :: AbstractVector{T},
        features            :: AbstractMatrix{S},
        n_subfeatures       = -1,                   特征的数量
        n_trees             = 10,                   树的棵数
        partial_sampling    = 0.7,                  每棵树使用的样本比例
        max_depth           = -1,                   树的最大深度
        min_samples_leaf    = 5,                    叶子节点含有的最少样本,
                                                    若叶子节点样本数小于则对该叶子节点和兄弟叶子节点进行剪枝,只留下该叶子节点的父节点
        min_samples_split   = 2,                    节点可分的最小样本数,默认值是2
        min_purity_increase = 0.0;                  节点划分的最小不纯度。假设不纯度用信息增益表示,若某节点划分时的信息增益大于等于min_impurity_decrease,
                                                    那么该节点还可以再划分;反之,则不能划分。
        rng                 = Random.GLOBAL_RNG)
=#
model=DecisionTree.build_forest(train_labels,features,-1,19,1,-1,1,2)

#测试集处理
test=Matrix(test)
testfeatures=convert(Array,test[:,1:27])
testlabels=convert(Array,test[:,28:34])
test_labels=Array{String}(undef,size(testlabels,1))
for i= 1:size(testlabels,1)
    for j=1:size(testlabels[i,:],1)
        if testlabels[i,j]==1
            global test_labels[i]=var[j]
        end
    end
end

#预测测试集
predtest=DecisionTree.apply_forest(model,testfeatures)

#计算准确率
numacc=0
for i = 1:size(test_labels,1)
    if predtest[i]==test_labels[i]
        #全局变量 需加global
        global  numacc
        numacc+=1
    end
end
acc=numacc/size(test_labels,1)
println("准确率=",acc)