小呆学数据分析——Digit Recognizer字体识别

0. 问题

MNIST 数据集来自美国国家标准与技术研究所, National Institute of Standards and Technology (NIST). 训练集 (training set) 由来自 250 个不同人手写的数字构成, 其中 50% 是高中学生, 50% 来自人口普查局 (the Census Bureau) 的工作人员. 测试集(test set) 也是同样比例的手写数字数据.
本题目就是通过带有标签的训练集预测出测试集的字体识别。
项目数据来自:https://www.kaggle.com/c/digit-recognizer/data

1. 数据初步分析

在python中导入数据,并观察

import pandas as pd
df = pd.read_csv(r'H:\DataAnalysis\digitrecognizer\train.csv')
print(df)
print(df[df.isnull().values])
print(df.isnull().any().describe())
       label  pixel0  pixel1  pixel2  ...  pixel780  pixel781  pixel782  pixel783
0          1       0       0       0  ...         0         0         0         0
1          0       0       0       0  ...         0         0         0         0
2          1       0       0       0  ...         0         0         0         0
3          4       0       0       0  ...         0         0         0         0
4          0       0       0       0  ...         0         0         0         0
...      ...     ...     ...     ...  ...       ...       ...       ...       ...
41995      0       0       0       0  ...         0         0         0         0
41996      1       0       0       0  ...         0         0         0         0
41997      7       0       0       0  ...         0         0         0         0
41998      6       0       0       0  ...         0         0         0         0
41999      9       0       0       0  ...         0         0         0         0

[42000 rows x 785 columns]
Empty DataFrame
Columns: [label, pixel0, pixel1, pixel2, pixel3, pixel4, pixel5, pixel6, pixel7, pixel8, pixel9, ...]
Index: []

[0 rows x 785 columns]

count       785
unique        1
top       False
freq        785
dtype: object

可以看出数据集中没有缺失值。

2. 第一轮学习

在第一轮学习中,通过sklearn库中的多种机器学习方法进行数据分析。

2.1 数据标准化

数据集的一行(即一个样本)是28x28像素点的组成灰度图片,所以像素点是0-255的整型数值,为了能够更好的进行数据挖掘,需要对其进行标准化转换。
在标准化转换可以选择最大值转换,也可以将其转化成One-Hot编码形式。

def feature(df, op='binary'):
    feature = df

    if op=='binary':
        feature[feature < 1] = 0
        feature[feature > 0] = 1
    elif op=='scale':
        from sklearn.preprocessing import MaxAbsScaler
        sc = MaxAbsScaler()
        feature = sc.fit_transform(feature)

    return feature
2.2 模型训练及预测

第一次尝试中采用K近邻法、支持向量机。

2.2.1 第一次尝试
2.2.1.1 k近邻法
if __name__=='__main__':

    # load train dataset
    df = pd.read_csv(r'H:\DataAnalysis\digitrecognizer\train.csv')
    train = df.values[:, 1:]
    train_label = df.values[:, 0]#.reshape(train.shape[0], 1)
    train_feature = feature(train, op='binary')

    # load test dataset
    predict_df = pd.read_csv(r'H:\DataAnalysis\digitrecognizer\test.csv')
    test_feature = feature(predict_df, op='binary')
    
    # k-neighbors classifier
    knn_clf = KNeighborsClassifier(n_neighbors=5, algorithm='kd_tree', weights='distance', p=2)
    knn_clf.fit(train_feature, train_label)

    knn_predict_label = knn_clf.predict(test_feature)
    submission = np.c_[list(range(1, knn_predict_label.shape[0]+1)), knn_predict_label]
    submission = pd.DataFrame(submission, columns=['ImageId', 'Label'])
    submission.to_csv(r'H:\DataAnalysis\digitrecognizer\submission3.csv', index=False)

将结果上传到kaggle,准确率得分是96.385%,不是很高。如果将数据标准化用scale,可以提高一些准确率(从96.385%到96.9%)。
在这里插入图片描述
                   Figure 1: feature option set binary
在这里插入图片描述
                    Figure 2: feature option set scale

2.2.1.2 支持向量机

代码如下

if __name__=='__main__':

    # load train dataset
    df = pd.read_csv(r'H:\DataAnalysis\digitrecognizer\train.csv')
    train = df.values[:, 1:]
    train_label = df.values[:, 0]
    train_feature = feature(train, op='scale')

    # load test dataset
    predict_df = pd.read_csv(r'H:\DataAnalysis\digitrecognizer\test.csv')
    test_feature = feature(predict_df, op='scale')

    # support vector machine
    svm_clf = SVC(C=0.5, kernel='rbf', gamma='scale')
    svm_clf.fit(train_feature, train_label)
    svm_predict_label = svm_clf.predict(test_feature)
    submission = np.c_[list(range(1, svm_predict_label.shape[0]+1)), svm_predict_label]
    submission = pd.DataFrame(submission, columns=['ImageId', 'Label'])
    submission.to_csv(r'H:\DataAnalysis\digitrecognizer\submission_svm_opscale.csv', index=False)

在支持向量机方法中数据标准化采用scale,准确率为96.957%,和k近邻法差不多。
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力的骆驼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值