您好,登錄后才能下訂單哦!
該項目通過算法識別圖像的數字,圖像由783個像素特征即灰度值組成,范圍一般從0到255,白色為255,黑色為0,選擇算法依據據783個特征判斷圖像是哪一個數字(標簽),因為練習賽,難度還是比較低的。https://www.kaggle.com/c/digit-recognizer
提供數據集(在鏈接的data中可下載)有,train.csv(包含1列label 和783列pixelx,數據大小為42001785)、test.csv(含7834列pixelx,數據大小為28001784)
此處選擇的算法是python的sklearn庫中的K近鄰算法,當然大家也可以嘗試用其他算法,比如樸素貝葉斯、支持向量SVC等,最后K近鄰算法的準確率最高所以選擇此
K近鄰算法KNN原理是:根據與待測試樣本距離最近的k個訓練樣本的大概率分類來判斷待測樣本所歸屬的類別
過程是:
1)計算測試數據與各個訓練數據之間的距離;
2)按照距離的遞增關系進行排序;
3)選取距離最小的K個點;
4)確定前K個點所在類別的出現頻率;
5)返回前K個點中出現頻率最高的類別作為測試數據的預測分類。
1. 預處理
讀取訓練數據集,拆分為trainlabel 和traindata兩個矩陣,同時數值化和歸一化
train = pd.read_csv("train.csv")
trainlabel = ravel(toint(train.iloc[:, 0]).transpose())
traindata = toint(train.iloc[:, 1:])
test = pd.read_csv("test.csv")
testdata = toint(test.values)
# 對traindata和testdata歸一化,將所有不為0的數值全部轉換為1
train_rows = traindata.shape[0]
train_columns = traindata.shape[1]
test_rows = testdata.shape[0]
test_columns = testdata.shape[1]
traindata = nomalizing(traindata, train_rows, train_columns)
testdata = nomalizing(testdata, test_rows, test_columns)
此處解釋一下以上提到的兩個預處理方法:
①數值化是指原數據集的數據類型可能是字符串,由于后面會做是否為0的判斷,所以需要將數據類型轉換為數值型,由toint()函數完成
def toint(array):
"""轉為數值型數據"""
array = mat(array)# 生成矩陣
m, n = shape(array)
newArray = zeros((m, n))
for i in range(m):
for j in range(n):
newArray[i, j] = int(array[i, j])
return newArray
②歸一化是指將所有不為0的數都轉變為1,目的是簡化操作,由nomalizing函數實現
def nomalizing(data,r,l):
"""一個標簽對應784個特征,特征值為0-255的灰度值,0代表黑色,255代表白色,此處將所有不為0的值都以1轉換,簡化工作量"""
for i in range(r):
for j in range(l):
if data[i,j] != 0:
data[i,j] = 1
return data
2. 交叉檢驗
使用交叉檢驗,目的是評估n_neighbors參數的最佳取值,減少過擬合。
因為此處只控制一個參數k,即n_neighbors參數,所以用模型選擇庫中的cross_val_score(),若有多個參數則需使用GridSearchCV()
scores_list = []
k_range = range(1,10)
for k in k_range:
knnclf = KNeighborsClassifier(k)
? ? scores = cross_val_score(knnclf,traindata,trainlabel,cv=10,scoring="accuracy")
? ? scores_list.append(mean(scores))
plt.plot(k_range,scores_list)
plt.show()
print(max(scores_list)) # 最大精準度
k = argsort(array(scores_list))[-1] # 最大精準度對應的k值
此處將k值得范圍鎖定到1-9,cv=10設定為十折交叉驗證,score ="accuracy"評分標準采用精確率,默認是以 scoring=’f1_macro’
取得k值和對應準確率的折線圖,可得到最佳k值和最大準確率
3. 算法實現
def knnClassify(k,data,label,test):
"""KNN算法"""
knnclf = KNeighborsClassifier(k)
knnclf.fit(data,ravel(label)) # label降維一維數據
testlabel = knnclf.predict(test)
save_result(testlabel,"testlabel.csv")
def save_result(data,filename):
"""保存預測結果"""
# newline參數是控制文本模式之下,一行的結束字符
with open(filename,'w',newline="") as f:
w = csv.writer(f)
for d in data:
tmp = []
tmp.append(d)
w.writerow(tmp)
lavel()的作用是將多維數組降為一維,由于label只有一列數值,每一行特征對應一個label,需要將shape轉變為(42000,)的形式,所以必須降維
擴展:lavel()和flatten()有一樣的效果,不過唯一區別是flatten返回的是副本,而如果改變lavel會改變原數據
最后得到預測的標簽testlabel.csv文件,提交kaggle的準確率為96.4%
這個項目還有很多解法,這邊介紹的較基礎,如果有余力和興趣可以去[https://blog.csdn.net/weixin_39655021/article/details/86763519神經網絡識別]
看看更高深的解法
同時本文還參考了[https://blog.csdn.net/hermito/article/details/51862733Kaggle入門(數字識別為例)]
敬禮
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。