Ⅰ. 加载数据集
DaPy自带了少量著名的数据集,比如用于分类问题的红酒分类和鸢尾花数据集。 接下来,我们首先启动一个Python Shell并加载作为例子的红酒数据集:
代码语言:javascript复制>>> import DaPy as dp >>> from DaPy import datasets >>> wine, info = datasets.wine()
这个函数会返回一个内部由DaPy.SeriesSet结构包装的数据集,同时还会返回一个 数据集的官方简介。
一般来说,如果要加载一个外部的数据集,你可以通过如下的语法:
代码语言:javascript复制>>> data = dp.DataSet(file_name) >>> data.readcol()
本例中,作为一个监督学习问题,所有的自变量和因变量都被包含在了一个SeriesSet结构中。 为此,我们可以通过如下的方式观察红酒数据集的信息。
>>> wine Alcohol:<14.23, ...="" 14.13=""> Malic acid:<1.71, ...="" 4.1=""> Ash:<2.43, ...="" 2.74=""> Alcalinity of ash:<15.6, ...="" 24.5=""> Magnesium:<127, 96="" ...=""> Total phenols:<2.8, ...="" 2.05=""> Flavanoids:<3.06, ...="" 0.76="">Nonflavanoid phenols:<0.28, ...="" 0.56=""> Proanthocyanins:<2.29, ...="" 1.35=""> Color intensity:<5.64, ...="" 9.2=""> Hue:<1.04, ...="" 0.61=""> OD280:<3.92, ...="" 1.6=""> Proline:<1065, 560="" ...=""> class_1:<1, 0="" ...=""> class_2:<0, 0="" ...=""> class_3:<0, 1="" ...="">
每一个SeriesSet对象都会自动地统计一些基本的数据集信息(缺失值、均值等)。例如,你可以通过如下的方式浏览数据集:
>>> wine.info 1. Structure: DaPy.SeriesSet 2. Set Name: MySeries 3. Dimensions: Ln=178 | Col=14 4. Miss Value: 0 elements 5. Describe: Title | Miss | Min | Max | Mean | Std |Dtype ---------------------- ------ ------- ------- -------- -------- ----- class | 0 | 1 | 3 | 1.94 | 0.78 | int Alcohol | 0 | 11.03 | 14.83 | 13.00 | 0.81 |float Malic acid | 0 | 0.74 | 5.8 | 2.34 | 1.12 |float Ash | 0 | 1.36 | 3.23 | 2.37 | 0.27 |float Alcalinity of ash | 0 | 10.6 | 30.0 | 19.49 | 3.34 |float Magnesium | 0 | 70 | 162 | 99.74 | 14.28 | int Total phenols | 0 | 0.98 | 3.88 | 2.30 | 0.63 |float Flavanoids | 0 | 0.34 | 5.08 | 2.03 | 1.00 |float Nonflavanoid phenols | 0 | 0.13 | 0.66 | 0.36 | 0.12 |float Proanthocyanins | 0 | 0.41 | 3.58 | 1.59 | 0.57 |float Color intensity | 0 | 1.28 | 13.0 | 5.06 | 2.32 |float Hue | 0 | 0.48 | 1.71 | 0.96 | 0.23 |float OD280 | 0 | 1.27 | 4.0 | 2.61 | 0.71 |float Proline | 0 | 278 | 1680 | 746.89 | 314.91 | int =====================================================================
Ⅱ. 预处理数据
在我们开始一个机器学习对象之前,为了能让数据符合模型的要求,我们需要进行预处理操作。
在刚刚观察数据集时我们发现原始的数据集按照“类”变量被排序好了。为了我们能提供一个 平衡样本的训练集,我们可以通过*shuffles()*函数打乱我们的数据集。另外,在我们浏览 数据集时还发现,不同变量之间的量纲差异显著,因此我们认为进行标准化处理会更好:
代码语言:javascript复制>>> wine.shuffles() >>> wine.normalized()
在打乱数据集后,我们要将目标变量和特征变量分离:
代码语言:javascript复制>>> target = wine.pop_col('class_1', 'class_2', 'class_3')
Ⅲ. 学习和预测
在红酒分类数据集中,我们的任务是给定一个新的纪录,预测它属于哪一个类。我们为每一个可能的类 都提供了相应的已有记录来训练分类器,以此分类器便能分辨出那些它未曾见过的样本了。
在DaPy中,一个常用的分类器是来自于DaPy.multilayer_perseptron类中实现的多层感知机模型:
代码语言:javascript复制>>> mlp = dp.MLP() >>> mlp.create(input_cell=13, output_cell=3) Create structure: 13 - 14 - 3
因为模型叫做multilayer perceptron,因此我们将该分类器称为mlp。现在我们需要训练模型, 也就是我们必须让他从数据集中学习。我们使用142条记录(总数的80%)来作为训练集。我们通过 [:142]这种非常Pythonic的语法来提取我们的数据:
>>> mlp.train(wine[:142], target[:142]) - Start Training... - Initial Error: 149.99 % Completed: 10.00 Remaining Time: 2.63 s Completed: 20.00 Remaining Time: 1.60 s Completed: 29.99 Remaining Time: 1.21 s Completed: 39.99 Remaining Time: 1.01 s Completed: 49.99 Remaining Time: 0.78 s Completed: 59.99 Remaining Time: 0.61 s Completed: 69.99 Remaining Time: 0.44 s Completed: 79.98 Remaining Time: 0.29 s Completed: 89.98 Remaining Time: 0.14 s Completed: 99.98 Remaining Time: 0.00 s - Total Spent: 1.5 s Errors: 12.211424 %
现在,mlp已经训练好了。值得注意的是,最后一行中的Errors并不意味着分类的正确率, 而是它与目标向量的绝对误差。
让我们用我们的模型去分类那些红酒数据集中剩余的它不曾接触过的数据:
代码语言:javascript复制>>> mlp.test(wine[142:], target[142:]) 'Classification Correct: 97.2222%'
正如你们所见到的,我们的模型具备了一定的分类能力。
Ⅳ. 后记
为了能在下一次任务中快速地调用训练好的模型,DaPy中支持了模型的保存方法:
代码语言:javascript复制>>> mlp.topkl('First_mlp.pkl')
在一次正式的工作中,你可以通过如下方式快速地使用训练好的模型预测新的案例:
代码语言:javascript复制>>> import DaPy as dp >>> mlp = dp.MLP() >>> mlp.readpkl('First_mlp.pkl') >>> mlp.predict(My_new_data)