Kaggle比赛:数字识别的多种算法实现

关于Kaggle大赛就不多说了,我打算进一步了解一下入门级的比赛之后再另作参加项目/比赛的打算,在此之前需要更多的实践才行。

以下是我学习的地址(在一个GitHub大神分享的相关的资源):

https://github.com/apachecn/kaggle
里面有多种可以实现的算法的代码以及思想,我在此进行进一步的整理,进行一个简单的代码记录,以及会进行一点修改以符合我自身的情况。

KNN实现

首先应当理解这个数字识别数据集里数值表达的意思:每个标签即代表一个数字,而一个数字的每一个像素值是不一样的(在训练数据集中可看到),KNN的作用就是在以测试集中的数值与训练集中的数值做距离计算,最终以“K”值的多少得出像素值相近的数字标签(即为最终的数字选项)。

代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#!/usr/bin/python
# coding: utf-8
'''
Created on 2017-10-26
Update on 2018-05-16
Author: 片刻/ccyf00
Github: https://github.com/apachecn/kaggle
'''
import os.path
import csv
import time
import numpy as np
import pandas as pd
from sklearn.decomposition import PCA
from sklearn.neighbors import KNeighborsClassifier
data_dir = '/opt/data/kaggle/getting-started/digit-recognizer/'
# 加载数据
def opencsv():
# 使用 pandas 打开
data = pd.read_csv(os.path.join(data_dir, 'input/train.csv'))
data1 = pd.read_csv(os.path.join(data_dir, 'input/test.csv'))
train_data = data.values[0:, 1:] # 读入全部训练数据, [行,列]
train_label = data.values[0:, 0] # 读取列表的第一列
test_data = data1.values[0:, 0:] # 测试全部测试个数据
return train_data, train_label, test_data
def saveResult(result, csvName):
with open(csvName, 'w') as myFile: # 创建记录输出结果的文件(w 和 wb 使用的时候有问题)
# python3里面对 str和bytes类型做了严格的区分,不像python2里面某些函数里可以混用。所以用python3来写wirterow时,打开文件不要用wb模式,只需要使用w模式,然后带上newline=''
myWriter = csv.writer(myFile)
myWriter.writerow(["ImageId", "Label"])
index = 0
for r in result:
index += 1
myWriter.writerow([index, int(r)])
print('Saved successfully...') # 保存预测结果
def knnClassify(trainData, trainLabel):
knnClf = KNeighborsClassifier() # default:k = 5,defined by yourself:KNeighborsClassifier(n_neighbors=10)
knnClf.fit(trainData, np.ravel(trainLabel)) # ravel Return a contiguous flattened array.
return knnClf
# 数据预处理-降维 PCA主成成分分析
def dRPCA(x_train, x_test, COMPONENT_NUM):
print('dimensionality reduction...')
trainData = np.array(x_train)
testData = np.array(x_test)
'''
使用说明:https://www.cnblogs.com/pinard/p/6243025.html
n_components>=1
n_components=NUM  设置占特征数量比
0 < n_components < 1
n_components=0.99 设置阈值总方差占比
'''
pca = PCA(n_components=COMPONENT_NUM, whiten=False)
pca.fit(trainData) # Fit the model with X
pcaTrainData = pca.transform(trainData) # Fit the model with X and 在X上完成降维.
pcaTestData = pca.transform(testData) # Fit the model with X and 在X上完成降维.
# pca 方差大小、方差占比、特征数量
print(pca.explained_variance_, '\n', pca.explained_variance_ratio_, '\n',
pca.n_components_)
print(sum(pca.explained_variance_ratio_))
return pcaTrainData, pcaTestData
def dRecognition_knn():
start_time = time.time()
# 加载数据
trainData, trainLabel, testData = opencsv()
# print("trainData==>", type(trainData), shape(trainData))
# print("trainLabel==>", type(trainLabel), shape(trainLabel))
# print("testData==>", type(testData), shape(testData))
print("load data finish")
stop_time_l = time.time()
print('load data time used:%f' % (stop_time_l - start_time))
# 降维处理
trainData, testData = dRPCA(trainData, testData, 0.8)
# 模型训练
knnClf = knnClassify(trainData, trainLabel)
# 结果预测
testLabel = knnClf.predict(testData)
# 结果的输出
saveResult(testLabel, os.path.join(data_dir, 'output/Result_sklearn_knn.csv'))
print("finish!")
stop_time_r = time.time()
print('classify time used:%f' % (stop_time_r - start_time))
if __name__ == '__main__':
dRecognition_knn()

代码来源:https://github.com/apachecn/kaggle/blob/master/src/python/getting-started/digit-recognizer/knn-python3.6.py

SVM

因为时间有限,并且是以学习为主,与我自己写的代码也大同小异,所以我也就不再重复贴上代码了。直接贴上Github的代码链接。

https://github.com/apachecn/kaggle/blob/master/src/python/getting-started/digit-recognizer/svm-python3.6.py

随机森林

https://github.com/apachecn/kaggle/blob/master/src/python/getting-started/digit-recognizer/rf-python3.6.py

神经网络

https://github.com/apachecn/kaggle/blob/master/src/python/getting-started/digit-recognizer/nn-python3.6.py

cnn算法

https://github.com/apachecn/kaggle/blob/master/competitions/getting-started/digit-recognizer/cnn算法描述.md

各种主流机器学习算法的区别与选择

---------------本文终---------------

文章作者:刘俊

最后更新:2019年02月28日 - 15:02

许可协议: 转载请保留原文链接及作者。