准备与设置

Silas机器学习需要三个配置文件才能正确运行:

我们将使用下列形式的命令模板:

silas command [OPTIONS] [para1] [para2] ...

其中OPTIONS包括可选参数,para1、para2等为必选参数。

可以跳过本章节, generate all these files automatically

元数据设置

元数据设置包括两个字段:

  • 属性设置:列出每个属性的数据类型。

  • 缺少的值占位符:列出缺少的值的字符串占位符。

这些设置保存为JSON格式。元数据设置的目的是生成 元数据.

以下是元数据设置文件的例子:

"attribute-settings":
[
    {
        "type": "nominal",
        "name": "Month"
    },
    {
        "type": "numerical",
        "name": "DayofMonth"
    }
],
"missing-value-place-holders":
[
    "",
    "NA",
    "?"
]

属性类型

Silas支持两种属性类型:

  • 数字:当属性的值是实数/连续的数字时使用。

  • 名词:当一个属性的值是离散的时候使用。例如:东、西、南、北。

自动生成元数据设置

使用以下命令生成元数据设置文件:

silas gen-metadata-settings [OPTIONS] [data_files...]

其中data_files是数据集的文件路径列表,OPTIONS包括:

  • -h: 输出帮助信息和退出

  • -o file_path: 输出给定文件中的元数据设置。如果没有提供这个选项,元数据设置将被存储在当前目录下的metadata-settings.json中。

  • -\-nh: 一个标志,表示数据集文件没有标题。在这种情况下,Silas将生成包含相同数据且有标题的新数据集文件。新的数据集文件将被保存在与原始数据集文件相同的目录中,文件名将以”-w-headers “结尾。

如果有多个数据集文件,可以使用下面的任何一个命令。例如,要从data/dataset1.csv生成一个元数据设置文件,并在data/metadata-settings.json中输出设置,运行以下命令:

silas gen-metadata-settings -o data/metadata-settings.json data/dataset1.csv

建议用户检查元数据设置文件,手动选择特征的数据类型。

元数据

一个 metadata 文件给出特征和属性的详细信息。这些信息存储为JSON格式。

以下内容可以忽略,并跳转到 自动生成元数据 章节。

属性的元数据

metadata 文件包括一个属性的列表以及它们的详细信息。

一个属性定义了 type ,它的名字,它在C++中的数据类型和值(的范围)。

如果属性的类型是数字,那么该属性的定义包括属性的名称、C++数据类型、最小值和最大值。例如,对属性 “比率 “的定义如下,其中 “f32”表示32位浮点数:

"type": "numerical",
"name": "ratio",
"data-type": "f32",
"bounds":
{
    "min": 0.0,
    "max": 1.0
}

如果一个属性的类型是名词,那么它的定义包括属性的名称、C++数据类型、它的值是否可以被排序以及值的列表。例如,我们对属性 “size”的定义如下:

"type": "nominal",
"name": "size",
"data-type": "u8",
"ordered": true,
"values":
[
    "Short",
    "Tall",
    "Grande"
]

支持的C++数据类型包括:

  • bool: 布尔型。

  • u8:8位无符号整数。

  • u16: 16位无符号整数。

  • u32: 32位无符号整数。

  • u64:64位无符号整数。

  • i8:8位有符号整数。

  • i16:16位有符号整数。

  • i32:32位有符号整数。

  • i64:64位有符号整数。

  • f32:32位浮点。

  • f64:64位浮点。

建议尽可能使用能表示所有值的最小数据类型。

特征

每个特征定义为它的名字和 attribute 。例如,飞行数据集的某些特征定义为:

{
    "feature-name": "Dest",
    "attribute-name": "Location"
},
{
    "feature-name": "Origin",
    "attribute-name": "Location"
},
{
    "feature-name": "Distance",
    "attribute-name": "Distance"
},
{
    "feature-name": "Month",
    "attribute-name": "Month"
},

在这里区分特征和属性的原因是,有些特征,例如Dest和Origin,具有相同的属性。因此,这种信息的组织方式减少了冗余。

自动生成元数据

Silas自带的工具可以从数据集自动生成元数据。命令如下:

silas gen-metadata [OPTIONS] [metadata_settings] [data_files...]

此处,metadata_settings是 元数据设置 的文件路径,data_files是数据集的文件路径列表,OPTIONS包括:

  • -h: 打印帮助信息并退出。

  • -o file_path: 输出指定文件中的元数据。如果没有提供这个选项,元数据将被存储在当前目录下的metadata.json中。

例如,使用data/metadata-settings1.json中的元数据设置和数据集文件data/dataset1.csv和data/dataset2.csv来输出metadata1.json中的元数据,可用以下命令:

silas gen-metadata -o metadata1.json data/metadata-settings1.json data/dataset1.csv data/dataset2.csv

注意,gen-metadata命令也会在输出文件所在的目录中输出feature-stats.json中的特征统计数据。

绘制特征统计图表

可以使用以下命令生成简单的数据集可视化:

silas draw [OPTIONS] data_stats_file

其中data_stats_file是由silas gen-metadata生成的特征统计文件,而OPTIONS包括一个-h标志,用于显示帮助信息。

机器学习设置

设置参数

机器学习设置文件定义了Silas机器学习的参数。这些设置以JSON格式存储。这些参数包括。

  • output-feature: 要预测或分类的特征。在有些文献中称为类或目标。

  • metadata-file: 元数据文件的路径。

  • ignored-features: 在训练中不使用的特征的列表。

  • learner-settings: 机器学习过程的设置。
    • mode: classification(分类)或regression(回归),二选一。

    • reduction-strategy: 多分类的策略。允许的值是:
      • none: 使用决策树对多个类别进行原生分类。这个过程只建立1个森林。

      • one-vs-rest: 每类建立1个森林。通过加权投票获得预测结果。

      • one-vs-one: 为每对类建立一个森林。通过加权投票获得预测结果。

    • grower-settings: 训练决策树和森林的设置:
      • forest-settings: 训练森林的设置:
        • type: 森林的类型,可选的值包括:
          • ClassicForest: (也称为UB) 一种类似于随机森林的集合算法,有平衡子抽样。这种方法通常速度快,对不平衡的数据集效果好。只允许在模式为分类时使用。

          • PrototypeSampleForest: (也称为PS) 使用受原型选择和最小近邻启发的采样方法,以获得平衡的子样本来构建每棵树。这种方法比ClassicForest慢,但有时表现得更好。对于不平衡的数据集也很有效。只允许在模式为分类时使用。

          • SimpleForest: (也称为NB) 在建立每棵树时,只根据抽样比例对训练集进行抽样。这种方法对大致平衡的数据集很有效。只允许在模式为分类时使用。

          • SimpleValueForest: (也称为HV) 与SimpleForest相同,只是每个叶子节点存储一个投票结果,而不是一个分布。这大大节省了内存,而且通常在叶子大小为1时效果最好。对于有成千上万个类的数据集,使用这种方法。只允许在模式为分类时使用。

          • SimpleRegForest: 使用装袋并进行回归。只有在模式为回归时才允许使用。

          • SimpleOOBRegForest: 对每棵树的训练集进行子抽样,并使用OOB样本来计算每棵树的权重。只有在模式为回归时才允许使用。

          • AdaBoostForest: (也称为AB) AdaBoosting的一个并行版本,同时训练一批树。

          • CascadeForest: (也称为WC) 与平衡级联算法类似,但在训练每一批树后,不删除正确分类的数据点,而增加不正确分类的数据点的权重。

        • number-of-trees: 集合模型中决策树的数量。

        • sampling-proportion: 用于构建每棵树的子样本中的数据实例的比例(与整个训练集相比)。

        • oob-proportion: OOB(袋外)样本中数据实例的比例。如果oob_proportion是0.1,那么10%的抽样数据被用作OOB实例,在构建决策树时不被使用。OOB分割发生在数据集的采样之后。例如:对于一个100万个实例的数据集,如果森林类型是 “ClassicForest”,sampling_proportion = 0.7,oob_proportion = 0.1,那么只有630K的实例被用于训练决策树,70K的实例在OOB集中,用于评估决策树。注意:这个参数在0.86版本的分类任务中是禁用的。

      • tree-settings: 训练决策树的设置:
        • type: 树的类型,允许的值包括:
          • GreedyNarrow1D: (也称为GT) 以贪心算法生成每棵树。为每个特征选择最佳切割点,然后从特征中选择最佳谓词。在选择最佳切割点时,对数据点使用定制的采样策略。只允许在模式为分类时使用。

          • RdGreedy1D: (也称为RT) 为每个特征随机选择一个切点,然后从考虑的特征中选择最佳谓词。它比其他决策树生成器更快。当与SimpleForest和采样比例1.0结合使用时,它相当于极限随机树(极限树)。只允许在模式为分类时使用。

          • SimpleTreeGrower: 与GreedyNarrow1D类似,但在为每个特征选择最佳切点时不对数据点进行采样。只允许在模式为分类时使用。

          • RdGreedyReg1D: 与RdGreedy1D类似,但用于回归。只允许在模式为回归时使用。

        • max-depth: 决策树的最大深度。最大深度是n时,树最多有 \(2^{n+1} - 1\) 个节点,其中有 \(2^n\) 个叶节点。这个参数被用作停止条件,以控制树的生长。如果max_depth是32,当分支的深度达到32时,就会停止这个分支。

        • desired-leaf-size: 每个叶节点需要的数据数 instances 。这个参数被用作停止条件,以控制树的生长。如果desired_leaf_size是32,当叶子节点包含的数据实例少于32时,就会停止这个分支。

        • feature-proportion: 构建决策树时使用的特征数量的比例。允许的值是:
          • “sqrt”: 特征总数的平方根(默认)。

          • “log”: 特征总数的自然对数。

          • “log2”: 总特征数的对数,基数为2。

          • “golden”: 0.618倍的特征总数。

          • 0.0和1.0之间的任何浮点数(不带双引号)。

    • training-dataset: 训练集的详细信息:
      • type: 文件的类型。允许值是:
        • CSV: 逗号分隔值。

      • path: 训练集的文件路径。

    • validation-settings: 用于验证和测试的设置。
      • type: 允许的值是:
        • CV: 交叉验证。

        • TT: 训练和测试。

    如果类型是CV,有以下两种设置:
    • number-of-runs: 实验的运行次数。

    • number-of-partitions: 交叉验证中的分块数量。

    如果类型是TT,可进行以下设置:
    • testing-dataset: 测试集的信息。
      • type: 文件的类型。允许值是:
        • CSV: 逗号分隔值。

      • path: 训练集的文件路径。

自动生成机器学习设置

要自动生成一个设置文件,请使用以下命令:

silas gen-settings [OPTIONS] [metadata_file] [data_files...]

其中metadata_file指定元数据文件路径,data_files是一个数据集文件路径的列表,OPTIONS包括:

  • -h: 打印帮助信息并退出。

  • -v validation_mode: 指定验证模式。如果没有提供这个选项,验证模式将从数据集文件的数量中推断出来:如果只提供一个数据集文件,则采用交叉验证;如果提供多个数据集文件,则采用训练和测试,在这种情况下,第一个文件将用于训练,第二个文件将用于测试。有两个选项:
    • “cv”: 交叉验证。用户必须至少指定一个数据集文件。如果提供多个文件,第一个文件将被用于训练和验证。

    • “tt”: 训练和测试。用户必须至少指定两个数据集文件。如果提供多个文件,第一个数据集文件将被用于训练,第二个将被用于测试。

  • -o file_path: 输出给定文件中的设置。如果没有提供这个选项,设置将被保存在发出命令的目录下的settings.json中。

例如,要从元数据文件data/metadata1.json和数据集文件data/dataset1.csv生成一个名为settings1.json的设置文件,使用以下命令:

silas gen-settings -o settings1.json data/metadata.json data/dataset1.csv

自动生成所有配置文件

要自动生成Silas机器学习中所需要的所有文件,请使用以下命令:

silas gen-all [OPTIONS] [data_files...]

其中data_files是一个数据集的文件路径列表,OPTIONS包括:

  • -h: 打印帮助信息并退出。

  • -v validation_mode: 指定验证模式。如果没有提供这个选项,验证模式将从数据集文件的数量中推断出来:如果只提供一个数据集文件,则采用交叉验证;如果提供多个数据集文件,则采用训练和测试,在这种情况下,第一个文件将用于训练,第二个文件将用于测试。有两个选项:
    • “cv”: 交叉验证。用户必须至少指定一个数据集文件。如果提供多个文件,第一个数据集文件将被用于训练和验证。其余的数据集文件将只用于计算数据集的统计数据。

    • “tt”: 训练和测试。用户必须至少指定两个数据集文件。如果提供多个文件,第一个数据集文件将被用于训练,第二个将被用于测试。其余的数据集文件将只用于计算数据集的统计数据。

  • -o directory: 输出指定目录下的配置文件。如果不提供这个选项,配置文件将被保存在发出命令的目录中。

  • -\-nh: 一个标志,表示数据集文件没有标题。在这种情况下,Silas将生成新的数据集文件,其中包含相同的数据并有标题。新的数据集文件将被保存在与原始数据集文件相同的目录中,文件名将以”-w-headers”结尾。

例如,要从data/train.csv和data/test.csv中生成用于训练和测试的所有配置文件,并将配置文件存储在config/中,运行以下命令:

silas gen-all -v tt -o config data/train.csv data/test.csv

数据清洗

如果数据集包含缺失的数据或格式不正确的话,可以用以下命令对数据集进行 sanitise

silas sanitise [OPTIONS] [metadata_settings] [feature_stats_file] [metadata] [data_files...]

其中metadata_settings是 元数据设置 的文件路径;feature_stats_file是特征统计的文件路径,它与元数据一起生成;metadata是 元数据 的文件路径;data_files是数据集的文件路径列表;OPTIONS包括:

  • -c 有以下选项:
    • new: 用新的类别替换缺失的分类值。

    • most-common: 用最常见的类别替换缺失的分类值。

    • least-common: 用最不常见的类别替换缺失的分类值。

    • remove: 删除缺失的分类值。

  • -n 有以下选项:
    • mean: 用平均值代替缺失的数值。

    • median: 用中值代替缺失的数值。

    • new-above-max: 用 max + 1 替换缺失的数值。

    • new-under-min: 用 min - 1 替换缺失的数值。

    • remove: 删除缺失的数值。

默认情况下,分类值的策略是创建一个新的类别 (“-c new”) ,数字值的策略是使用平均值 (“-n mean”) 。

例如,使用example/metadata-settings.json、example/feature-stats.json和example/metadata.json对example/data.csv进行数据清洗,使用的策略是用最常见的类别替换分类值,用中位数替换数字值,运行以下命令:

silas sanitise -c most-common -n median example/metadata-settings.json example/feature-stats.json example/metadata.json example/data.csv