簡單的收穫和理解

比賽鏈接 http://bdc.saikr.com/c/cql/34541

比賽提供的數據已經被分成了訓練集和測試集,這樣我們就省去了劃分的步驟,首先數據裏面包括了序號、軌跡的座標和時間(x,y,t)、參考點(x_,y_)、判斷是機器還是人行爲的0和1,然後比賽的數據的儲存文件是txt,所以需要我們對數據進行處理,劃分出我們需要的特徵:

import numpy as np
import pandas as pd
train = pd.read_table("E:\比賽分享\data\dsjtzs_txfz_training_sample.txt", sep=' ', names=['id','numb','goal','label'])

#將數據導入並儲存在命名爲train的字典中,可以看到軌跡的座標和時間以字符串的形式儲存在了‘numb’的列下,參考點的座標以字符串的形式儲存在了名爲‘goal’的列下,如圖:


然後接下來我們將這兩個細分一下:

train['numb'] = train['numb'].apply(lambda x:[list(map(float,point.split(','))) for point in x.split(';')[:-1]])
train['goal'] = train['goal'].apply(lambda x: list(map(float,x.split(","))))	


#我們一層一層的分析代碼,首先apply函數,是對train['numb']的數據進行lambda匿名函數的運算,然後中括號裏面是先將train['numb']通過';'將大字符串分割成一個個類似於"x,y,t"小的字符串,再利用循環將一個個小的字符串通過"."分解出一個個小的數來,這兩步相當於將一個'numb'列分解成了一個二維數組,然後我們將相應的x,y,t,x_,y_進行賦值:

df = pd.DataFrame()
df['x'] = train['numb'].apply(lambda x:np.array(x)[:,0])
df['y'] = train['numb'].apply(lambda x:np.array(x)[:,1])
df['t'] = train['numb'].apply(lambda x:np.array(x)[:,2])
df['x_'] = np.array(train['goal'].tolist())[:,0]
df['y_'] = np.array(train['goal'].tolist())[:,1]

#然後我利用matplotlib庫將軌跡畫出:

import matplotlib.pyplot as plt

for i in range(5):
    x = list(df['x'])[i]
    y = list(df['y'])[i]

    plt.plot(x, y)
    plt.show()
下面是兩個軌跡

數據分割好以後接下來就是提取特徵了,我提取了大概40個特徵,然後就是對特徵進行篩選我使用的是SelectBest ,下面是一個簡單代碼

from sklearn.feature_selection import SelectKBest

from sklearn.feature_selection import chi2

y = train['label']
del train['label']
new_feature = SelectKBest(chi2, k=2).fit_transform(train,y)
new_feature['label'] = y
最後篩選出來30多個特徵,後面還有模型融合等,簡單說一下我對這個模型的簡單理解,首先是這個圖片


第一步要做的是選擇一個模型,其次將訓練集分成4比1的兩部分,然後用4的那部分進行訓練,訓練得到的模型用1那部分測試,然後使用測試集進行測試。然後像圖片中示意的一樣,將1的部分換一下,在進行同樣的訓練和測試,這樣的工作需要完成5次,也就是說保證內訓練集的5個小部分每一個小部分都獨立被測試過。接下來便需要將那五次訓練分出來的五個1的部分組層一個新的訓練集,測試集五次測試的平均值在組成一個新的測試集。這樣用新的訓練集和測試集做爲下一個模型訓練的訓練集和測試集,所以說需要融合n個模型,則需要執行n-1這個步驟。以上只是一些簡單的理解和收穫,以後會更新出新的知識的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章