KNNおよびSVMアルゴリズムを使用して、手書きのフォント認識と分類を実現します


以下では、手書きの数字認識にk-nearest neighborアルゴリズム(KNN)とsupport vector machine(SVM)アルゴリズムを使用しています。

ここに写真の説明を挿入

データセット:
Baiduネットワークディスク抽出コード:
j13sCSDNリソース

プロジェクトトレーニングの目標

  • データセットの呼び出し方法を学び、Python関連プログラムを使用してデータセットからデータを読み取ります
  • データセットに基づいて分類子をトレーニングし、Pythonでアルゴリズムを実装する方法を学ぶ
  • 学習した知識を使用して、実際のデータセットの分類手順を完了する方法を学びます
  • アルゴリズムの関連パラメーターの意味、機能、影響を観察および分析する方法を学ぶ
  • さまざまなアルゴリズムを比較し、各アルゴリズムの長所と短所を分析する方法を学びます

テキストを入力してください。Xiaobaiでモジュールのインストール方法がわからない場合は、私見てください。

インポートモジュール

  • まず、必要なライブラリをインポートする必要があります
from sklearn.model_selection import GridSearchCV
from sklearn import svm
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
import operator
import pandas as pd
import numpy as np
import os
import pprint
import matplotlib.pyplot as plt
from matplotlib.pylab import style
  • 同時に、matplotlib描画中国語表示の文字化け問題を設定します
%matplotlib inline
#解决中文显示问题
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
  • データパスに切り替えます
path = r"C:\Users\Administrator\homework\机器学习\digits"
os.chdir(path)

データの読み取り

トレーニングセット

# 获取数据文件
fileList = os.listdir(r'trainingDigits')
# 定义数据标签列表
y_train = []
# 添加数据标签
for filename in fileList:
    y_train.append(int(filename.split('_')[0]))
# 定义矩阵数据格式
x_train = np.zeros((len(y_train),32*32))
 
# 获取矩阵数据
index = 0
for filename in fileList:
    with open(r'trainingDigits\%s'%filename, 'rb') as f:
        # 定义一个空矩阵
        vect = np.zeros((1,1024))
        # 循环32行
        for i in range(32):
            # 读取每一行数据
            line = f.readline()
            # 遍历每行数据索引  line[j] 即为数据
            for j in range(32):
                vect[0,32*i+j] = int(line[j])        
        x_train[index,:] = vect
        index+=1

データの構造を観察する

x_train.shape
(1934, 1024)

データ配信

df = pd.DataFrame(y_train,columns=["数字"])
a = df["数字"].value_counts().sort_values()

分布
ここに写真の説明を挿入

テストセット

fileList2 = os.listdir(r'testDigits')
# 定义数据标签列表
y_test = []# 获取数据标签
for filename2 in fileList2:
    y_test.append(int(filename2.split('_')[0]))
# 定义矩阵数据格式
x_test = np.zeros((len(y_test),1024))
# 获取矩阵数据
index = 0
for filename2 in fileList2:
    with open(r'testDigits\%s'%filename2, 'rb') as f:   
        # 定义一个空矩阵
        vect = np.zeros((1,1024))
        # 循环32行
        for i in range(32):
            # 读取每一行数据
            line = f.readline()
            # 遍历每行数据索引  line[j] 即为数据
            for j in range(32):
                vect[0,32*i+j] = int(line[j])
        x_test[index,:] = vect
        index+=1

データ配信

df = pd.DataFrame(y_test,columns=["数字"])
c = df["数字"].value_counts().sort_index()

テストセットのデータ配布

  • データを配布することにより、テストセットとトレーニングセットでデータがスムーズに配布されることがわかります。

モデル構築

KNN

error = 0
total = len(y_train)
def KNN(n_neighbors):
    knn = KNeighborsClassifier(n_neighbors=n_neighbors)#超参数N
    #利用训练数据拟合模型
    knn.fit(x_train,y_train)
    # 预测数据 
    y_predict = knn.predict(x_test)
#    print(1 - sum(y_predict ==y_test)/len(y_predict))
    print("超参数n="+str(n_neighbors)+"时,模型的错误率:"+str(1 - knn.score(x_test,y_test)))
    return 1-knn.score(x_test,y_test)
correct=[]
for i in range(1,11):
    correct.append(KNN(i))
超参数n=1时,模型的错误率:0.01374207188160681
超参数n=2时,模型的错误率:0.023255813953488413
超参数n=3时,模型的错误率:0.012684989429175508
超参数n=4时,模型的错误率:0.016913319238900604
超参数n=5时,模型的错误率:0.019027484143763207
超参数n=6时,模型的错误率:0.022198731501057112
超参数n=7时,模型的错误率:0.023255813953488413
超参数n=8时,模型的错误率:0.024312896405919715
超参数n=9时,模型的错误率:0.026427061310782207
超参数n=10时,模型的错误率:0.024312896405919715

異なるk値でエラー率グラフを描画する
KNNモデルのエラー率

相互検証グリッド検索を使用して、最適なモデルを選択します

estimator = KNeighborsClassifier()
param_dict = {
    
    "n_neighbors": [1,2,3,4,5,6,7,8,9,10]}
estimator = GridSearchCV(estimator, param_grid=param_dict, cv=3)
estimator.fit(x_train,y_train)
y_predict = estimator.predict(x_test)
#print("比对预测结果和真实值:\n", y_predict == y_test)
score = estimator.score(x_test, y_test)
print("直接计算准确率:\n", score)
直接计算准确率:
 0.9873150105708245

f1-scoreを使用してモデルを評価します

from sklearn.metrics import classification_report
target_names = [str(i) for i in range(0,10)]
print(classification_report(y_test, y_predict, target_names=target_names))
              precision    recall  f1-score   support

           0       1.00      1.00      1.00        87
           1       0.96      0.99      0.97        97
           2       1.00      1.00      1.00        92
           3       0.98      0.99      0.98        85
           4       1.00      1.00      1.00       114
           5       0.99      0.98      0.99       108
           6       0.98      1.00      0.99        87
           7       0.98      1.00      0.99        96
           8       1.00      0.95      0.97        91
           9       0.99      0.97      0.98        89

    accuracy                           0.99       946
   macro avg       0.99      0.99      0.99       946
weighted avg       0.99      0.99      0.99       946

モデルの概要

  • knnモデルのエラー率グラフによると、kの値を大きくすると、学習するサンプルが多くなるため、エラー率が最初に低下し、分類効果が向上します。ただし、K値が大きいほど、エラー率は徐々に高くなります。このモデルでは、k = 3のときにモデルのエラー率が最も低くなります。

SVM

次に、モデルトレーニングにサポートベクターマシンペアを使用します

from sklearn import svm

# 创建SVC/Support Vector Classification/支持向量机分类器模型
svc_model = svm.SVC(gamma="auto", C=10)
# 将数据拟合到SVC模型中,此处用到了标签值y_train,是有监督学习
svc_model.fit(x_train, y_train)
score = svc_model.score(x_test,y_test)
y_predict = svc_model.predict(x_test)
print("直接计算准确率:\n",score)
直接计算准确率:
 0.9862579281183932
from sklearn.metrics import classification_report
target_names = [str(i) for i in range(0,10)]
print(classification_report(y_test, y_predict, target_names=target_names))
              precision    recall  f1-score   support

           0       1.00      1.00      1.00        87
           1       0.98      0.99      0.98        97
           2       0.99      0.99      0.99        92
           3       0.99      0.94      0.96        85
           4       0.98      1.00      0.99       114
           5       0.98      1.00      0.99       108
           6       0.99      0.99      0.99        87
           7       0.99      0.99      0.99        96
           8       1.00      0.98      0.99        91
           9       0.97      0.98      0.97        89

    accuracy                           0.99       946
   macro avg       0.99      0.99      0.99       946
weighted avg       0.99      0.99      0.99       946
def SVM(C):
    # 创建SVC/Support Vector Classification/支持向量机分类器模型
    svc_model = svm.SVC( C=C)
    # 将数据拟合到SVC模型中,此处用到了标签值y_train,是有监督学习
    svc_model.fit(x_train, y_train)
    score = svc_model.score(x_test,y_test)
    y_predict = svc_model.predict(x_test)
    print("超参数C="+str(C)+"时,模型的正确率:"+str(score))
    return score

L2 = []
c = np.logspace(-5,5,11)
for i in c:
    L2.append(SVM(i))
超参数C=1e-05时,模型的正确率:0.09408033826638477
超参数C=0.0001时,模型的正确率:0.09408033826638477
超参数C=0.001时,模型的正确率:0.09408033826638477
超参数C=0.01时,模型的正确率:0.09513742071881606
超参数C=0.1时,模型的正确率:0.952431289640592
超参数C=1.0时,模型的正确率:0.985200845665962
超参数C=10.0时,模型的正确率:0.9904862579281184
超参数C=100.0时,模型的正确率:0.9904862579281184
超参数C=1000.0时,模型的正确率:0.9904862579281184
超参数C=10000.0时,模型的正确率:0.9904862579281184
超参数C=100000.0时,模型的正确率:0.9904862579281184

グラフィックを描く

ここに写真の説明を挿入

モデルの概要

ベクトルマシンをサポートします。多数のカーネル関数を使用できます。これは、さまざまな非線形分類回帰問題を解決するために非常に柔軟です。サンプルサイズが大量のデータでない場合、分類精度が高く、一般化能力が強い。

これで終わりです。それがあなたを助け、好きでフォローすることを歓迎します、あなたの好きは私にとって非常に重要です

おすすめ

転載: blog.csdn.net/qq_45176548/article/details/111405086