首页 > 代码库 > 科学预测世界杯-采用机器学习方法
科学预测世界杯-采用机器学习方法
最近不管是在哪,世界杯永远是大家闲聊的话题。而随着互联网的发展,购买足彩越发便利和火爆了,体彩不像福彩,我们可以根据各个球队的情况做一些猜测。但作为一名看世界杯只记的住场边广告的伪球迷,也想凑热闹买一把,怎么才能保证在前面几次比赛的基础上,比较科学靠谱的预测比赛结果呢?做为一名略懂机器学习的伪球迷,当然要发挥学科的优势来凑凑热闹预测一下。
机器学习算法很多,我们分别实现了用SVM,神经网络,和KNN来预测。要用这些分类器首先要有训练和测试的数据,比赛进行到今天,我们已经积累了很多比赛的数据了,所以应用学习分类器是合理的。那我们应该怎么得到这些数据呢?
1.量化世界杯比赛结果和影响因素
比赛结果比较好量化,比如美国-德国,3代表美国赢,2代表打平,1代表美国输。
影响因素怎么选呢?一名伪球迷对各个队的历史,球员,教练是很难了解周全的,另外天气,球员心理状态,身体状态等等因素也是很难控制的,所以我们无法量化这些因素,而且这些信息也是很难获取的。于是一个比较合理而且简单的数据-赔率可以选用为量化了这些影响因素的综合数据。这个合不合理呢?我们知道一般赔率高的肯定胜率低,赔率低的胜率高,而赔率是怎么计算的呢?可以看这篇文章http://www.guokr.com/article/20199/了解。所以赔率和比赛胜负是相关的,通过赔率,我们可以做出比较好的判断。
2.准备训练测试数据
赔率和输赢这些数据很容易获取,比如在http://zx.500.com/jczq/kaijiang.php?playid=2&d=2014-06-26这里就可以得到平均欧赔和输赢。于是根据第一步整理好数据,训练的标签就是输赢量化后的结果,特征就是平均欧赔。而一般买彩票前平均欧赔都会提前公布的,这就是我们测试数据的特征,根据这些特征得到的预测标签就是比赛的结果。比如我们根据前几天的情况预测今天的结果。
3 1.29 5.05 11.133 1.43 4.24 8.08 1 1.83 3.33 4.75 3 2.18 3.11 3.553 2.58 3.13 2.791 2.69 2.97 2.88 1 1.42 4.17 8.36 3 1.82 3.24 4.933 1.34 5.05 8.85 3 1.28 5.35 11.12 3 2.37 3.12 3.131 2.42 3.25 2.92 2 4.19 3.32 1.94 3 2.01 3.43 3.712 1.86 3.47 4.32 2 1.32 5.19 9.26 3 1.35 4.85 8.91 1 5.39 3.80 1.64 1 1.56 4.27 5.54 1 12.92 6.39 1.21 2 2.27 3.28 3.19 3 3.58 3.55 2.02 3 2.04 3.38 3.651 5.52 3.95 1.60 1 4.57 3.49 1.81 1 1.52 4.04 6.59 3 4.20 3.51 1.87 1 1.30 5.45 9.20 3 1.13 8.36 19.992 4.45 3.77 1.75 1 2.42 3.21 3.00 3 2.12 3.29 3.55 1 2.62 3.31 2.66 2 1.12 8.53 19.89 3 2.55 3.38 2.69 1 7.51 4.91 1.39 3 3.78 3.48 1.97 1 3.46 3.57 2.05 2 4.32 3.80 1.78 1 2.53 3.31 2.762 5.21 3.96 1.63 1 7.22 4.37 1.44 3 2.12 3.45 3.45 1 8.49 3.99 1.45
上面是6-12到6-25的数据。根据这些过去的数据来训练模型
9.60000000000000 2.86000000000000 1.64000000000000
2.15000000000000 3.65000000000000 3.11000000000000
4.70000000000000 3.58000000000000 1.75000000000000
3.59000000000000 3.42000000000000 2.04000000000000
1.60000000000000 3.89000000000000 5.52000000000000
2.06000000000000 3.30000000000000 3.66000000000000
2.08000000000000 3.30000000000000 3.57000000000000
2.55000000000000 3.05000000000000 2.92000000000000
上面是今天(6.27,6.28,6.29)的赔率。根据这些现在的数据来预测这三天的情况。
3.测试分类器
首先我们采用的SVM分类器,利用LIBSVM工具箱可以很容易实现,当然为了使模型更加合理,在训练过程加了交叉验证,即在过去的数据里去拿一部分来训练一个模型,另一些数据来测试这个模型,然后取出使这个模型正确率最高的一些参数。在交叉验证过程大部分正确率都在50%左右,这说明赔率确实提供了一些信息,应该一般随机猜正确的概率是1/3(33.3%).
下面是这个过程的代码,要运行保证计算机上装好libsvm了。
% 数据提取load(‘worldcuptry.mat‘,‘worldcuptry‘);load(‘test.mat‘,‘test‘);train_histograms=worldcuptry(:,(2:4));test_histograms=test(:,(2:4));train_label=worldcuptry(:,1);test_label=test(:,1);% 选定训练集和测试集train_data=double(train_histograms);test_data=double(test_histograms);% 选择最佳的SVM参数c&g% 首先进行粗略选择: c&g 的变化范围是 2^(-10),2^(-9),...,2^(10)[bestacc,bestc,bestg] = SVMcgForClass(train_label,train_histograms,-10,10,-10,10);% 打印粗略选择结果disp(‘打印粗略选择结果‘);str = sprintf( ‘Best Cross Validation Accuracy = %g%% Best c = %g Best g = %g‘,bestacc,bestc,bestg);disp(str);% 根据粗略选择的结果图再进行精细选择: c 的变化范围是 2^(-2),2^(-1.5),...,2^(4), g 的变化范围是 2^(-4),2^(-3.5),...,2^(4),[bestacc,bestc,bestg] = SVMcgForClass(train_label,train_histograms,-2,4,-4,4,3,0.5,0.5,0.9);% 打印精细选择结果disp(‘打印精细选择结果‘);str = sprintf( ‘Best Cross Validation Accuracy = %g%% Best c = %g Best g = %g‘,bestacc,bestc,bestg);disp(str);% 利用最佳的参数进行SVM网络训练option = [‘-c ‘,num2str(bestc),‘ -g ‘,num2str(bestg)];% SVM网络训练model = svmtrain(train_label, train_data, option);%SVM网络预测[predict_label,accuracy,prob_estimates1] = svmpredict(test_label, test_data, model,‘-b 0‘);
最后得到的结果是
1
3
2
3
1
3
3
1
。说明我们成功预测了6.27的前三场比赛结果。
G组 美国 0 德国 1G组 葡萄牙 2
加纳 1H组 阿尔及利亚 1 俄罗斯 1H组 韩国 0 比利时 1
其次我们采用另外一种策略KNN来看看结果
load(‘worldcuptry.mat‘,‘worldcuptry‘);load(‘test.mat‘,‘test‘);train_histograms=worldcuptry(:,(2:4));test_histograms=test(:,(2:4));train_label=worldcuptry(:,1);test_label=test(:,1);% 选定训练集和测试集train_data=double(train_histograms);test_data=double(test_histograms);mdl =ClassificationKNN.fit(train_data,train_label,‘NumNeighbors‘,1); %训练生成一个模型-1NNpredict_label= predict(mdl,test_data);
结果为:
1
2
1
3
1
3
3
3
和SVM相差不大。
最后我们用神经网络来看看结果
clc;clear all;close all;load(‘worldcuptry.mat‘,‘worldcuptry‘);load(‘test.mat‘,‘test‘);train_histograms=worldcuptry(:,(2:4));test_histograms=test(:,(2:4));train_label=worldcuptry(:,1);test_label=test(:,1);% 选定训练集和测试集train_data=double(train_histograms);test_data=double(test_histograms);ann_train_label=zeros(3,length(train_label));for i=1:length(train_label) if train_label(i)==3 ann_train_label(3,i)=1; elseif train_label(i)==2 ann_train_label(2,i)=1; elseif train_label(i)==1 ann_train_label(1,i)=1; endendann_test_label=zeros(3,length(test_label));for i=1:length(test_label) if test_label(i)==3 ann_test_label(3,i)=1; elseif test_label(i)==2 ann_test_label(2,i)=1; elseif test_label(i)==1 ann_test_label(1,i)=1; endend%======BP神经网络创建,训练和测试==========================%net=network_train(train_data‘,ann_train_label);predict_label=network_test(test_data‘,net);function net = network_train(charvec1,label )%从1到tn间随机排序(在[0,1]之间产生b个随机数),将数据顺序打乱[~,b]=size(charvec1);k=rand(1,b);[~,n]=sort(k);%随机提取b个样本为训练样本,个样本为预测样本input=charvec1;output =label;input_train=input(:,n(1:b));output_train=output(:,n(1:b));% BP网络训练% %初始化网络结构net=newff(input_train,output_train,3);net.trainParam.epochs=60;net.trainParam.lr=0.1;net.trainParam.goal=0.001;% net.trainFcn=‘trainrp‘;%网络训练net=train(net,input_train,output_train);save(‘network.mat‘,‘net‘)endfunction out = network_test(charvec,net)input_test=charvec;[a,b]=size(charvec);% BP网络预测an=sim(net,input_test);for i=1:b an1(i)=find(an(:,i)==max(an(:,i))); endend
结果为:1 3 2 1 3 3 3 3
预测6.27全对!!!!
今天过了,让我们预测下6.28,6.29的情况
SVM的结果:
1
3
3
1
KNN的结果:
1
3
3
3
ANN的结果:
3
3
3
3
明天见分晓。