Engee 文档
Notebook

分类

此示例演示如何使用朴素贝叶斯分类器和决策树执行分类。 假设您有一个数据集,其中包含具有各种变量(称为预测变量)及其已知类标签的测量值的观测值。 在获取新观测值的预测变量值时,您能否确定这些观测值可能属于哪些类? 这就是分类的问题。

运行此演示需要internet连接

费舍尔(氏)鸢尾花

Fischer的虹膜数据集包括萼片的长度和宽度的测量,以及150个虹膜标本的花瓣的长度和宽度。 这三个物种中的每一个都有50个样本。 上传数据,看看萼片大小如何不同,从一个物种到另一个。 您可以使用包含其尺寸的前两列。

下载用于统计分析的库

要使用统计数据,您需要下载指定的库。

In [ ]:
Pkg.add(["RDatasets", "NaiveBayes", "StatsBase", "StatsPlots", "DecisionTree", "ScikitLearn"])
In [ ]:
Pkg.add("DecisionTree")#загрузка библиотеки решающих деревьев
Pkg.add("NaiveBayes")#загрузка библиотеки с Баесовскими классификаторами
Pkg.add("StatsBase")#для использования predict в баесовском классификаторе
Pkg.add("StatsPlots")#для построения точечных графиков

连接下载的库和辅助库,用于上传数据集、绘制图表和训练分类器。

In [ ]:
using NaiveBayes
using RDatasets
using StatsBase
using Random
using StatsPlots
using Plots, RDatasets
using DecisionTree
using ScikitLearn: fit!, predict
using ScikitLearn.CrossValidation: cross_val_score

预测器矩阵和一组类标签的形成。

In [ ]:
features, labels = load_data("iris")
features = float.(features);
labels   = string.(labels);

启用绘图库方法以显示图形,以及定义数据集以显示观测值在sepal的宽度和长度(SepalWidth,SepalLength)上的分布。

In [ ]:
plotlyjs();
iris = dataset("datasets", "iris");

包含预测变量和类的数据集。

In [ ]:
first(iris[:,1:5],5)
Out[0]:

5 rows × 5 columns

SepalLengthSepalWidthPetalLengthPetalWidthSpecies
Float64Float64Float64Float64Cat…
15.13.51.40.2setosa
24.93.01.40.2setosa
34.73.21.30.2setosa
44.63.11.50.2setosa
55.03.61.40.2setosa

通过萼片的宽度和长度观察值的分布的曲线图。

In [ ]:
@df iris scatter(:SepalLength, :SepalWidth, group = :Species)
Out[0]:

为所有假设观测值准备一个预测器矩阵,这在构建一个点图时是必要的,该点图显示了分类器将对象划分为类的工作。

In [ ]:
h = 10000;
x1 = rand(4:0.1:8, h)
x1t = x1'
x2 = rand(2:0.1:4.5, h)
x2t = x2'
x12 = vcat(x1t,x2t);

朴素贝叶斯分类器

朴素贝叶斯分类器是一个简单的概率分类器,它基于贝叶斯定理的应用,具有严格的(朴素的)独立性假设。

朴素贝叶斯分类器的优点是训练,参数估计和分类所需的数据量很小。

预处理用于训练贝叶斯分类器模型的数据。

In [ ]:
Xx = Matrix(iris[:,1:2])';#features';#
Yy = [species for species in iris[:, 5]];#labels;
p, n = size(Xx)
train_frac = 0.8
k = floor(Int, train_frac * n)
idxs = randperm(n)
train_idxs = idxs[1:k];
test_idxs = idxs[k+1:end];

通过GaussianNB方法确定模型结构,并通过拟合方法进行训练。
计算精度。

In [ ]:
modelNB = GaussianNB(unique(Yy), p)
fit(modelNB, Xx[:, train_idxs], Yy[train_idxs])
accuracyNB = count(!iszero, StatsBase.predict(modelNB, Xx[:,test_idxs]) .== Yy[test_idxs]) / count(!iszero, test_idxs)
println("Accuracy: $accuracyNB")
Accuracy: 0.7333333333333333

形成新观测的预测矩阵。

In [ ]:
predNB = fill("", 0);#Определение пустого массива
predNB = (NaiveBayes.predict(modelNB, x12[:,1:h]));#наполнение массива значениями предсказаний

形成新观测值的预测器-预测矩阵。

In [ ]:
x_pred_NB = hcat(x12',predNB);
pred_df_NB = DataFrame(x_pred_NB,:auto);

显示分类器将预测器字段划分为与虹膜类型相对应的类。

In [ ]:
gr()
@df pred_df_NB scatter(:x1, :x2, group = :x3, markersize = 7)
Out[0]:

决策树

决策树是一组简单的规则,例如"如果萼片长度小于5.45,则将样本分类为setosa"。 决策树也是非参数的,因为它们不需要任何关于每个类中变量分布的假设。

构建决策树的过程包括在节点上使用决策规则将训练集按顺序递归划分为子集。

通过DecisionTreeClassifier方法确定模型结构,并通过拟合进行训练! 方法。
使用交叉验证计算精度。

显示决策树。

In [ ]:
modelDT = DecisionTreeClassifier(max_depth=10)#определение структуры модели
fit!(modelDT, features[:,1:2], labels)#обучение модели
print_tree(modelDT, 5)#отображение дерева решений
accuracy = cross_val_score(modelDT, features[:,1:2], labels, cv=8)#вычисление точности
Feature 1 < 5.55 ?
├─ Feature 2 < 2.8 ?
    ├─ Feature 1 < 4.95 ?
        ├─ Feature 2 < 2.35 ?
            ├─ Iris-setosa : 1/1
            └─ Feature 2 < 2.45 ?
                ├─ Iris-versicolor : 1/1
                └─ Iris-virginica : 1/1
        └─ Iris-versicolor : 9/9
    └─ Feature 1 < 5.35 ?
        ├─ Iris-setosa : 39/39
        └─ Feature 2 < 3.2 ?
            ├─ Iris-versicolor : 1/1
            └─ Iris-setosa : 7/7
└─ Feature 2 < 3.7 ?
    ├─ Feature 1 < 6.25 ?
        ├─ Feature 1 < 5.75 ?
            ├─ Feature 2 < 2.85 ?
                ├─ 
                └─ Iris-versicolor : 5/5
            └─ Feature 2 < 2.95 ?
                ├─ 
                └─ 
        └─ Feature 1 < 7.05 ?
            ├─ Feature 2 < 2.4 ?
                ├─ Iris-versicolor : 1/1
                └─ 
            └─ Iris-virginica : 10/10
    └─ Feature 1 < 6.75 ?
        ├─ Iris-setosa : 3/3
        └─ Iris-virginica : 2/2
Out[0]:
8-element Vector{Float64}:
 0.6190476190476191
 0.7619047619047619
 0.5
 0.7222222222222222
 0.7222222222222222
 0.7222222222222222
 0.7777777777777778
 0.7222222222222222

这个随机查找的树使用一组规则,如"特征1<5.55",根据11个末端节点中的一个对每个样本进行分类。 要确定观察到的虹膜的类型,请从上部条件开始并应用规则。 如果观测值满足规则,则选择上分支,如果没有,则选择下分支。 因此,您将到达最终节点,该节点将为观察到的实例分配三种类型之一的值。

形成新观测的预测矩阵。

In [ ]:
predDT = fill("", 0);#определение массива 
#формирование матрицы значение-прогноз для решающего дерева
for i in 1:h
    predDT = vcat(predDT, predict(modelDT, x12[:,i]))
end

形成新观测值的预测器-预测矩阵。

In [ ]:
x_pred_DT = hcat(x12',predDT);
pred_df_DT = DataFrame(x_pred_DT,:auto);

显示分类器将预测器字段划分为与虹膜类型相对应的类。

In [ ]:
@df pred_df_DT scatter(:x1, :x2, group = :x3, markersize = 7)
Out[0]:

结论

在此示例中,使用朴素贝叶斯分类器和决策树解决了分类问题。 演示了DecisionTreeNaiveBayes图书馆的使用。
它们被用来训练分类器。

反过来,具有相当小的数据集的分类器显示出良好的准确性,并将预测器字段划分为类。