美文网首页
svm入门实战之手写体识别

svm入门实战之手写体识别

作者: theo_NI | 来源:发表于2019-02-21 15:19 被阅读0次

    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入门实战之手写体识别

          本文链接:https://www.haomeiwen.com/subject/zqoryqtx.html