Skip to content

Instantly share code, notes, and snippets.

@fromradio
Last active February 3, 2018 05:40
Show Gist options
  • Save fromradio/7d8b603125bcd2d9dbdf to your computer and use it in GitHub Desktop.
Save fromradio/7d8b603125bcd2d9dbdf to your computer and use it in GitHub Desktop.
Python版Kaggle教程

Python版Kaggle教程

Kaggle https://www.kaggle.com/ 是机器学习相关人士获取数据,验证算法的地方。上面有一块是Getting Started,里面有一个First Steps With Julia,旨在教会大家使用Julia语言进行机器学习。在尝试时候发现并不好用,这个教程所使用的Julia版本比较低,有些函数已经有了较大的改变。在纠结了半天Julia之后,决定使用已经比较熟悉的Python重实现了该教程 首先,该教程针对的问题是从谷歌街景的图片中鉴定字母。

谷歌街景字母

这个问题有别于传统的字母识别,因为每个字母的字体和背景都是不同的,该问题的训练集和测试集的下载请前往数据集。 下面我从Python的角度去完成Kaggle的Julia版教程。当然教程中也会使用到第三方库,有opencv,numpy,pandas和scikit-learn,这里暂时不介绍各个库的安装。 ##图片读取## 首先我们读取需要使用的库

import cv2
import numpy as np
import sys
import pandas as pd

我们希望所有的图片最后存储在一个numpy的矩阵当中,每一行为图片的像素值。为了得到统一的表达呢,我们将RGB三个通道的值做平均得到的灰度图像作为每个图片的 表示

img = cv2.imread(nameFile)
temp = np.mean(img, 2)

这样得到一个对应于图片的矩阵,我们可以通过把每一个这样的矩阵拉长为向量作为最后训练矩阵的一行

x[i,:] = np.reshape(temp, (1, imageSize))

其中imageSize是统一大小后的图片的大小。因此我们将上面的思路统一后得到下面的读取数据集的函数:

# typeData 为"train"或者"test"
# labelsInfo 包含每一个图片的ID
# 图片存储在trainResized和testResized文件夹内
# path是指向数据文件的路径
def read_data(typeData, labelsInfo, imageSize, path):
    labelsIndex = labelsInfo["ID"]
    x = np.zeros((np.size(labelsIndex), imageSize))
    for idx, idImage in enumerate(labelsIndex):
	    # 得到图片文件名并读取
        nameFile = path + "/" + typeData + "Resized/" + str(idImage) + ".Bmp"
        img = cv2.imread(nameFile)
        # 转化为灰度图
        temp = np.mean(img, 2)
        将图片转化为行向量
        x[idx, :] = np.reshape(temp, (1, imageSize))
    return x
    

因此读取训练集和测试集的代码为

path = "filepath"
imageSize = 400
trainlabels = pd.read_csv("%s/trainLabels.csv" % path)
testlabels = pd.read_csv("%s/sampleSubmission.csv" % path)
# 得到训练集的特征
xTrain = read_data(typeData, trainlabels, imageSize, path)
# 得到测试集的特征
xTest = read_data("test", testlabels, imageSize, path)

同时我们通过将character转化为ascii码作为训练标签

yTrain = trainlabels["Class"]
yTrain = [ord(x) for x in yTrain]

训练模型

这里通过使用scikit-learn里面自带的随机森林进行学习,设置了两个参数,其一是一次分裂的最大特征数和树的数目,训练代码如下

from sklearn.ensemble import RandomForestClassifier
rfc = RandomForestClassifier(n_estimators = 50, max_features = 20)
rfc.fit(xTrain, yTrain)

然后将训练得到的随机森林应用到测试集并且存储到结果文件中

predTest = rfc.predict(xTest)
predResult = [chr(x) for x in predTest]
testlabels["Class"] = predResult
testlabels.to_csv("result.csv",index = None)

当然,训练中也可以使用交叉验证去估计自己模型的准确度,这里就不再赘述。然后就可以上传得到的csv文件进行评分了,这里使用的随机森林结果得到的Categorization Accuracy大概为0.41左右。


Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment