svm入门实战之手写体识别

svm入门实战之手写体识别

先上代码!!

# 从sklearn.datasets里导入手写体数字加载器。
from sklearn.datasets import load_digits
# 从sklearn.cross_validation中导入train_test_split用于数据分割。
from sklearn.cross_validation import train_test_split
# 从sklearn.preprocessing里导入数据标准化模块。
from sklearn.preprocessing import StandardScaler
# 从sklearn.svm里导入基于线性假设的支持向量机分类器LinearSVC。
from sklearn.svm import LinearSVC
# 从sklearn.metrics里导入classification_report模块对预测结果做详细分析
from sklearn.metrics import classification_report

# 从通过数据加载器获得手写体数字的数码图像数据并储存在digits变量中。
digits = load_digits()

# 随机选取75%的数据作为训练样本;其余25%的数据作为测试样本。
X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target, test_size=0.25, random_state=33)

# 从仍然需要对训练和测试的特征数据进行标准化。
ss = StandardScaler()
X_train = ss.fit_transform(X_train)
X_test = ss.transform(X_test)
 
# 初始化线性假设的支持向量机分类器LinearSVC。
lsvc = LinearSVC()
#进行模型训练
lsvc.fit(X_train, y_train)
# 利用训练好的模型对测试样本的数字类别进行预测,预测结果储存在变量y_predict中。
y_predict = lsvc.predict(X_test)

# 打印出每个类别的精确率、召回率、f1值
print(classification_report(y_test,y_predict,target_names=digits.target_names.astype(str)))

结果如下:

             precision    recall  f1-score   support

          0       0.92      1.00      0.96        35
          1       0.96      0.98      0.97        54
          2       0.98      1.00      0.99        44
          3       0.93      0.93      0.93        46
          4       0.97      1.00      0.99        35
          5       0.94      0.94      0.94        48
          6       0.96      0.98      0.97        51
          7       0.92      1.00      0.96        35
          8       0.98      0.84      0.91        58
          9       0.95      0.91      0.93        44

avg / total       0.95      0.95      0.95       450

知识点整理-sklearn的手写体数据集

# 1- 导入
from sklearn.datasets import load_digits

# 2- 属性
print(digits.keys())
#['images', 'data', 'target_names', 'DESCR', 'target']
# images: 手写体图片数组,(1797,8,8)
# data: 数组,(1797,64)
# target_names:数组,1-10,(10,1)
# target:data对应的实际值,(1797,1)
# DESCR;描述

知识点整理-数据集分割

from sklearn.cross_validation import train_test_split

X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target, test_size=0.25, random_state=33)
# train_test_split用于切分数据集为训练集和测试集
# 接受的参数有 arrays(可有多个) 、 test_size 、random_state
# arrays :划分的样本特征集及对应的标签
# test_size : 测试集的比例,如果是整数则表示测试集的大小,默认是0.25
# random_state :是随机数的种子(其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。比如你每次都填1,其他参数一样的情况下你得到的随机数组是一样的。但填0或不填,每次都会不一样)

知识点整理-数据标准化模块

from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
X_train = ss.fit_transform(X_train)
X_test = ss.transform(X_test)
# 数据标准化的定义:数据的标准化是指将数据按照比例缩放,使之落入一个特定的区间(归一化是特殊的标准化)
# 数据标准化的原因:SVM中处理分类问题如果不进行数据的归一化处理,会对准确率产生很大的影响,出现因为数值过大导致c,g取值超过寻优范围
# 本方法的实现细节:(X-X_mean)/X_std    X_n:均值,x_std:方差
# 本方法的结果:对每个属性/每列来说所有数据都聚集在0附近,方差值为1
# 实例:
# 标准化前
(array([ 0.,  0.,  1., 14., 11.,  0.,  0.,  0.,  0.,  0.,  9., 15.,  2.,
         0.,  4.,  0.,  0.,  2., 16.,  6.,  0.,  7., 16.,  2.,  0.,  8.,
        16.,  6.,  6., 16., 12.,  0.,  0.,  5., 16., 16., 16., 15.,  3.,
         0.,  0.,  0.,  1.,  4., 16.,  8.,  0.,  0.,  0.,  0.,  0.,  9.,
        16.,  1.,  0.,  0.,  0.,  0.,  0., 15., 16.,  0.,  0.,  0.]),
 # 标准化后:
 array([ 0.00000000e+00, -3.26723140e-01, -8.75547113e-01,  5.15429155e-01,
        -2.02767578e-01, -1.01854560e+00, -4.16870153e-01, -1.28445208e-01,
        -6.30488325e-02, -6.20016361e-01, -2.43754230e-01,  7.50084614e-01,
        -1.76332093e+00, -1.36304030e+00,  5.63871245e-01, -1.38837739e-01,
        -5.15600932e-02, -1.73546020e-01,  1.08113330e+00, -1.58796824e-01,
        -1.15489364e+00, -1.25917647e-01,  4.24696964e+00,  4.40806560e+00,
        -3.85614944e-02,  1.73466608e+00,  1.11511355e+00, -4.69981158e-01,
        -6.29056628e-01,  1.41979885e+00,  2.54007235e+00, -4.72455591e-02,
         0.00000000e+00,  7.19570322e-01,  1.31912348e+00,  1.11138665e+00,
         9.64484118e-01,  1.04716621e+00, -2.71053713e-03,  0.00000000e+00,
        -7.08978629e-02, -5.32239088e-01, -9.10195142e-01, -5.11791113e-01,
         1.32867334e+00, -3.31959081e-02, -7.98799181e-01, -8.22120443e-02,
        -4.09347820e-02, -4.02862116e-01, -1.33103689e+00, -1.08678943e-01,
         1.21393727e+00, -1.25990174e+00, -7.46600463e-01, -2.05957126e-01,
        -2.72569633e-02, -2.91387122e-01, -1.08064753e+00,  6.74063507e-01,
         8.51068634e-01, -1.11540424e+00, -4.97094931e-01, -1.90547407e-01]))

知识点整理-准确率(Accuracy),精确率(Precision),召回率(Recall) ,f1值

  • 定义

    True Positive(真正,TP):将正类预测为正类数

    True Negative(真负,TN):将负类预测为负类数

    False Positive(假正,FP):将负类预测为正类数误报 (Type I error)

    False Negative(假负,FN):将正类预测为负类数→漏报 (Type II error)

  • 准确率(Accuracy)=(TP+TN)/(TP+TN+FP+FN)

  • 精确率(Precision)= TP/(TP+FP)

  • 召回率(Recall)=TP/(TP+FN)

  • F1=(2*P*R)/(P+R) 综合准确率和召回率,分值越高实验方法越有效

  • 举例:

    假设我们手上有100个正样本,50个负样本,我们要找出所有的正样本,系统查找出70个,其中只有40个是真正的正样本,计算上述各指标。
    TP: 将正类预测为正类数 40
    FN: 将正类预测为负类数 60
    FP: 将负类预测为正类数 30
    TN: 将负类预测为负类数 20
    准确率(accuracy) = 预测对的/所有 = (40+20)/150 = 40%
    精确率(precision) = TP/(TP+FP) = 40/70 = 57%
    召回率(recall) = TP/(TP+FN) = 40/(40+60)= 40%
    
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容