本文主要是介绍<机器学习>基于Julia和随机森林的多分类实战,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
数据集
- 数据集地址: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]==1global train_labels[i]=var[j]endend
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, 节点可分的最小样本数,默认值是2min_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]==1global test_labels[i]=var[j]endend
end#预测测试集
predtest=DecisionTree.apply_forest(model,testfeatures)#计算准确率
numacc=0
for i = 1:size(test_labels,1)if predtest[i]==test_labels[i]#全局变量 需加globalglobal numaccnumacc+=1end
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]==1global train_labels[i]=var[j]endend
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, 节点可分的最小样本数,默认值是2min_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]==1global test_labels[i]=var[j]endend
end#预测测试集
predtest=DecisionTree.apply_forest(model,testfeatures)#计算准确率
numacc=0
for i = 1:size(test_labels,1)if predtest[i]==test_labels[i]#全局变量 需加globalglobal numaccnumacc+=1end
end
acc=numacc/size(test_labels,1)
println("准确率=",acc)
这篇关于<机器学习>基于Julia和随机森林的多分类实战的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!