[kaggle实战] Digit Recognizer -- 从KNN,LR,SVM,RF到深度学习

纸上得来终觉浅,还是要多实践呐!
之前看了很多入门的资料,如果现在让我来写写,我觉得我会选择”数字识别(digit recognizer)”作为例子,足够有趣,而且能说明很多问题。kaggle是个实践的好地方,python是门方便的语言,sklearn是个不错的库,文档很适合学习。那就用sklearn来实践一下机器学习,加深理解吧!至于机器学习具体的算法,这里就不赘述了,可以参考博客里其他文章。

kaggle数据读取

import pandas as pd
import numpy as np
import time
from sklearn.cross_validation import cross_val_score


#read data 
dataset = pd.read_csv("./data/train.csv")
X_train = dataset.values[0:, 1:]
y_train = dataset.values[0:, 0]


#for fast evaluation
X_train_small = X_train[:10000, :]
y_train_small = y_train[:10000]


X_test = pd.read_csv("./data/test.csv").values

这个代码可以作为模版来用。基本的数据读取,切分X和y,切分小数据用于快速迭代。发现训练有些久,打印个时间看看。离线评估cross validation肯定也是要的。
pandas的dataframe当然是个好东西,完整去学太费时间了,建议先把几个常用的学起来就好了吧。

对于数字识别,从”人脑学习”的角度可能是先识别笔画,然后根据笔画构造出来的关键结构去识别。比如8是上下两个圈圈。如果没学过机器学习,可能就从这个思路开始想了。然后,我们来对比看看机器学习是怎么做的。

KNN

KNN在这里有个很直观intuition,跟哪个数字比较像,那就判断为哪个数字。虽然看上去有点土,但道理上完全讲得通!另辟蹊径,倒是一个挺赞的思路。KNN需要记录原始训练样本,有点死记硬背的味道(属于Non-Parametric Models)。说不定阿猫阿狗之类的动物就是用这种方法来”学习”的。

作为一名机器学习调包客,调参侠,sklearn这个库已经选好了,然后就是调参了。文档在KNeighborsClassifier。用来学习确实不错。
为了加速预测,除了在《统计学习方法》看到过的kd tree结构,这里还提到了ball_tree。加上暴力法,那就有三种方法了,即 {‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’}。这个只影响预测时间,不影响训练精确度。
看了文档 (现在知道我说sklearn文档好什么意思吧)发现除了指定k,我们还可以指定半径,不过我试了下,因为这里是高维的,我也选不好半径到底选多少,如果太小就会出现一些样本在半径内没近邻,挺麻烦的。还是用K吧。
先试了一下把K调大,以为判断的时候使用多一些样本,准确率会好转,结果发现居然下降了!仔细想想,K调大,那些越不像的样本也混进来了。这样不行,权重要降低点才行。加上weights=’distance’吧,确实有效!
另一个就是metric=’minkowski’,闵可夫斯基,听起来怪怪的,其实就是更一般的距离公式而已,p=2时是欧拉距离,p=1就是曼哈顿距离。默认是2,调成1发现降了,调成3上升了点(发现速度急速下降!?影响kd tree的构建了?)。貌似不好直观解释,而且这个距离计算,显然还会影响weights=’distance’。这里的距离更直观解释其实是”相似度”,怎样衡量图像相似?貌似不太好说。可能可以用上图像处理方面的技术,这里就不深究了。
代码

#knn
from sklearn.neighbors import KNeighborsClassifier
#begin time
start = time.clock()

#progressing
knn_clf=KNeighborsClassifier(n_neighbors=5, algorithm='kd_tree', weights='distance', p=3)
score = cross_val_score(knn_clf, X_train_small, y_train_small, cv=3)

print( score.mean() )
#end time
elapsed = (time.clock() - start)
print("Time used:",int(elapsed), "s")
#k=3
#0.942300738697
#0.946100822903 weights='distance'
#0.9507
  • 9
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
以下是使用Python和Keras库来解决Kaggle Digit Recognizer比赛的代码示例: 首先,导入必要的库: ```python import pandas as pd import numpy as np from keras.models import Sequential from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPool2D from keras.optimizers import RMSprop from keras.preprocessing.image import ImageDataGenerator from sklearn.model_selection import train_test_split ``` 然后,读取和处理训练数据和测试数据: ```python train_data = pd.read_csv('train.csv') test_data = pd.read_csv('test.csv') # 将数据分成输入和输出 X_train = train_data.drop(['label'], axis=1) y_train = train_data['label'] # 将输入数据重塑为28x28像素 X_train = X_train.values.reshape(-1, 28, 28, 1) test_data = test_data.values.reshape(-1, 28, 28, 1) # 将像素值转换为浮点数并归一化 X_train = X_train.astype('float32') / 255 test_data = test_data.astype('float32') / 255 # 将输出数据转换为独热编码 y_train = pd.get_dummies(y_train).values ``` 接着,将数据分成训练集和验证集,设置数据增强器并构建卷积神经网络模型: ```python # 将数据分成训练集和验证集 X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.1) # 设置数据增强器 datagen = ImageDataGenerator( rotation_range=10, zoom_range = 0.1, width_shift_range=0.1, height_shift_range=0.1) # 构建卷积神经网络模型 model = Sequential() model.add(Conv2D(filters=32, kernel_size=(5,5), padding='Same', activation='relu', input_shape=(28,28,1))) model.add(Conv2D(filters=32, kernel_size=(5,5), padding='Same', activation='relu')) model.add(MaxPool2D(pool_size=(2,2))) model.add(Dropout(0.25)) model.add(Conv2D(filters=64, kernel_size=(3,3), padding='Same', activation='relu')) model.add(Conv2D(filters=64, kernel_size=(3,3), padding='Same', activation='relu')) model.add(MaxPool2D(pool_size=(2,2), strides=(2,2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(256, activation="relu")) model.add(Dropout(0.5)) model.add(Dense(10, activation="softmax")) # 定义优化器和损失函数 optimizer = RMSprop(lr=0.001, rho=0.9, epsilon=1e-08, decay=0.0) model.compile(optimizer=optimizer, loss="categorical_crossentropy", metrics=["accuracy"]) ``` 最后,使用训练集和验证集来训练和评估模型,并对测试数据进行预测: ```python # 训练模型 history = model.fit_generator(datagen.flow(X_train, y_train, batch_size=64), epochs=30, validation_data=(X_val, y_val), verbose=2) # 在验证集上评估模型 score = model.evaluate(X_val, y_val, verbose=0) print("Validation loss:", score[0]) print("Validation accuracy:", score[1]) # 对测试数据进行预测 predictions = model.predict(test_data) ``` 这就是一个简单的使用卷积神经网络和数据增强器来解决Kaggle Digit Recognizer比赛的代码示例。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值