Kaggle經典案例手——寫數字識別

一、數據集下載

進入kaggle官網找到Digit Recognizer界面如下:

下載之後數據是三個csv文件,test.csv是測試集,train.csv是訓練集,sample_submission.csv是提交樣例。最後我們的結果就是要按照sample_submission.csv這種格式提交。

二、初探數據

我自己一直比較喜歡用pycharm,但是pycharm默認的設置在打開很多行、列的時候會自動的默認省略了,所以需要一些設置才能查看全部的數據

import pandas as pd
# 顯示所有列
pd.set_option(display.max_columns, None)
# 顯示所有行
pd.set_option(display.max_rows, None)
# 設置value的顯示長度為100,默認為50
pd.set_option(max_colwidth, 100)
# 設置1000列的時候才換行
pd.set_option(display.width, 1000)

pandas是常用的python數據處理包 ,具體教程可以參考之前的pandas(好像忘了上傳後面再補上吧),它能夠把csv文件讀入成dataframe格式。看到初始的數據如下:

import pandas as pd

# 顯示所有列
pd.set_option(display.max_columns, None)
# 顯示所有行
pd.set_option(display.max_rows, None)
# 設置value的顯示長度為100,默認為50
pd.set_option(max_colwidth, 100)
# 設置1000列的時候才換行
pd.set_option(display.width, 1000)

train_data1 = pd.read_csv(F:\Kaggle_Dataset\Digit Recognizer\digit-recognizer\train.csv)
print(train_data1)

數據量太大了,讀取速度太慢了,讀取結果是這樣的

emmm,看上去好亂,也看不出來啥名堂。

那算了,用info試試看

print(train_data1.info())

結果如下:

看上去好像稍微好點了額,一共有42000行數據,785列數據。

算了算了,還是老老實實用excel打開看一下數據吧。

從上面表格可以看出,第一列是420001的向量trainLabel,是識別出來的數字,其他列42000784的特徵向量集trainData。

訓練集的數據大概就是上面這樣了,下面我們把label和維度分開。

# Train_data 中存儲了訓練集的784個特徵,Test_data存儲了測試集的784個特徵,train_lable則存儲了訓練集的標籤# 可以看出這道題是典型的監督學習問題
train_data1 = pd.read_csv(F:\Kaggle_Dataset\Digit Recognizer\digit-recognizer\train.csv)
train_data = train_data1.values[:,1:]train_label = train_data1.values[:,0]
test_data1 = pd.read_csv(F:\Kaggle_Dataset\Digit Recognizer\digit-recognizer\test.csv)
test_data = test_data1.values[:,0:]

三、數據展示

將訓練集數據展示出來

def showPic(data):
plt.figure(figsize=(7, 7))
# 查看前70幅圖
for digit_num in range(0, 70):
plt.subplot(7, 10, digit_num + 1)
grid_data = data[digit_num].reshape(28, 28) # reshape from 1d to 2d pixel array
plt.imshow(grid_data, interpolation="none", cmap="afmhot")
plt.xticks([])
plt.yticks([])
# plt.tight_layout()
plt.show()

showPic(train_data)

來看下當前的維度,一共有784個維度,如果不做降維處理的話,就是一共784維的特徵。 如果就把這784維特徵丟進去會是什麼樣的效果呢? 事實是,用原始數據集+不加特徵的選擇(或者降維)的方法,我用SVM方法跑了半天也沒出個結果。

四、PCA降維

PCA主成分分析方法

In a nutshell, PCA is a linear transformation algorithm that seeks to project the original features of our data onto a smaller set of features ( or subspace ) while still retaining most of the information.

大概意思是,主成分分析不會丟失原始信息,新的特徵是原始特徵的線性組合。

Explained Variance 累計貢獻率 又名 累計方差貢獻率 不要簡單理解為 解釋方差,它是 PCA 降維維度的重要指標,一般選取累計貢獻率在90%左右的維度作為PCA 降維的參考維度。在識別演算法的實現過程中,當我們求得某一資料庫各類別特徵參考維度時,取最大維度作為每一類特徵的維度,即可實現數據降維。現對數據求取累計貢獻率

def getcomponent(inputdata):
pca = PCA()
pca.fit(inputdata)
# 累計貢獻率 又名 累計方差貢獻率 不要簡單理解為 解釋方差!!!
EV_List = pca.explained_variance_
EVR_List = []
for j in range(len(EV_List)):
EVR_List.append(EV_List[j] / EV_List[0])
for j in range(len(EVR_List)):
if (EVR_List[j] < 0.10):
print(Recommend %d: % j)
return j

getcomponent(train_data)

結果為:

n_components:

意義:PCA演算法中所要保留的主成分個數n,也即保留下來的特徵個數n

類型:int 或者 string,預設時默認為None,所有成分被保留。

賦值為int,比如n_components=1,將把原始數據降到一個維度。

賦值為string,比如n_components=mle,將自動選取特徵個數n,使得滿足所要求的方差百分比。

whiten:

類型:bool,預設時默認為False

意義:白化,使得每個特徵具有相同的方差。

根據上面的測試結果

我們可以將主成分保留為22個。

代碼如下:

pca = PCA(n_components=22, whiten=True)
train_x = pca.fit_transform(train_data)
test_x = pca.transform(test_data) # 數據轉換
print(train_data.shape, train_x.shape)

對訓練集做個測試:

def test(train_x, train_label):
start = datetime.now()
model = svm.SVC(kernel=rbf, C=10)
metric = cross_val_score(model, train_x, train_label, cv=5, scoring=accuracy).mean()
end = datetime.now()
print(CV use: %f % ((end - start).seconds))
print(Offline Accuracy is %f % (metric))

test(train_x, train_label)

五、完整代碼

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn import svm
from datetime import datetime
from sklearn.model_selection import cross_val_score
import warnings

#刪除警告的

warnings.filterwarnings("ignore", category=FutureWarning, module="sklearn", lineno=196)

train = pd.read_csv(F:\Kaggle_Dataset\Disaster\titanic\train.csv)
# 顯示所有列
pd.set_option(display.max_columns, None)
# 顯示所有行
pd.set_option(display.max_rows, None)
# 設置value的顯示長度為100,默認為50
pd.set_option(max_colwidth, 100)
# 設置1000列的時候才換行
pd.set_option(display.width, 1000)

# Train_data 中存儲了訓練集的784個特徵,Test_data存儲了測試集的784個特徵,train_lable則存儲了訓練集的標籤
# 可以看出這道題是典型的監督學習問題
train_data1 = pd.read_csv(F:\Kaggle_Dataset\Digit Recognizer\digit-recognizer\train.csv)
train_data = train_data1.values[:,1:]
train_label = train_data1.values[:,0]
test_data1 = pd.read_csv(F:\Kaggle_Dataset\Digit Recognizer\digit-recognizer\test.csv)
test_data = test_data1.values[:,0:]
print(train_data)

def showPic(data):
plt.figure(figsize=(7, 7))
# 查看前70幅圖
for digit_num in range(0, 70):
plt.subplot(7, 10, digit_num + 1)
grid_data = data[digit_num].reshape(28, 28) # reshape from 1d to 2d pixel array
plt.imshow(grid_data, interpolation="none", cmap="afmhot")
plt.xticks([])
plt.yticks([])
# plt.tight_layout()
plt.show()

showPic(train_data)

# 初始數據有784個維度,現在需要對其降維處理,使用主成分分析法

def getcomponent(inputdata):
pca = PCA()
pca.fit(inputdata)
# 累計貢獻率 又名 累計方差貢獻率 不要簡單理解為 解釋方差!!!
EV_List = pca.explained_variance_
EVR_List = []
for j in range(len(EV_List)):
EVR_List.append(EV_List[j] / EV_List[0])
for j in range(len(EVR_List)):
if (EVR_List[j] < 0.10):
print(Recommend %d: % j)
return j

getcomponent(train_data)

pca = PCA(n_components=22, whiten=True)
train_x = pca.fit_transform(train_data)
test_x = pca.transform(test_data) # 數據轉換
print(train_data.shape, train_x.shape)

def test(train_x, train_label):
start = datetime.now()
model = svm.SVC(kernel=rbf, C=10)
metric = cross_val_score(model, train_x, train_label, cv=5, scoring=accuracy).mean()
end = datetime.now()
print(CV use: %f % ((end - start).seconds))
print(Offline Accuracy is %f % (metric))

test(train_x, train_label)

# 最終使用pca+svm
SVM_model = svm.SVC(kernel=rbf, C=10)
pca = PCA(n_components=22,whiten=True)
resultname = PCA_SVM
# modeltest(train_x,train_label,SVM_model)
SVM_model.fit(train_x,train_label)
test_y = SVM_model.predict(test_x)
pred = [[index + 1, x] for index, x in enumerate(test_y)]
np.savetxt(resultname+.csv, pred, delimiter=,, fmt=%d,%d, header=ImageId,Label,comments=)
print(預測完成)

把結果提交到了kaggle上看了一下。成績還是很一般啊。後面如果有時間就接著用卷積神經網路實現一次看看結果。先這樣吧。

推薦閱讀:

相關文章