Python机器学习classsifying入门

Python机器学习classsifying入门

今天一起来了解一下机器学习的classifying,你或许在日常生活中已经在使用这个技术了,even if you were not aware of it。
如果你有电子邮箱,邮件系统会自动的把一些垃圾邮件,广告邮件,归到垃圾箱里面。这就是一种机器学习形式,系统自动把邮件分类称为两类:1)spam 2)not-spam.

世界很复杂,但我们先用一些很简单容易理解的数据集来帮助我们学习。
这里抛出一个问题:机器能够根据花的图片来分辨花的种类吗?
我们先自己写程序分辨分辨,如果需要的话,我们就使用scikit-learn这个库。

Iris 数据集

Iris数据集最早的用于统计聚类的一个数据集,它包含了很多Iris科目的花儿的形态方面的计量数据。
这些形态数据可以让我们辨别它们的种类。
现在,花儿的物种可以直接用DNA鉴别。但我们的主题设定不是classfying么,别捣乱了。

底下四种属性被测量了。
* 花萼长度
* 花萼宽度
* 花瓣长度
* 花瓣宽度
通常我们把这种独立的测量数据叫做“特征”。很显然这个数据集有四个特征。
我们想解决的是,有了这些已知数据,如果给我们一支花儿,我们能知道它的种类吗?

画画图看看

我们来看看数据集里有什么

[‘sepal length (cm)’,
‘sepal width (cm)’,
‘petal length (cm)’,
‘petal width (cm)’]

先看看feature_names,含我们刚才的四个特征

array([‘setosa’, ‘versicolor’, ‘virginica’],
dtype=’|S10′)
有三种花儿。setosa,versicolor,virginica

先画出features 0,1 也就是花萼长,花萼宽,然后setosa这种花用三角形表示,versicolor用圆形表示,virginica用X表示。
1

再画出features 2,3也就是花瓣长、花瓣高。同样,setosa这种花用三角形表示,versicolor用圆形表示,virginica用X表示。
2

如果目的知识区分这三类花(setosa,versicolor,virginica),那我们感觉很简单。比如花瓣长度很容易就区分了setosa这种花。
一点点代码就知道怎么区分了。

1.8999999999999999

3.0
很明显了,如果花瓣长度小于2,那就是setosa花,否则起就是其他的花。
这里我们没使用机器学习就知道怎么区分一些花儿了,我们人为的到找了区分setosa花的方法。
很快我们发现区分另外两种花很费劲了,找不到一个简单的临界值。或者根本不可能找到很完美的区分方法。
因为你看上图圆点和叉叉都混在一起。

我们还是努力试试。

还是用刚才我们那个boolean 数组,用numpy的特性,获得剔除了setosa的子集。

这段代码并不是那么费解,我们用feature的值挨个儿判断是不是最好的临界值(threshould).
pred=(feature_i>t)获得我们的猜想结果数组,然后与真实的~is_virginica比较。发现(pred==~is_virginica)数组的均值小一些,
我们就认为是更好的结果。当然我们只判断了大于的方向,所以需要用reserse这个变量存储方向。
best_t=4.9,best_fi=0存储了我们想要的结果,也就是用哪个特征,哪个临界值,可以区别这两种花,也称判定边界
如下图,我在4.9的地方画了一个横线,大致能区别出两种花。

3

这样的代码得到的结果很理想,但也有瑕疵,有几个点判断错了,总体准确度为94%.这个评价可能过度乐观,我们用的还是老数据集,没有见识到新花儿。
我们还是希望我们建立的模型可以有能力识别新数据。
我们把刚才的数据集分成两部分,一部分用刚才的代码来训练并获得我们的临界值(threshould)我们叫他训练数据,另一部分用来测试(相当于新数据了)我们叫他测试数据。
代码就是上面的代码改改,略过代码,结果出来了:
训练数据准确度:96%
测试数据准确度:90%
总有一些点会出现在临界值左边或右边,从而导致准确度下降。

这是个简单的数据集,但碰到复杂的数据集的时候,真实情况是,有可能你训练数据集的时候可以100%准确,但testing新数据的时候会错的一塌糊涂!
因为这个逻辑有点绕,对训练的数据集来进行准确测试,肯定是准确度要高。

估量模型的准确度

我们希望更多的数据来训练,也需要有更多的数据来验证我们的准确性。理想状况最好是全部数据都来训练,也可以来做验证准确度,但这又不可能。
这个问题很严重,但我们可以用一种方法做一个比较好的估计,叫做cross-validation交叉校验。
最简单的方法就是leave-one-out cross-validation 顾名思义总留一个做准确度测试。对数据集的所有元素都会留一次,重复这种校验。

Accuracy:87.0%

这个上面代码实现了leave-one-out交叉检验,现在我们可以相信这个准确度数据了,因为我们对每个元素挨个儿测试过,并且试验的时候这个元素并不在我们的训练集合里面。
新问题来了,数据量大的时候这样很费劲。另一种交叉检验方法是k-fold cross validation,顾名思义,把数据集分成多个集合,
例如下图示例把数据集分成三部分,轮流train,testing

4

一般实践中,5-fold cross validation 是一个折中的选择。