数据集
- 数据集地址: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
- 建立随机森林模型
#建立随机森林模型
#=
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)