这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

分类算法

分类是一种重要且流行的机器学习工具,可将数据集中的项分配给不同的类别。分类用于在欺诈检测、文本分类等方面预测随时间变化的风险。分类函数从具有不同的已知类别的数据集开始。例如,假设您想根据学生进入研究生院的可能性对他们进行分类。除了入学考试分数和等级等因素外,您还可以跟踪工作经验。

二进制分类意味着结果(本例中的结果为“录取情况”)只有两个可能的值:录取或不录取。多类结果有两个以上的值。例如,低、中或高录取机会。在训练过程中,分类算法查找结果和特征之间的关系。这种关系在模型中进行了总结,然后可以应用到类别未知的不同数据集。

1 - 逻辑回归

使用逻辑回归,您可以模拟独立变量之间的关系或功能,以及一些相关变量或结果。逻辑回归的结果始终是二进制值。

您可以构建逻辑回归模型:

  • 将预测模型拟合到独立变量和一些二进制变量的训练数据集。通过这种方法,您可以对结果进行预测,例如判断一个电子邮件是否是垃圾邮件。

  • 确定一个独立变量和一些二进制结果变量之间的关系强度。例如,假设您想要确定一个电子邮件是否是垃圾邮件。您可以基于对电子邮件属性的观测值来构建逻辑回归模型。然后,您可以确定电子邮件的各种属性对该结果的重要性。

您可以使用下列函数构建逻辑回归模型、查看模型,并使用该模型对一组测试数据进行预测:

有关如何在 Vertica 表中使用逻辑回归的完整编程实例,请参阅构建逻辑回归模型

1.1 - 构建逻辑回归模型

该逻辑回归示例使用了名为 mtcars 的小数据集。该示例展示了如何构建预测 am 值的模型(表示汽车是自动档还是手动档)。使用数据集中所有其他特征给定的值。

在该示例中,使用约 60% 的数据作为样本数据来创建模型。余下 40% 的数据用于针对测试逻辑回归模型的测试数据。

开始示例之前,请加载机器学习示例数据
  1. 使用 mtcars_train 训练数据创建名为 logistic_reg_mtcars 的逻辑回归模型。

    => SELECT LOGISTIC_REG('logistic_reg_mtcars', 'mtcars_train', 'am', 'cyl, wt'
       USING PARAMETERS exclude_columns='hp');
            LOGISTIC_REG
    ----------------------------
     Finished in 15 iterations
    
    (1 row)
    
  2. 查看 logistic_reg_mtcars 的摘要输出。

    
    => SELECT GET_MODEL_SUMMARY(USING PARAMETERS model_name='logistic_reg_mtcars');
    --------------------------------------------------------------------------------
    =======
    details
    =======
    predictor|coefficient|  std_err  |z_value |p_value
    ---------+-----------+-----------+--------+--------
    Intercept| 262.39898 |44745.77338| 0.00586| 0.99532
    cyl      | 16.75892  |5987.23236 | 0.00280| 0.99777
    wt       |-119.92116 |17237.03154|-0.00696| 0.99445
    
    ==============
    regularization
    ==============
    type| lambda
    ----+--------
    none| 1.00000
    
    ===========
    call_string
    ===========
    logistic_reg('public.logistic_reg_mtcars', 'mtcars_train', '"am"', 'cyl, wt'
    USING PARAMETERS exclude_columns='hp', optimizer='newton', epsilon=1e-06,
    max_iterations=100, regularization='none', lambda=1)
    
    
    ===============
    Additional Info
    ===============
    Name              |Value
    ------------------+-----
    iteration_count   | 20
    rejected_row_count|  0
    accepted_row_count| 20
    (1 row)
    
  3. 创建名为 mtcars_predict_results 的表。使用通过在测试数据上运行 PREDICT_LOGISTIC_REG 函数获得的预测结果来填充表。在 mtcars_predict_results 表中查看结果。

    => CREATE TABLE mtcars_predict_results AS
       (SELECT car_model, am, PREDICT_LOGISTIC_REG(cyl, wt
       USING PARAMETERS model_name='logistic_reg_mtcars')
       AS Prediction FROM mtcars_test);
    CREATE TABLE
    
    
    => SELECT * FROM mtcars_predict_results;
       car_model    | am | Prediction
    ----------------+----+------------
     AMC Javelin    |  0 |          0
     Hornet 4 Drive |  0 |          0
     Maserati Bora  |  1 |          0
     Merc 280       |  0 |          0
     Merc 450SL     |  0 |          0
     Toyota Corona  |  0 |          1
     Volvo 142E     |  1 |          1
     Camaro Z28     |  0 |          0
     Datsun 710     |  1 |          1
     Honda Civic    |  1 |          1
     Porsche 914-2  |  1 |          1
     Valiant        |  0 |          0
    (12 rows)
    
  4. 使用 PREDICT_LOGISTIC_REG 评估函数来评估 CONFUSION_MATRIX 函数的准确性。

    => SELECT CONFUSION_MATRIX(obs::int, pred::int USING PARAMETERS num_classes=2) OVER()
       FROM (SELECT am AS obs, Prediction AS pred FROM mtcars_predict_results) AS prediction_output;
     class | 0 | 1 |                   comment
    -------+---+---+---------------------------------------------
         0 | 6 | 1 |
         1 | 1 | 4 | Of 12 rows, 12 were used and 0 were ignored
    (2 rows)
    

    在本例中,PREDICT_LOGISTIC_REG 正确预测在 1 列中值为 am 的五辆汽车中的四辆具有 1 值。在 0 列中值为 am 的七辆汽车中,正确预测了六辆具有值 0。将一辆汽车错误地分类为具有值 1

另请参阅

2 - 朴素贝叶斯

当可以假设特征独立时,您可以使用朴素贝叶斯算法对数据进行分类。该算法使用独立的特征来计算特定类的概率。例如,您可能想要预测电子邮件是垃圾邮件的概率。在该例中,您将使用与垃圾邮件相关的词库来计算电子邮件内容是垃圾邮件的概率。

您可以使用下列函数构建朴素贝叶斯模型、查看模型,并使用该模型对一组测试数据进行预测:

有关如何在 Vertica 中使用朴素贝叶斯算法的完整示例,请参阅使用朴素贝叶斯对数据进行分类

2.1 - 使用朴素贝叶斯对数据进行分类

该朴素贝叶斯示例使用 HouseVotes84 数据集向您展示如何构建模型。使用此模型,您可以根据投票记录预测美国国会议员隶属于哪个政党。为了帮助对已清理的数据进行分类,替换了所有缺投的投票。已清理的数据将缺投的投票替换为选民所在政党的大多数投票。例如,假设一名民主党成员未对 vote1 投票,而大多数民主党人投了赞成票。此示例将所有民主党人对 vote1 的缺投投票替换为赞成票。

在此示例中,大约 75% 的已清理 HouseVotes84 数据被随机选择并复制到训练表中。剩余的已清理 HouseVotes84 数据用作测试表。

开始示例之前,请加载机器学习示例数据

您还必须加载 naive_bayes_data_prepration.sql 脚本:

$ /opt/vertica/bin/vsql -d <name of your database> -f naive_bayes_data_preparation.sql
  1. 使用 house84_train 训练数据创建名为 naive_house84_model 的朴素贝叶斯模型。

    => SELECT NAIVE_BAYES('naive_house84_model', 'house84_train', 'party',
                          '*' USING PARAMETERS exclude_columns='party, id');
                      NAIVE_BAYES
    ------------------------------------------------
     Finished. Accepted Rows: 315  Rejected Rows: 0
    (1 row)
    
  2. 创建名为 predicted_party_naive 的新表。使用从测试数据上的 PREDICT_NAIVE_BAYES 函数得到的预测结果来填充此表。

    => CREATE TABLE predicted_party_naive
         AS SELECT party,
              PREDICT_NAIVE_BAYES (vote1, vote2, vote3, vote4, vote5,
                                   vote6, vote7, vote8, vote9, vote10,
                                   vote11, vote12, vote13, vote14,
                                   vote15, vote16
                                     USING PARAMETERS model_name = 'naive_house84_model',
                                                      type = 'response') AS Predicted_Party
           FROM house84_test;
    CREATE TABLE
    
  3. 计算模型预测的准确性。

    
    => SELECT  (Predictions.Num_Correct_Predictions / Count.Total_Count) AS Percent_Accuracy
        FROM (  SELECT COUNT(Predicted_Party) AS Num_Correct_Predictions
            FROM predicted_party_naive
            WHERE party = Predicted_Party
             ) AS Predictions,
             (  SELECT COUNT(party) AS Total_Count
                   FROM predicted_party_naive
                ) AS Count;
       Percent_Accuracy
    ----------------------
     0.933333333333333333
    (1 row)
    

该模型根据国会议员的投票模式正确预测了他们的政党,准确率为 93%。

查看每个类别的概率

您还可以查看每个类的概率。使用 PREDICT_NAIVE_BAYES_CLASSES 查看每个类的概率。

=> SELECT PREDICT_NAIVE_BAYES_CLASSES (id, vote1, vote2, vote3, vote4, vote5,
                                       vote6, vote7, vote8, vote9, vote10,
                                       vote11, vote12, vote13, vote14,
                                       vote15, vote16
                                       USING PARAMETERS model_name = 'naive_house84_model',
                                                        key_columns = 'id', exclude_columns = 'id',
                                                        classes = 'democrat, republican')
        OVER() FROM house84_test;
 id  | Predicted  |    Probability    |       democrat       |      republican
-----+------------+-------------------+----------------------+----------------------
 368 | democrat   |                 1 |                    1 |                    0
 372 | democrat   |                 1 |                    1 |                    0
 374 | democrat   |                 1 |                    1 |                    0
 378 | republican | 0.999999962214987 | 3.77850125111219e-08 |    0.999999962214987
 384 | democrat   |                 1 |                    1 |                    0
 387 | democrat   |                 1 |                    1 |                    0
 406 | republican | 0.999999945980143 | 5.40198564592332e-08 |    0.999999945980143
 419 | democrat   |                 1 |                    1 |                    0
 421 | republican | 0.922808855631005 |   0.0771911443689949 |    0.922808855631005
.
.
.
(109 rows)

另请参阅

3 - 用于分类的随机森林

随机森林算法创建决策树的集成模型。每棵树都对随机选择的训练数据子集进行训练。

您可以使用下列函数训练随机森林模型,并使用该模型对一组测试数据进行预测:

有关如何在 Vertica 中使用随机森林算法的完整示例,请参阅使用随机森林对数据进行分类

3.1 - 使用随机森林对数据进行分类

该随机森林示例使用了一个名为 iris 的数据集。该示例包含四个变量,用于测量 iris 花的各个部分以预测其种属。

在开始该示例之前,请确保您已按照下载机器学习示例数据中的步骤进行操作。

  1. 使用 RF_CLASSIFIERiris 数据创建名为 rf_iris 的随机森林模型。使用 GET_MODEL_SUMMARY 查看模型的摘要输出:

    => SELECT RF_CLASSIFIER ('rf_iris', 'iris', 'Species', 'Sepal_Length, Sepal_Width, Petal_Length, Petal_Width'
    USING PARAMETERS ntree=100, sampling_size=0.5);
    
    
            RF_CLASSIFIER
    ----------------------------
    Finished training
    
    (1 row)
    
    
    => SELECT GET_MODEL_SUMMARY(USING PARAMETERS model_name='rf_iris');
    ------------------------------------------------------------------------
    ===========
    call_string
    ===========
    SELECT rf_classifier('public.rf_iris', 'iris', '"species"', 'Sepal_Length, Sepal_Width, Petal_Length,
    Petal_Width' USING PARAMETERS exclude_columns='', ntree=100, mtry=2, sampling_size=0.5, max_depth=5,
    max_breadth=32, min_leaf_size=1, min_info_gain=0, nbins=32);
    
    =======
    details
    =======
    predictor   |type
    ------------+-----
    sepal_length|float
    sepal_width |float
    petal_length|float
    petal_width |float
    
    ===============
    Additional Info
    ===============
    Name              |Value
    ------------------+-----
    tree_count        | 100
    rejected_row_count|  0
    accepted_row_count| 150
    (1 row)
    
  2. 使用 PREDICT_RF_CLASSIFIER 将分类器应用于测试数据:

    => SELECT PREDICT_RF_CLASSIFIER (Sepal_Length, Sepal_Width, Petal_Length, Petal_Width
                                      USING PARAMETERS model_name='rf_iris') FROM iris1;
    
    PREDICT_RF_CLASSIFIER
    -----------------------
    setosa
    setosa
    setosa
    .
    .
    .
    versicolor
    versicolor
    versicolor
    .
    .
    .
    virginica
    virginica
    virginica
    .
    .
    .
    (90 rows)
    
  3. 使用 PREDICT_RF_CLASSIFIER_CLASSES 查看每个类的概率:

    => SELECT PREDICT_RF_CLASSIFIER_CLASSES(Sepal_Length, Sepal_Width, Petal_Length, Petal_Width
                                   USING PARAMETERS model_name='rf_iris') OVER () FROM iris1;
    predicted  |    probability
    -----------+-------------------
    setosa     |                 1
    setosa     |                 1
    setosa     |                 1
    setosa     |                 1
    setosa     |                 1
    setosa     |                 1
    setosa     |                 1
    setosa     |                 1
    setosa     |                 1
    setosa     |                 1
    setosa     |              0.99
    .
    .
    .
    (90 rows)
    

4 - 用于分类的 SVM(支持向量机)

支持向量机 (SVM) 是一种分类算法,它根据训练数据将数据分配到一个类别或另一个类别。该算法实施了可高度扩展的线性 SVM。

您可以使用下列函数训练 SVM 模型,并使用该模型对一组测试数据进行预测:

您还可以使用以下评估函数来获得进一步的见解:

有关如何在 Vertica 中使用 SVM 算法的完整示例,请参阅使用 SVM(支持向量机)对数据进行分类

Vertica 中 SVM 算法的实施基于论文 Distributed Newton Methods for Regularized Logistic Regression(正则逻辑回归的分布式牛顿法)。

4.1 - 使用 SVM(支持向量机)对数据进行分类

该 SVM 示例使用名为 mtcars 的小数据集。该示例展示了如何使用 SVM_CLASSIFIER 函数训练模型以使用 PREDICT_SVM_CLASSIFIER 函数预测 am 的值(挡位类型,其中 0 = 自动挡,1 = 手动挡)。

开始示例之前,请加载机器学习示例数据
  1. 使用 mtcars_train 训练数据创建名为 svm_class 的 SVM 模型。

    
    => SELECT SVM_CLASSIFIER('svm_class', 'mtcars_train', 'am', 'cyl, mpg, wt, hp, gear'
                              USING PARAMETERS exclude_columns='gear');
    
    SVM_CLASSIFIER
    
    ----------------------------------------------------------------
    Finished in 12 iterations.
    Accepted Rows: 20  Rejected Rows: 0
    (1 row)
    
  2. 查看 svm_class 的摘要输出。

    
    => SELECT GET_MODEL_SUMMARY(USING PARAMETERS model_name='svm_class');
    ------------------------------------------------------------------------
    
    =======
    details
    =======
    predictor|coefficient
    ---------+-----------
    Intercept| -0.02006
    cyl      |  0.15367
    mpg      |  0.15698
    wt       | -1.78157
    hp       |  0.00957
    
    ===========
    call_string
    ===========
    SELECT svm_classifier('public.svm_class', 'mtcars_train', '"am"', 'cyl, mpg, wt, hp, gear'
    USING PARAMETERS exclude_columns='gear', C=1, max_iterations=100, epsilon=0.001);
    
    ===============
    Additional Info
    ===============
    Name              |Value
    ------------------+-----
    accepted_row_count| 20
    rejected_row_count|  0
    iteration_count   | 12
    (1 row)
    
  3. 创建名为 svm_mtcars_predict 的新表。使用通过在测试数据上运行 PREDICT_SVM_CLASSIFIER 函数获得的预测结果来填充表。

    => CREATE TABLE svm_mtcars_predict AS
       (SELECT car_model, am, PREDICT_SVM_CLASSIFIER(cyl, mpg, wt, hp
                                                USING PARAMETERS model_name='svm_class')
                                                AS Prediction FROM mtcars_test);
    CREATE TABLE
    
  4. svm_mtcars_predict 表中查看结果。

    => SELECT * FROM svm_mtcars_predict;
    car_model     | am | Prediction
    ------------- +----+------------
    
    Toyota Corona |  0 |          1
    Camaro Z28    |  0 |          0
    Datsun 710    |  1 |          1
    Valiant       |  0 |          0
    Volvo 142E    |  1 |          1
    AMC Javelin   |  0 |          0
    Honda Civic   |  1 |          1
    Hornet 4 Drive|  0 |          0
    Maserati Bora |  1 |          1
    Merc 280      |  0 |          0
    Merc 450SL    |  0 |          0
    Porsche 914-2 |  1 |          1
    (12 rows)
    
  5. 使用 PREDICT_SVM_CLASSIFIER 评估函数来评估 CONFUSION_MATRIX 函数的准确性。

    => SELECT CONFUSION_MATRIX(obs::int, pred::int USING PARAMETERS num_classes=2) OVER()
            FROM (SELECT am AS obs, Prediction AS pred FROM svm_mtcars_predict) AS prediction_output;
     class | 0 | 1 |                   comment
    -------+---+---+---------------------------------------------
         0 | 6 | 1 |
         1 | 0 | 5 | Of 12 rows, 12 were used and 0 were ignored
    (2 rows)
    

    在本例中,PREDICT_SVM_CLASSIFIER 正确预测在 am 列中值为 1 的汽车具有 1 值。没有汽车被错误分类。在 0 列中值为 am 的七辆汽车中,正确预测了六辆具有值 0。将一辆汽车错误地分类为具有值 1

另请参阅

5 - XGBoost 用于分类

XGBoost (eXtreme Gradient Boosting) 是一种很受欢迎的监督式学习算法,用于对大型数据集进行回归和分类。它使用顺序构建的浅层决策树来提供准确的结果和高度可扩展的定型方法,以避免过度拟合。

以下 XGBoost 函数使用分类模型创建和执行预测:

示例

此示例使用 "iris" 数据集(其中包含对花的各个部分的测量值),可用于预测其种属并创建 XGBoost 分类器模型来对每朵花的种属进行分类。

开始示例之前,请加载机器学习示例数据
  1. 使用 XGB_CLASSIFIERiris 数据集创建名为 xgb_iris 的 XGBoost 分类器模型。

    => SELECT XGB_CLASSIFIER ('xgb_iris', 'iris', 'Species', 'Sepal_Length, Sepal_Width, Petal_Length, Petal_Width'
        USING PARAMETERS max_ntree=10, max_depth=5, weight_reg=0.1, learning_rate=1);
     XGB_CLASSIFIER
    ----------------
     Finished
    (1 row)
    

    然后,您可以使用 GET_MODEL_SUMMARY 查看模型的摘要:

    
    => SELECT GET_MODEL_SUMMARY(USING PARAMETERS model_name='xgb_iris');
                                                                                                                                                                           GET_MODEL_SUMMARY
    ------------------------------------------------------
    ===========
    call_string
    ===========
    xgb_classifier('public.xgb_iris', 'iris', '"species"', 'Sepal_Length, Sepal_Width, Petal_Length, Petal_Width'
    USING PARAMETERS exclude_columns='', max_ntree=10, max_depth=5, nbins=32, objective=crossentropy,
    split_proposal_method=global, epsilon=0.001, learning_rate=1, min_split_loss=0, weight_reg=0.1, sampling_size=1)
    
    =======
    details
    =======
     predictor  |      type
    ------------+----------------
    sepal_length|float or numeric
    sepal_width |float or numeric
    petal_length|float or numeric
    petal_width |float or numeric
    
    
    ===============
    Additional Info
    ===============
           Name       |Value
    ------------------+-----
        tree_count    |  10
    rejected_row_count|  0
    accepted_row_count| 150
    
    (1 row)
    
  2. 使用 PREDICT_XGB_CLASSIFIER 将分类器应用于测试数据:

    => SELECT PREDICT_XGB_CLASSIFIER (Sepal_Length, Sepal_Width, Petal_Length, Petal_Width
        USING PARAMETERS model_name='xgb_iris') FROM iris1;
     PREDICT_XGB_CLASSIFIER
    ------------------------
     setosa
     setosa
     setosa
     .
     .
     .
     versicolor
     versicolor
     versicolor
     .
     .
     .
     virginica
     virginica
     virginica
     .
     .
     .
    
    (90 rows)
    
  3. 使用 PREDICT_XGB_CLASSIFIER_CLASSES 查看每个类的概率:

    => SELECT PREDICT_XGB_CLASSIFIER_CLASSES(Sepal_Length, Sepal_Width, Petal_Length, Petal_Width
        USING PARAMETERS model_name='xgb_iris') OVER (PARTITION BEST) FROM iris1;
      predicted  |    probability
    ------------+-------------------
     setosa     |   0.9999650465368
     setosa     |   0.9999650465368
     setosa     |   0.9999650465368
     setosa     |   0.9999650465368
     setosa     | 0.999911552783011
     setosa     |   0.9999650465368
     setosa     |   0.9999650465368
     setosa     |   0.9999650465368
     setosa     |   0.9999650465368
     setosa     |   0.9999650465368
     setosa     |   0.9999650465368
     setosa     |   0.9999650465368
     versicolor |  0.99991871763563
     .
     .
     .
    (90 rows)