亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Kaggle練習賽之數字識別——新手適用

發布時間:2020-07-31 04:30:05 來源:網絡 閱讀:724 作者:YouErAJ 欄目:編程語言

項目介紹

該項目通過算法識別圖像的數字,圖像由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入門(數字識別為例)]

敬禮

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新沂市| 都兰县| 汽车| 东莞市| 闵行区| 永川市| 洪洞县| 神池县| 信丰县| 兴化市| 汤原县| 澜沧| 延川县| 咸阳市| 渑池县| 五河县| 梨树县| 阿合奇县| 元阳县| 江陵县| 广平县| 惠水县| 高安市| 商丘市| 平凉市| 搜索| 仙游县| 开远市| 太白县| 沙雅县| 大同市| 乾安县| 彰化市| 保亭| 乌什县| 屏东县| 山东| 汉中市| 和静县| 绿春县| 云和县|