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%
    

你可能感兴趣的:(svm入门实战之手写体识别)