机器学习--digits手写字体
生活随笔
收集整理的這篇文章主要介紹了
机器学习--digits手写字体
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.導入數據
import numpy as np import matplotlib.pyplot as plt from sklearn import neighbors,datasets,cross_validation #交叉驗證#定義一個加載數據集函數 def load_classification_data():digits = datasets.load_digits() #手寫數字print('數據集說明,大小:',digits.data.shape ) #data中的圖片數據是一行64列print('一張圖片的數據:',digits.data[0]) #圖片數據print('數據集中的鍵:',digits.keys())print( 'target:',digits.target[0:50])print( 'images:',digits.images[0:1]) #image中是多個二維數組成 每個二維數組就是一個數據x_train = digits.datay_train = digits.target# cross_validation.train_test_split() 數據集與測試集的拆分 random_state=0 隨機return cross_validation.train_test_split( x_train,y_train,test_size=0.25,random_state=0,stratify=y_train) #stratify分層采樣#加載訓練數據以及測試數據 x_train,x_test,y_train,y_test=load_classification_data()得到以上輸出結果,如下圖:
2.數據分析
digits手寫數據集其實是1797組8*8的手寫數字圖像的像素點集合。有10個分類,代表了“0,1,2,…,9”這是個數字。特征維度為64,對應了每組數據的8 * 8個像素點。
通過分析,我們可以查看一下具體數據
3.顯示圖片
通過上述介紹,我們已經了解到了這是一個手寫的數據集,通過每一組數據可以得到某些數據,那么下面我們來具體看一下:
#顯示一下圖片 digits = datasets.load_digits() #加載數據 import matplotlib.pyplot as plt %matplotlib inline print( x_train[0:1] ) plt.figure(figsize=(8,8)) plt.imshow( digits.images[1]) print( '標準結果:',digits.target[1])
上面的圖片就是得到的手寫的**‘1’**
4.測試KNeighborsClassifier的用法
def test_KNeighborsClassifier(*data): # *代表自動解包 *data->列表參數'''測試KNeighborsClassifier的用法:param data 可變參數 是一個元組 要求其元素為:訓練樣本集、測試樣本集、訓練樣本的標記、測試樣本的標記:return: None'''X_train,X_test,y_train,y_test = dataclf = neighbors.KNeighborsClassifier()clf.fit(X_train,y_train)print( "模型在訓練集中的評分:%f" % clf.score(X_train,y_train))print("模型在測試集中的評分:%f" % clf.score(X_test,y_test))test_KNeighborsClassifier(x_train,x_test,y_train,y_test)5.做交叉驗證
def test_KNeighborsClassifier_k_w(*data):'''測試 KNeighborsClassifier 中 n_neighbors 和 weights 參數(投票策略) 的影響:param data:可變參數。它是一個元組,這里要求其元素依次為:訓練樣本集、測試樣本集、訓練樣本的標記、測試樣本的標記:return: None'''X_train,X_test,y_train,y_test=data#k的取值 從1到 數據集的大小( train: 1749*0.75 =1190)# linspace:在指定的間隔內返回均勻間隔的數字# num:#生成100個數 endpoint:是否包括最后一個數值 1 1189Ks= np.linspace(1,y_train.size,num = 100, endpoint=False,dtype='int')print( len(Ks) ) #100print( Ks )weights = ['uniform','distance'] #uniform權重相等 distance距離權重fig = plt.figure( figsize=(10,10))ax = fig.add_subplot(1,1,1) #子圖 ax 畫布的軸#繪制不同 weights 下,預測隨機得分隨 n_neighbors 的曲線for weight in weights:training_scores=[] testing_scores = []for K in Ks:clf = neighbors.KNeighborsClassifier(weights=weight,n_neighbors = K )clf.fit(X_train,y_train)testing_scores.append( clf.score(X_test,y_test))training_scores.append(clf.score(X_train,y_train))#k值為x,評分為yax.plot(Ks,testing_scores,label="testing score:weight=%s"%weight)ax.plot(Ks,training_scores,label="training score:weight=%s"%weight)ax.legend(loc='best')ax.set_xlabel("K")ax.set_ylabel("score")ax.set_ylim(0,1.05) #y刻度的極限ax.set_title("KNeighborsClassifier")plt.show()test_KNeighborsClassifier_k_w(x_train,x_test,y_train,y_test)6.超參數搜索/網格搜索
此處具體參數設置請參照官網 :GridSearchCV
輸出最優參數組合
print('最佳結果:%0.3f' % clf.best_score_ ) print('最優參數組合:') best_parameters = clf.best_estimator_.get_params() for param_name in sorted(param_grid.keys() ):print( '\t%s:%r' %(param_name,best_parameters[param_name]))使用最優參數重新測試
digits=datasets.load_digits() clf=neighbors.KNeighborsClassifier(p=2,n_neighbors=4,weights='uniform') clf.fit(x_train,y_train) y_predict = clf.predict(x_test) print('KNN Classifier 準確率為:' ,clf.score(x_test,y_test))總結
以上是生活随笔為你收集整理的机器学习--digits手写字体的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: canvas 在线画图
- 下一篇: 动态加载 回显_ElementUI ca