進入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主成分分析方法
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)
# 初始數據有784個維度,現在需要對其降維處理,使用主成分分析法
# 最終使用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上看了一下。成績還是很一般啊。後面如果有時間就接著用卷積神經網路實現一次看看結果。先這樣吧。
推薦閱讀: