Background: 每个手写数字的图,对应于一张高*宽为28*28像素的图片,形成一个28*28pixel的矩阵,写成一维的1*784pixel的矩阵。每个像素有与之对应的像素值,为0~255之间的整数,表示该像素的亮暗,值越大像素越暗。每个像素值对应于一个特征,Digit recognizer 通过学习这个矩阵的特征来对数字进行分类。

【label 对应手写的数字,pixel0~pixel783为该数字的1*784pixel矩阵】文件格式csv

1.数据可视化。看看编号40的数字是什么~

2.分析原始数据。可见这是一个类别平衡的多分类问题。

3.检查数据,数据完整。

4.数据归一化处理

注意不同的算法对数据有不同的要求。

5.分类算法

这里以简单易懂的KNN为例,先选择合适的K值,以及为了避免过拟合,进行模型评估。

6.参数选择,模型评估——k折交叉验证法

Python sklearn.model_selection提供了

不同于k-fold的是,stratified采用分层采样。

def cross_validation(K,X,y):

knn=neighbors.KNeighborsClassifier(K,weights='distance')

score=cross_val_score(knn,X,y,cv=5,scoring='accuracy')

return np.array(score).mean()

接着对不同K值模型进行循环选择最优。

for K in k_range:

k_score.append(cross_validation(K,X,y))

最后得到最优k==3,再用全部数据训练模型,精度0.969。

7. PCA主成分分析进行特征降维,去除噪声。

def decomposition(n,matrice):

pca=PCA(n_components=n)

pca.fit(matrice)

matrice_pca=np.array(pca.transform(matrice))

return matrice_pca,sum(pca.explained_variance_ratio_)

n_score=[]

n_vr=[]

n_array=[5,10,15,20,25,50,100,200,500]

for n in n_array:

train_X,vr=decomposition(n,X)

n_score.append(cross_validation(3,train_X,y))

n_vr.append(vr)

plt.plot(n_array,n_score,'r',label='Accuracy')

plt.plot(n_array,n_vr,'g',label='Variance ratio')

plt.legend(loc='center',fontsize='large')

plt.xlabel('n_components',size=15)

#plt.xscale("log")

plt.show

将特征维度降至20的时候,保留大部分信息(Variance ratio),训练精度开始趋于饱和。

选n_components为60,精度提升到0.974。使用支持向量机,精度提升到0.982。

ps:CNN能达到0.99以上的精度。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐