机器学习之MNIST——⼿写体Mnist 数据集中10个字符(0-9)的分类识别
python 练习
⽬录
1、整体理解“查准率”、“查全率”、“F1-Score”、“ROC”、“混淆矩阵”的定义。
名词定义
查准
率查准率(Precision)(精度)是衡量某⼀检索系统的信号噪声⽐的⼀种指标,即检出的相关⽂献与检出的全部⽂献的百分⽐。普遍表⽰为:查全
率查全率(Recall Ratio)是指从数据库内检出的相关的信息量与总量的⽐率。查全率绝对值很难计算,只能根据数据库内容、数量来估算。查全率是衡量某⼀检索系统从⽂献集合中检出相关⽂献成功度的⼀项指标,即检出的相关⽂献与全部相关⽂献的百分⽐。
F1-
Score
F1分数(F1-score)是分类问题的⼀个衡量指标。⼀些多分类问题的机器学习竞赛,常将F1-score作为最终测评的⽅法。它是精确率和召回率的
调和平均数,最⼤为1,最⼩为0。
ROC 还有⼀种经常与⼆元分类器⼀起使⽤的⼯具,叫做受试者⼯作特征曲线(简称ROC)。它与精度/召回率曲线⾮常相似,但绘制的不是精度和召回率,⽽是真正类率(召回率的另⼀种称呼)和假正类率(FPR)。FPR是被错误分为正类的负类实例⽐率。它等于1-真负类率(TNR),后者正是被正确分类为
负类的负类实例⽐率,也称为奇异度。因此ROC曲线绘制的是灵敏度和(1-奇异度)的关系。
混淆
矩阵混淆矩阵也称误差矩阵,是表⽰精度评价的⼀种标准格式,⽤n⾏n列的矩阵形式来表⽰。具体评价指标有总体精度、制图精度、⽤户精度等,这些精度指标从不同的侧⾯反映了图像分类的精度。 在⼈⼯智能中,混淆矩阵(confusion matrix)是可视化⼯具,特别⽤于监督学习,在⽆监督学习⼀般叫做匹配矩阵。在图像精度评价中,主要⽤于⽐较分类结果和实际测得值,可以把分类结果的精度显⽰在⼀个混淆矩阵⾥⾯。混淆矩阵是通
过将每个实测像元的位置和分类与分类图像中的相应位置和分类相⽐较计算的。
2、MNIST
数据介绍:本章使⽤MNIST数据集,这是⼀组由美国⾼中⽣和⼈⼝调查局员⼯⼿写的70000个数字的图⽚。每张图像都⽤其代表的数字标记。这个数据集被⼴为使⽤,因此也被称作是机器学习领域的“Hello World”:但凡有⼈想到了⼀个新的分类算法,都会想看看在MNIST上的执⾏结果。因此只要是学习机器学习的⼈,早晚都要⾯对MNIST。
查准率=∗检索出的信息总量检索出的相关信息量100%。
F =1=+Precision 1Recall 122∗=P re +Rec P re ∗Rec T P +2
FN +FP T P F P R =F P +T N
F P Recall =T P +F N
T P
# 使⽤sklearn的函数来获取MNIST数据集
from sklearn.datasets import fetch_openml
import numpy as np
import os
# to make this notebook's output stable across runs
np.random.seed(42)
# To plot pretty figures
%matplotlib inline
import matplotlib as mpl
import matplotlib.pyplot as plt
<('axes', labelsize=14)
<('xtick', labelsize=12)
<('ytick', labelsize=12)
# 为了显⽰中⽂
# 耗时巨⼤
def sort_by_target(mnist):
reorder_train=np.array(sorted([(target,i)for i, target in enumerate(mnist.target[:60000])]))[:,1] reorder_test=np.array(sorted([(target,i)for i, target in enumerate(mnist.target[60000:])]))[:,1] mnist.data[:60000]=mnist.data[reorder_train]
mnist.target[:60000]=mnist.target[reorder_train]
mnist.data[60000:]=mnist.data[reorder_test+60000]
mnist.target[60000:]=mnist.target[reorder_test+60000]
mnist=fetch_openml('mnist_784',version=1,cache=True)
mnist.target=mnist.target.astype(np.int8)
sort_by_target(mnist)
mnist["data"], mnist["target"]
(array([[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]]),
array([0, 0, 0, ..., 9, 9, 9], dtype=int8))
mnist.data.shape
(70000, 784)
X,y=mnist["data"],mnist["target"]
X.shape
(70000, 784)
y.shape
(70000,)
28*28
784
# 展⽰图⽚
def plot_digit(data):
image = shape(28,28)
plt.imshow(image, cmap = binary,
interpolation="nearest")
plt.axis("off")
some_digit = X[36000]
plot_digit(X[36000].reshape(28,28))
y[36000]
5
# 更好看的图⽚展⽰
def plot_digits(instances,images_per_row=10,**options):
size=28
鼠标特效代码怎么设置movie clip电影剪辑# 每⼀⾏有⼀个
image_pre_row=min(len(instances),images_per_row)
images=[shape(size,size)for instances in instances]
# 有⼏⾏
n_rows=(len(instances)-1)// image_pre_row+1
row_images=[]
n_empty=n_rows*image_pre_row-len(instances)
images.s((size,size*n_empty)))
for row in range(n_rows):
# 每⼀次添加⼀⾏
rimages=images[row*image_pre_row:(row+1)*image_pre_row] # 对添加的每⼀⾏的额图⽚左右连接
row_images.atenate(rimages,axis=1))
# 对添加的每⼀列图⽚上下连接
atenate(row_images,axis=0)
plt.imshow(image,binary,**options)
plt.axis("off")
plt.figure(figsize=(9,9))
example_images=np.r_[X[:12000:600],X[13000:30600:600],X[30600:60000:590]] plot_digits(example_images,images_per_row=10)
plt.show()
接下来,我们需要创建⼀个测试集,并把其放在⼀边。
X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:]
同样,我们还需要对训练集进⾏洗牌,这样可以保证交叉验证的时候,所有的折叠都差不多。此外,有些机器学习算法对训练⽰例的循序敏感,如果连续输⼊许多相似的实例,可能导致执⾏的性能不佳。给数据洗牌,正是为了确保这种情况不会发⽣。
import numpy as np
shuffer_index=np.random.permutation(60000)
X_train,y_train=X_train[shuffer_index],y_train[shuffer_index]
训练⼀个⼆分类器
现在,我们先简化问题,只尝试识别⼀个数字,⽐如数字5,那么这个"数字5检测器",就是⼀个⼆分类器的例⼦,它只能区分两个类别:5和⾮5。先为此分类任务创建⽬录标量
y_train_5=(y_train==5)
y_test_5=(y_test==5)
接着挑选⼀个分类器并开始训练。⼀个好的选择是随机梯度下降(SGD)分类器,使⽤sklearn的SGDClassifier类即可。这个分类器的优势是:能够有效处理⾮常⼤型的数据集。这部分是因为SGD独⽴处理训练实例,⼀次⼀个(这也使得SGD⾮常适合在线学习任务)。
from sklearn.linear_model import SGDClassifier
sgd_clf=SGDClassifier(max_iter=5,tol=-np.infty,random_state=42)
sgd_clf.fit(X_train,y_train_5)
SGDClassifier(alpha=0.0001, average=False, class_weight=None,
excl表格函数evaluate表示啥early_stopping=False, epsilon=0.1, eta0=0.0, fit_intercept=True,
l1_ratio=0.15, learning_rate='optimal', loss='hinge', max_iter=5,
n_iter_no_change=5, n_jobs=None, penalty='l2', power_t=0.5,
random_state=42, shuffle=True, tol=-inf, validation_fraction=0.1,
verbose=0, warm_start=False)
sgd_clf.predict([some_digit])
array([ True])
性能考核儿童python入门教程
评估分类器⽐评估回归器要困难很多,因此本章将会⽤很多篇幅来讨论这个主题,同时也会涉及许多性能考核的⽅法。
使⽤交叉验证测量精度
随机交叉验证和分层交叉验证效果对⽐
del_selection import cross_val_score
cross_val_score(sgd_clf, X_train, y_train_5, cv=3, scoring="accuracy")
array([0.96225, 0.9645 , 0.94765])
上海软件培训机构排名榜# 类似于分层采样,每⼀折的分布类似
做零件加工软件编程最好del_selection import StratifiedKFold
from sklearn.base import clone
skfolds = StratifiedKFold(n_splits=3, random_state=42)
for train_index, test_index in skfolds.split(X_train, y_train_5):
clone_clf = clone(sgd_clf)
X_train_folds = X_train[train_index]
y_train_folds =(y_train_5[train_index])
X_test_fold = X_train[test_index]
y_test_fold =(y_train_5[test_index])
clone_clf.fit(X_train_folds, y_train_folds)
y_pred = clone_clf.predict(X_test_fold)
n_correct =sum(y_pred == y_test_fold)
print(n_correct /len(y_pred))
0.96225
0.9645
0.94765
我们可以看到两种交叉验证的准确率都达到了95%上下,看起来很神奇,不过在开始激动之前,让我们来看⼀个蠢笨的分类器,将所有图⽚都预测为‘⾮5’
from sklearn.base import BaseEstimator
# 随机预测模型
class Never5Classifier(BaseEstimator):
def fit(self, X, y=None):
pass
def predict(self, X):
s((len(X),1), dtype=bool)
never_5_clf = Never5Classifier()
cross_val_score(never_5_clf, X_train, y_train_5, cv=3, scoring="accuracy")
array([0.909 , 0.90715, 0.9128 ])
我们可以看到,准确率也超过了90%!这是因为我们只有⼤约10%的图像是数字5,所以只要猜⼀张图⽚不是5,那么有90%的时间都是正确的,简直超过了⼤预⾔家。
这说明,准确率通常⽆法成为分类器的⾸要性能指标,特别是当我们处理偏斜数据集的时候(也就是某些类别⽐其他类更加频繁的时候)
混淆矩阵
评估分类器性能的更好的⽅法是混淆矩阵。总体思路就是统计A类别实例被分成B类别的次数。例如,要想知道分类器将数字3和数字5混淆多少次,只需要通过混淆矩阵的第5⾏第3列来查看。
要计算混淆矩阵,需要⼀组预测才能将其与实际⽬标进⾏⽐较。当然可以通过测试集来进⾏预测,但
是现在我们不动它(测试集最好保留到项⽬的最后,准备启动分类器时再使⽤)。最为代替,可以使⽤cross_val_predict()函数:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论