阅读 173

Kaggle入门,一篇就够!Digit Recognizer 详解。

前言

目前 kaggle 的入门教程也挺多的,但有几个缺点,有些是比较老旧的,代码在新的版本下跑不通,这对于新手而言是很艰难的。(更有些还是py2的代码);有一些则是有原理没实现,有实现没原理,总而言之,好的入门教程不多。(不多也就是有,此处我附上另一个我觉得写的不错的教程在文末,有兴趣的同学可以去参考一下,当然直接看我这篇也是ok的 ,我会尽量囊括他的内容,算是对其内容的一个更新,因为版本问题,他的有些代码是不能直接跑的)

关于 kaggle,碎碎念

一开始也会觉得 kaggle 好难,觉得怕自己搞不定,就一直拖一直拖,不肯动手。其实完全没必要(难是难,但不至于啥都不能干)

首先来到我们 digit recognizer的地址:www.kaggle.com/c/digit-rec…

在这里插入图片描述 【懒癌犯了,暂时挂着,有空补上】 KNN 可优化的点不多,除了改一改K值好像没啥可改的,有看到这篇博客的朋友可以先看看我文末附上的参考链接,同时参考我的代码。 目前 KNN 跑出来的结果只有96.3%,不是很理想。 附上源代码:

import pandas as pd from numpy import mat,tile,array import numpy as np import time import csv,operator def load_data(filename):     return pd.read_csv(filename, sep=',', header='infer', names=None, index_col=None, usecols=None) # 二值化,将0-255中,非0的都修改为1 def to_binary(df):     dv = df.values     width = len(dv[0])     for i in range(1,len(dv)):         for j in range(1,width):             if dv[i][j]!= 0:                 dv[i][j] = 1     return dv #inX是所要测试的向量 #dataSet是训练样本集,一行对应一个样本。dataSet对应的标签向量为labels #k是所选的最近邻数目 def classify(inX, dataSet, labels, k):     # mat method create a matrix     inX=mat(inX) # test_data, just one sample     dataSet=mat(dataSet) # train_data     labels=mat(labels) # the labels of the train_data     dataSetSize = dataSet.shape[0] #     此处用一个测试向量,复制n行,(n为训练集的样本数),使得该测试向量与每一个训练向量相减,用于计算最近k邻【构造了dataSetSize*inX行,1*inX列】     diffMat = tile(inX, (dataSetSize,1)) - dataSet     sqDiffMat = array(diffMat)**2     sqDistances = sqDiffMat.sum(axis=1)     distances = sqDistances**0.5     sortedDistIndicies = distances.argsort() #array.argsort(),得到每个元素的排序序号     classCount={}                           #sortedDistIndicies[0]表示排序后排在第一个的那个数在原来数组中的下标     for i in range(k):         voteIlabel = labels[0,sortedDistIndicies[i]]         classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1     sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)     return sortedClassCount[0][0] def saveResult(result):     with open('result.csv','w',newline='') as myFile:         myWriter=csv.writer(myFile)         myWriter.writerow(['imageid','label'])         for i in range(len(result)):             myWriter.writerow([i+1,str(result[i])]) if __name__ == '__main__':     print("loading train data...")     df = load_data("train.csv") # 加载训练数据     label = df['label'].values     df = df.drop(['label'],axis=1) # 去除label列     print("loading test data...")     dt = load_data("test.csv") # 加载测试样本集,因为测试样本集不含label,可直接取values,提高后续速度     print("nomalizing...")     start = time.time()     db = to_binary(df)  # 二值化     dt = to_binary(dt) # 对测试集同样进行二值化     print("training...")     # print(len(dt))     dt_len = len(dt)     resultList = [] #np.empty(dt_len) # 效率比建list 后append 高     for i in range(dt_len):         classifierResult = classify(dt[i], db, label, 5)         # resultList[i] = classifierResult         resultList.append(classifierResult)         print(str(i+1)+","+str(classifierResult))         # print("the classifier came back with: %d" % (classifierResult))     saveResult(resultList)     end = time.time()     print("using time:",end-start)


作者:菜饼不菜
链接:https://juejin.cn/post/7021451322129907726


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐