先来上例子吧,让我们来感受一下什么是机器学习。
我们先给出一批数据,它们长这样:
x,y
1,2
2,4
3,6
4,8
……
此时,我们希望你能预测一下,当x是1万时,y的值。如果你具备初中以上的数学知识,聪明的你可能已经能给出答案了。是的,结果是2万。
至少在这个层面,你已经超越了机器。因为你只需要看几秒,就能给出非常靠谱的预测值。这是一个非常好的开端,证明你完全具备搞定机器学习的能力。机器在看到这一堆数字时,它是无法预测出y的值的,因为它看不懂,它需要给它指明一个算法,然后它才能通过算法去不断的尝试、去逼近那个正确的解。
此时,我们暂且可以将机器学习理解为,我们给定一批数据和结果,机器从中通过算法运算,得到一个模型(model),这个model将在未来你次给出之前未知的数据时,机器将返回给你一个正确或者相对靠谱的结果。
我们是怎么知道从那么一批数据中,预测出x为1万时,y是2万呢?因为我们心中有一个方程,y=2*x。这个方程就是model,可以看到这是一个线性方程,它的分布完全或近乎都在一条直线上。通过我们博学的知识,知道它是一个一元一次方程,当然这个方程比较简单,后续我们会碰到N元N次的。
机器学习的过程,就是通过数据来算出方程的过程。
下面我们就来开启机器学习之旅。
在这个地址下载对应操作系统的weka版本,目前是3.8.2,如果你电脑已经有java环境了,就下载那个小的,如果没有,就下载那个大的。
安装后打开它,你可以使用java -jar weka.jar来打开,它长这个样子:
点击explorer
我们先来创建一个数据集合,创建一个csv文件,譬如a.csv
里面内容是这样的:
x,y
1,2
2,4
3,6
4,8
5,10
注意第一行是列名,必须要有。
点击open file找到a.csv
打开后是这样
比较重要的地方我都用箭头指出来了。
左上部分有这个数据集的基础属性,attributes有2个,即x,y两个属性。Instances为5,代表共5行5条数据。
当点击x、y时,右边的Selected attribute里面会显示该属性的一些统计信息。Type:Numeric代表类型是数字,还有一个Type是Nominal代表是分类,主要就这两种Type最常用。这个很好理解,一个属性要么是分类,譬如红、黄、蓝是固定的几个中的一个,不会无限多;要么是数字,譬如1,2,3,4,5。Missing代表缺失的值,譬如一共有5行,而y值缺了2个,就会显示在这里。Distinct代表不重复的数量,Unique代表唯一的值的百分率。
它的下面是一些统计值,有平均值,最大最小等,可以有个直观的观察。
下面的Class:y,这个Class代表结果,一般默认是最后一个属性是结果。如果我们希望程序根据x计算y的值,那么class就是y。如果希望是通过别的属性来预测某个属性的值,就设置哪个属性为class。
左下有个remove,可以在选中某个属性后,将它删掉。有时我们的数据集中会有id这种没意义的字段,就需要删掉。
右上角有个save,譬如你对数据集做了一些处理,可以将处理后的数据save一下,就成了新的数据集。如果使用的是csv文件,也最好save一下,保存为weka默认的数据格式arff。
OK!
到这里,我们的数据不需要处理,但是由于是csv文件,我们还是来save一下,保存为arff。后续再来解释这个文件的格式。
@relation a @attribute x numeric @attribute y numeric @data 1,2 2,4 3,6 4,8 5,10
然后再重新open file,选择这个arff文件。
然后我们就要对数据进行算法分析了,选择上面的Classify。
点击Choose,里面有很多的算法,逻辑回归、线性回归、决策树、随机森林、贝叶斯等等各种机器学习常用的算法可供选择。
不同的场合我们会选择不同的算法来训练数据,不同的算法之间的结果差距很大。
这里我们选择线性回归
在Test options里,有多个选项。
use training set代表就使用你当前提供的全部数据作为训练数据。
supplier test set等会再说。
Cross-validation 10代表使用提供的数据做10次交叉验证。做法就是将一份数据集首先进行随机打散,然后均分成10份,再把其中的每一份拿出来作为测试样本,其余的9份作为训练样本,这样就会得到10个训练样本和10个测试样本。最后输出平均值。这个也是常见的用法。
Percentage split代表取一定的百分比用来训练。
这里由于我们的数据集很少,选择使用全部,Use training set。
下面的下拉框,是选择用哪个属性作为结果,也就是y=2*x,那么计算最终的方程就是2 *。如果选了x,那结果就是x=y/2。
一切就绪,点击start。
Classifier model里可以看到训练的结果,y = 2 * x + 0,这就是得到的模型model。
Summary摘要里,可以看到Correlation coefficient(相关系数) 为1,相关系数是用以反映变量之间相关关系密切程度的统计指标。下面的误差全部为0,说明全部正确。
此时我们已经完成了机器学习的第一步,根据数据训练得到了我们的第一个模型,以后用这个模型就可以预测别的数据了。
在这里右键,我们可以save model,保存这个模型。将来就可以反复使用这个模型了,要知道机器学习的最终目的就是为了得到一个模型,这个模型能完成预测任务。
OK,我们已经有了自己的模型,下面就要使用它为我们做未知数据的预测了。
我们再创建一个a-test.csv
x,y 6,12 7,14 8,15
然后拿这个测试集去看看模型的预测结果。你可能会问,为毛测试集里y也有值,没事,如果不想有值的话可以用?代替。我有值,是想看看模型能不能给出测试集的错误率。
在Test options里选择 supplier test set,选择a-test.csv。
在刚才的model右键
选择再次验证模型,使用test set。点击它。
=== Summary === Correlation coefficient 0.982 Mean absolute error 0.3333 Root mean squared error 0.5774 Total Number of Instances 3
可以看到结果,我们的测试集有一个数据结果是错的。
关于这个结果各指标的解释,看这篇。大概意思是,mean……代表平均相对误差,值越小代表误差越小。
然后我们想看看机器给出的预测结果是什么,还是在模型上右键,选择Visualize classifier errors
点击save,就得到了机器的预测结果。
@relation a_predicted @attribute x numeric @attribute predictedy numeric @attribute y numeric @data 6,12,12 7,14,14 8,16,15最后一列是测试集的原值,倒数第二列就是机器给的预测值,可以看到机器给的值都是对的,我们测试集里的15是错的。
这就是最简单的线性回归第一课了。