使用Go 机器学习库来进行数据分析 3 (平均感知器)

目录 [−]

  1. 1984美国国会投票记录数据集
  2. 平均感知器
  3. 代码
  4. 评估结果

这一次,我们使用平均感知器(Average Perceptron)算法来预测美国国会的投票。

1984美国国会投票记录数据集

这一次,我们使用1984美国国会的投票记录来预测一下投票结果。

数据集针对不同的投票议题分为了16类, 记录了民主党和共和党议员们得投票结果。

格式如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
v16,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13,v14,v15,party
1,-1,1,-1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,republican
-1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican
-1,-1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,democrat
1,-1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,1,-1,-1,democrat
1,1,1,1,-1,1,1,-1,-1,-1,-1,1,-1,1,1,1,democrat
1,-1,1,1,-1,1,1,-1,-1,-1,-1,-1,-1,1,1,1,democrat
1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,democrat
1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,-1,1,1,-1,republican
1,-1,1,-1,1,1,1,-1,-1,-1,-1,-1,1,1,1,-1,republican
-1,1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,-1,-1,-1,democrat
-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,1,1,-1,republican
-1,-1,1,-1,1,1,1,-1,-1,-1,-1,1,-1,1,1,-1,republican
......

这一次,我们还是将数据集分为训练数据和测试数据,以评估算法的预测结果的准确性。

平均感知器

感知器算法一个监督学习的二分分类器, 是线性分类器的一种。

感知机算法是非常好的二分类算法,该算法求取一个分离超平面,超平面由w参数化并用来预测,对于一个样本x,感知机算法通过计算y = [w,x]预测样本的标签,最终的预测标签通过计算sign(y)来实现。算法仅在预测错误时修正权值w。
平均感知机和感知机算法的训练方法一样,不同的是每次训练样本xi后,保留先前训练的权值,训练结束后平均所有权值。最终用平均权值作为最终判别准则的权值。参数平均化可以克服由于学习速率过大所引起的训练过程中出现的震荡现象。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package main
import (
"fmt"
base "github.com/sjwhitworth/golearn/base"
evaluation "github.com/sjwhitworth/golearn/evaluation"
perceptron "github.com/sjwhitworth/golearn/perceptron"
"math/rand"
)
func main() {
rand.Seed(4402201)
rawData, err := base.ParseCSVToInstances("../datasets/house-votes-84.csv", true)
if err != nil {
panic(err)
}
//Initialises a new AveragePerceptron classifier
cls := perceptron.NewAveragePerceptron(10, 1.2, 0.5, 0.3)
//Do a training-test split
trainData, testData := base.InstancesTrainTestSplit(rawData, 0.50)
fmt.Println(trainData)
fmt.Println(testData)
cls.Fit(trainData)
predictions := cls.Predict(testData)
// Prints precision/recall metrics
confusionMat, _ := evaluation.GetConfusionMatrix(testData, predictions)
fmt.Println(evaluation.GetSummary(confusionMat))
}

首先读入国会投票数据集。

然后创建平均感知器算法实例。

之后将数据集分为两份,一份训练数据,一份用来预测和评估。

最后将评估结果打印。

评估结果

1
2
3
4
5
Reference Class True Positives False Positives True Negatives Precision Recall F1 Score
--------------- -------------- --------------- -------------- --------- ------ --------
democrat 98 24 70 0.8033 0.6806 0.7368
republican 70 46 98 0.6034 0.7447 0.6667
Overall accuracy: 0.7059