脑门大的女生Scikit-LearnTensorFlow机器学习实⽤指南(四):分类【上】
机器学习实⽤指南(四):分类【上】
作者:LeonG
本⽂参考⾃:《Hands-On Machine Learning with Scikit-Learn & TensorFlow 机器学习实⽤指南》,感谢中⽂AI社区提供翻译。
本⽂全部代码和数据集保存在我的github-----
机器学习的监督学习任务中最常见的任务是回归(⽤于预测某个值)和分类(预测某个类别)。
在这⼀章,我们重点来学习分类任务。
Scikit-Learn包是⼀个集成了⼤部分机器学习经典算法的python库,它可以帮助我们快速上⼿机器学习的众多应⽤。
注意:本项⽬主要使⽤Jupyter Notebook进⾏开发,Jupyter Notebook是⼀个简便易上⼿的python⼯作环境,源代码请使⽤Jupyter Notebook打开。
1.MINIST数据集
1.1下载数据集
⾸先给⼤家介绍⼀下机器学习的经典数据集–MNIST,它是拥有70000张⼿写数字图⽚的数据集合。这个数据集经典程度相当于机器学习领域的“Hello World”。
from sklearn.datats import fetch_mldata
借款模板
#先将mnist数据集下载到项⽬⽬录(./mldata/mnist-original.mat)
#下载地址:/amplab/datascience-sp14/raw/master/lab7/mldata/mnist-original.mat
金鸡奖吧mnist = fetch_mldata('MNIST Original',data_home='./')
mnist
历史人物作文介绍⼀下这三个标签的意义:
DESCR键描述数据集
target键存放⼀个标签数组
data键存放⼀个图⽚数组,数组的⼀⾏表⽰⼀个样例,也就是⼀张图⽚
然后看看这个数据集的结构,主要是查看维度
x,y = mnist["data"],mnist["target"]
x.shape
y.shape
现在我们总结⼀下MNIST数据集的特点:
MNIST有70000张图⽚,众所周知,图⽚是由像素点构成的。
784意味着每张图⽚拥有784个像素点,这是因为每张图⽚都是28*28像素的,且每个像素点都介于0~255之间。
象山松兰山target标签表⽰对应位置的图⽚是什么数字。
我相信每个接触到MNIST数据集的⼈都迫不及待地想看⼀下图⽚是什么样⼦了,说实话我也是(搓⼿⼿),让我们随便展⽰⼀张图⽚。
import matplotlib
from matplotlib import pyplot as plt
some_digit = x[36000]#第36001张图⽚
img = shape(28,28)#还原成28*28的结构
plt.imshow(img,cmap = binary, interpolation="nearest")
plt.show()
y[36000]#顺便看⼀下标签
哟,不错,整挺好,可以看到图⽚上的数字和标签正好对应起来了,有了这样⼀个利器,我们就能慢慢揭开机器学习分类任务的神秘⾯纱了。
1.1划分训练集
少侠稍安勿躁,在进⾏下⼀步之前,我们总是要先将数据集分为训练集和测试集两个部分,最好还能打乱⼀下顺序,因为有的算法对顺序的敏感度很⾼。
1. 把前60000条化为训练集,后10000条归为测试集
2. 打乱训练集的顺序,测试集的顺序mnist已经帮我们打乱好了
#分割数据集
x_train,x_test,y_train,y_test = x[:60000],x[60000:],y[:60000],y[60000:]
#打乱训练集
import numpy as np
shuffie_index = np.random.permutation(60000)
x_train,y_train = x_train[shuffie_index],y_train[shuffie_index]
接下来正式开始学习分类任务。
2.训练⼀个⼆分类器
鲁迅曾经说过:学⾛先学爬(鲁迅:我没说过),多分类属于⽐较⾼级的分类任务,我们先做个简单的,⽐如鉴定⼀张图⽚是否是数字5
这个“数字 5 检测器”就是⼀个⼆分类器,能够识别两个类,“是5”和“⾮5”。让我们为这个分类任务创建新的标签,也就是将所有数字标签转为是和否两种标签(bool类型)真人交配
y_train_5 =(y_train ==5)#训练集的标签
y_test_5 =(y_test ==5)#测试集的标签
接下来就是选择⼀个分类器了,给⼤家介绍⼀下本次的主⾓SGD(随机梯度下降分类器)。其实随机梯度下降分类器并不是⼀个独⽴的算法,⽽是⼀系列利⽤随机梯度下降求解参数的算法集合。
这个分类器默认⽤的算法是SVM(线性⽀持向量机),既然是线性的,⾃然就适合⼆分类⽅法,毕竟⾮⿊即⽩嘛。⽽且该分类器的好处是处理⼤量数据时⾮常⾼效,让我们先创建⼀个SGDClassifier分类器然后训练⼀遍。
from sklearn.linear_model import SGDClassifier
sgd_clf = SGDClassifier(random_state=42)
叶范涛
sgd_clf.fit(x_train,y_train_5)#训练分类器
这⾥的代码很常⽤所以解释⼀下,⾸先调⽤SGDClassifier函数新建了⼀个分类器,随机种⼦设为42,算法中需要的参数都是按照某种⽅式随机⽣成的,然后调⽤fit训练函数,输⼊训练数据,通过梯度下降法训练参数,最后得到的sgd_clf是训练好的分类器
现在随便测试⼀张图⽚:
sgd_clf.predict(X[36000])
array([ True], dtype=bool)
分类器猜测这个数字代表 5( True )。看起来在这个例⼦当中,它猜对了。现在让我们评估 这个模型的性能。
3.评估性能
下沉式卫生间⾸先我们应该使⽤交叉验证法,具体原理参考上⼀章中提到的K这交叉验证法。在这⾥我们只管调⽤函数 cross_val_score就好了。
K = 3意味着将把训练集分成3折,使⽤其他折进⾏训练,剩下的折⽤于测试精确度。
del_lection import cross_val_score
#cv代表折数,scoring为计算⽅式,这⾥计算精准度
cross_val_score(sgd_clf,x_train,y_train_5,cv =3,scoring="accuracy")
array([ 0.9502 , 0.96565, 0.96495]
看起来准确率⾮常⾼,但是并不是这样的,想象⼀下,假如你全猜“⾮5”,准确率依然有90%!这是因为图⽚5的数量太少了,只占总数据的⼗分之⼀。所以准确率并不能很好的表达模型的精度。
那怎么样才能判断模型的精准度呢,现在我们打开新世界的⼤门。
3.1混淆矩阵
对于分类器来说,混淆矩阵是个不错的判断精度⼯具,什么是混淆矩阵呢?
⼤致的意思就是类别A被判断为B的次数,我们做⼀个简单的表格就能看懂了,其中加粗的对⾓线就是正确分类的数量。
⾸先,我们使⽤K折交叉验证得出⼀系列的预测,也就是模型得出的预测值。使⽤函数cross_val_predict,注意,有别于上⾯提到的
cross_val_score,那个是分数,这个是预测值,然后使⽤函数confusion_matrix得到混淆矩阵,是不是很简单?
del_lection import cross_val_predict
#计算预测值
y_train_pred = cross_val_predict(sgd_clf,x_train,y_train_5,cv =3)
ics import confusion_matrix
#计算混淆矩阵
confusion_matrix(y_train_5,y_train_pred)
array([[53887, 692],
[ 1279, 4142]], dtype=int64)
来,总结⼀下这个矩阵中四个值代表的意义:(正例:是5,反例:⾮5)
53887:代号TN,全名true negative,真反例,就是反例分对了的意思。
1279:代号FN,全名fal negative,假反例,就是错分为反例的意思。
692:代号FP,全名fasle positive,假正例,就是错分为正例的意思。
4142:代号TP,全名true positive,真正例,就是正例分对了的意思。
好了,我不是有意要绕晕你的,如果你没看懂,直接看图啦