机器学习xgboost实战—手写数字识别

1、xgboost 安装


安装问题这里就不再做赘述,可参考前面写的博文:
http://blog.csdn.net/eddy_zheng/article/details/50184563

2、手写数字识别


这里先说明下,xgboost用作手写字符的分类效果并不是最好的,这里仅仅作为一个教学的实例。本文中用的数据集来自kaggle 的新手入门数字识别(https://www.kaggle.com/c/digit-recognizer),我用 xgboost 实现的准确率只有95%+(并未调参 ,可能并未得到最佳的效果)。用深度学习 CNN 来做,可以达到99%+。

在数据建模中,当我们有数个连续值特征时,Boosting分类器是最常用的非线性分类器。它将成百上千个分类准确率较低的树模型组合起来,成为一个准确率很高的模型。这个模型会不断地迭代,每次迭代就生成一颗新的树。然而,在数据集较大较复杂的时候,我们可能需要几千次迭代运算,这将造成巨大的计算瓶颈。xgboost正是为了解决这个瓶颈而提出。单机它采用多线程来加速树的构建,

因此,写这篇博文知识为了让初次使用xgboost的朋友能够更快的上手。

2.1数据获取

数据集放在这里了,下载对应的手写数字的 train.csv与test.csv。以后相关数据集都放到这里,持续更新:
http://blog.csdn.net/Eddy_zheng/article/details/50496194

2.2 代码实现

基于python实现的,代码阅读可能需要一点python的功底,不过关于xgboost的参数我都尽力做了解释,都是自己学习的见解,有不准确的地方大家可以指出,共同学习。当然要更深刻的理解参数,可以看看xgboost的理论推导,了解每个参数是怎么来的?用来做什么都的?
官方地址(http://xgboost.readthedocs.org/en/latest/parameter.html

#coding=utf-8
"""
Created on 2015/12/25
By Eddy_zheng
"""
import xgboost as xgb
import pandas as pd
import time 
import numpy as np


now = time.time()

dataset = pd.read_csv("../input/train.csv") # 注意自己数据路径

train = dataset.iloc[:,1:].values
labels = dataset.iloc[:,:1].values

tests = pd.read_csv("../input/test.csv") # 注意自己数据路径
#test_id = range(len(tests))
test = tests.iloc[:,:].values


params={
'booster':'gbtree',
# 这里手写数字是0-9,是一个多类的问题,因此采用了multisoft多分类器,
'objective': 'multi:softmax', 
'num_class':10, # 类数,与 multisoftmax 并用
'gamma':0.05,  # 在树的叶子节点下一个分区的最小损失,越大算法模型越保守 。[0:]
'max_depth':12, # 构建树的深度 [1:]
#'lambda':450,  # L2 正则项权重
'subsample':0.4, # 采样训练数据,设置为0.5,随机选择一般的数据实例 (0:1]
'colsample_bytree':0.7, # 构建树树时的采样比率 (0:1]
#'min_child_weight':12, # 节点的最少特征数
'silent':1 ,
'eta': 0.005, # 如同学习率
'seed':710,
'nthread':4,# cpu 线程数,根据自己U的个数适当调整
}

plst = list(params.items())

#Using 10000 rows for early stopping. 
offset = 35000  # 训练集中数据50000,划分35000用作训练,15000用作验证

num_rounds = 500 # 迭代你次数
xgtest = xgb.DMatrix(test)

# 划分训练集与验证集 
xgtrain = xgb.DMatrix(train[:offset,:], label=labels[:offset])
xgval = xgb.DMatrix(train[offset:,:], label=labels[offset:])

# return 训练和验证的错误率
watchlist = [(xgtrain, 'train'),(xgval, 'val')]


# training model 
# early_stopping_rounds 当设置的迭代次数较大时,early_stopping_rounds 可在一定的迭代次数内准确率没有提升就停止训练
model = xgb.train(plst, xgtrain, num_rounds, watchlist,early_stopping_rounds=100)
#model.save_model('./model/xgb.model') # 用于存储训练出的模型
preds = model.predict(xgtest,ntree_limit=model.best_iteration)

# 将预测结果写入文件,方式有很多,自己顺手能实现即可
np.savetxt('submission_xgb_MultiSoftmax.csv',np.c_[range(1,len(test)+1),preds],
                delimiter=',',header='ImageId,Label',comments='',fmt='%d')


cost_time = time.time()-now
print "end ......",'\n',"cost time:",cost_time,"(s)......"

2.3 测试训练模型

训练图示:
这里写图片描述

结果提交 kaggle 验证:
这里写图片描述

2.4总结

简单应用于手写字符分类识别,希望通过这个简单的应用,能够学习调试模型,达到举一反三的效果。

  • 8
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 机器学习基于CNN数字识别是一项实验性研究,该技术可以通过训练算法和图像数据集,自动识别和分类数字。下面我将用300字向您介绍相关实验过程。 实验的第一步是准备数据集,可以使用MNIST数据集,该数据集包含大量数字图像样本。然后,我们将数据集分为训练集和测试集,用于训练和评估模型性能。 接下来,我们使用CNN模型进行数字识别的训练。CNN(卷积神经网络)是一种常用的深度学习模型,特别适用于图像识别。该模型可以自动提取图像中的特征,并进行分类。我们通过不断调整模型的结构和参数,让其能够更好地适应数字识别任务。 训练过程中,我们将训练集的图像输入到CNN模型中,模型通过反向传播算法不断调整权重和偏置,以最小化预测结果与实际标签之间的误差。随着训练的进行,模型逐渐优化,使其在测试集上的准确度得到提升。 完成训练后,我们将使用测试集对模型进行评估。通过与实际标签对比,可以计算出模型的准确率、精确度、召回率等性能指标,从而评估模型的表现。 最后,我们可以使用训练好的模型进行数字识别。将数字图像输入到模型中,模型将自动输出识别结果。 这项实验的目的是将机器学习和CNN技术应用于数字识别,提高识别的准确度和速度。它在人工智能、图像处理等领域具有广泛的应用前景,可以为我们提供更多便利和智能化的服务。 ### 回答2: 机器学习是一种可以让计算机通过学习和训练数据来完成特定任务的方法。而基于CNN(卷积神经网络)的数字识别实验即利用机器学习的方法来实现对数字的自动识别。 首先,我们需要准备一个包含大量数字的数据集,这些数据集中既包含数字图片,也包含对应的标签。在该实验中,我们需要将每个数字图片与其对应的数字标签建立联系。 接下来,我们可以利用CNN模型来训练和优化识别数字的算法。CNN是一种专门应用于图像处理和识别的深度学习模型。通过分析数字图片中不同的特征和模式,CNN可以学习到一种有效的表示数字的方式。 在训练过程中,我们将数据集划分为训练集和验证集,用于训练和评估模型的性能。通过迭代训练,自动调整模型的参数和权重,使其逐渐提高识别数字的准确率。 完成训练后,我们可以用测试集来评估模型的性能。测试集是一个模型从未见过的数据集,用于模拟实际应用场景。通过与标签比较,我们可以计算出模型在测试集上的准确率,来评判其对数字识别的能力。 最后,我们可以使用训练好的CNN模型来进行实际的数字识别。输入一张数字图片,经过模型的处理和分析,输出对应的数字。 综上所述,基于CNN的数字识别实验利用机器学习的方法训练和优化模型,以实现自动识别数字的功能。该实验将深度学习和图像处理的技术应用于数字识别,具有较高的准确率和广泛的应用前景。 ### 回答3: 机器学习是一种能够通过训练模型来让计算机对数据进行自动学习的技术。基于卷积神经网络(Convolutional Neural Network,CNN)的数字识别机器学习的一项实验。 首先,为了进行数字识别实验,我们需要准备一个数字的数据集。这个数据集包含了许多数字的图片,每张图片都有对应的标签,表示图片所代表的数字。 接着,我们将利用CNN来构建一个模型。CNN是一种深度学习架构,它能够提取图像的特征并用于分类任务。CNN通常由多个卷积层、池化层和全连接层组成。在数字识别实验中,我们可以设计一个具有几个卷积层和全连接层的CNN模型。 然后,我们需要将数据集分为训练集和测试集。训练集用于训练模型,测试集用于评估模型的性能。在训练过程中,模型会根据训练集的数据不断调整自身的参数,以使其能够更好地对数字进行识别。训练的过程中需要定义损失函数和优化器来指导模型的参数更新。 训练完成后,我们将使用测试集来评估模型的性能。评估指标可以是准确率,即模型正确预测的数字的比例。较高的准确率表示模型对数字识别能力较强。 此外,为了提高模型的性能,我们还可以采取一些策略,如数据增强、超参数调节等。数据增强可以通过对训练集进行旋转、平移、缩放等操作,生成更多的训练样本,以增加模型的泛化能力。超参数调节可以通过调整模型的学习率、批大小等参数,以找到更好的模型配置。 通过这样的实验,我们可以验证基于CNN的数字识别模型的效果,并探索机器学习在图像识别任务中的应用潜力。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值