1. 程式人生 > >大資料挑戰賽(大佬篇)

大資料挑戰賽(大佬篇)

相對於我的雜亂無章,dalao們做比賽時將每個環節分檔案處理,這樣好看也好改,分別分為以下幾個步驟:

1.資料處理

2.特徵選擇

3.調參

4.模型融合

5.過擬合的處理

在做特徵提取時,對種可以提取得到的資料都提取了12種特徵,一共提取了大概一百多個特徵。。。可能這就是我和大佬的差距。

這是特徵提取的程式碼:

# -*- coding: utf-8 -*-
"""
Created on Sat Jul  8 10:45:13 2017

@author: Yang

E-mail: [email protected]
"""
#執行時間 30min
import pandas as pd
import numpy as np

#from sklearn.externals.joblib import Parallel, delayed
import os
import warnings
import json
warnings.filterwarnings("ignore")

#原始資料處理
def data_process(data):
	data['point'] = data['point'].apply(lambda x:[list(map(float,point.split(','))) for point in x.split(';')[:-1]])
	data['target'] = data['target'].apply(lambda x: list(map(float,x.split(","))))	
	#提取 x座標 y座標 t 目標點x座標  目標點y座標 
	df = pd.DataFrame()
	df['x'] = data['point'].apply(lambda x:np.array(x)[:,0])
	df['y'] = data['point'].apply(lambda x:np.array(x)[:,1])
	df['t'] = data['point'].apply(lambda x:np.array(x)[:,2])
	df['target_x'] = np.array(data['target'].tolist())[:,0]
	df['target_y'] = np.array(data['target'].tolist())[:,1]

	return df	
#差分處理
def data_diff(data,name_list):
	for name in name_list:
		data['diff_'+name] = data[name].apply(lambda x: pd.Series(x).diff().dropna().tolist())
		data['diff_'+name] = data['diff_'+name].apply(lambda x: [0] if x==[] else x)#!!注意 一個點的情況
	return data	
	
#獲取距離資料
def get_dist(data):
	dist_target = []
	dist = []
	dist_x_target = []
	dist_y_target = []

	#各點與目標點的距離
	for x,y,target_x,target_y in zip(data['x'],data['y'],data['target_x'],data['target_y']):
		dist_target.append(np.sqrt((x-target_x)**2 + (y-target_y)**2))	
	#兩點之間的距離
	for x,y in zip(data['diff_x'], data['diff_y']):
		dist.append(np.sqrt(np.array(x)**2+np.array(y)**2))	
	#各點x座標與目標點x座標的距離
	for x,target_x in zip(data['x'], data['target_x']):
		dist_x_target.append(np.sqrt((x-target_x)**2))
	#各點y座標與目標點y座標的距離
	for y,target_y in zip(data['y'], data['target_y']):
		dist_y_target.append(np.sqrt((y-target_y)**2))
		
	data['dist_target'] = dist_target
	data['dist'] = dist
	data['dist_x_target'] = dist_x_target
	data['dist_y_target'] = dist_y_target

	return data
	
#獲取速度資料
def get_v(data):
	v = []
	v_x = []
	v_y = []
	#獲取兩點之間的速度
	for dist, t in zip(data['dist'], data['diff_t']):
		v0 = dist/t
		v0 = list(map(lambda x: 0 if x==np.inf or x==-np.inf else x, v0))#!! 注意除數為0的情況
		v.append(v0)
	#獲取兩點x座標之間的速度
	for x, t in zip(data['diff_x'], data['diff_t']):
		v1 = np.array(x)/np.array(t)
		v1 = list(map(lambda x: 0 if x==np.inf or x==-np.inf or  np.isnan(x) else x, v1))
		v_x.append(v1)
	#獲取兩點之間的速度
	for y, t in zip(data['diff_y'], data['diff_t']):
		v2 = np.array(y)/np.array(t)
		v2 = list(map(lambda x: 0 if x==np.inf or x==-np.inf or np.isnan(x) else x, v2))
		v_y.append(v2)
		
	data['v'] = v
	data['v_x'] = v_x
	data['v_y'] = v_y
	
	return data
	
#獲取加速度資料
def get_a(data):
	a = []
	a_x = []
	a_y = []
	#獲取兩點之間的加速度
	for v, t in zip(data['diff_v'], data['diff_t']):
		v = np.array(v)
		t = np.array(t)
		a_t = (t[:-1] + t[1:])/2
		a0 = v/a_t	
		a0 =	list(map(lambda x: 0 if x==np.inf or x==-np.inf else x, a0))#!! 注意除數為0的情況
		#!!注意 列表為空
		if a0==[] : 	
			a0=[0]
		a.append(a0)	
	#獲取兩點x座標之間的加速度
	for v_x, t in zip(data['diff_v_x'], data['diff_t']):
		v_x = np.array(v_x)
		t = np.array(t)
		a_t = (t[:-1] + t[1:])/2
		a1 = v_x/a_t	
		a1 =	list(map(lambda x: 0 if x==np.inf or x==-np.inf else x, a1))#!! 注意除數為0的情況
		if a1==[] : 	
			a1=[0]
		a_x.append(a1)					
	#獲取兩點x座標之間的加速度
	for v_y, t in zip(data['diff_v_y'], data['diff_t']):
		v_y = np.array(v_y)
		t = np.array(t)
		a_t = (t[:-1] + t[1:])/2
		a2 = v_y/a_t	
		a2 =	list(map(lambda x: 0 if x==np.inf or x==-np.inf else x, a2))#!! 注意除數為0的情況
		if a2==[] : 	
			a2=[0]
		a_y.append(a2)					
	
	data['a'] = a
	data['a_x'] = a_x
	data['a_y'] = a_y

	return data	
def get_feature(data, name):
	dfGroup=pd.DataFrame()
	dfGroup[name+'_start'] = data.apply(lambda x: x[0])
	dfGroup[name+'_end'] = data.apply(lambda x: x[len(x)-1])
	dfGroup[name+'_max'] = data.apply(lambda  x: max(x))
	dfGroup[name+'_min'] = data.apply(lambda  x: min(x))
	dfGroup[name+'_ptp'] = dfGroup[name+'_max'].sub(dfGroup[name+'_min'])
	dfGroup[name+'_mean'] = data.apply(lambda  x: np.mean(x))
	dfGroup[name+'_std'] = data.apply(lambda  x: np.std(x))
	dfGroup[name+'_cv'] = dfGroup[name+'_std'].div(dfGroup[name+'_mean'], fill_value=0)
	dfGroup[name+'_cv'] = dfGroup[name+'_cv'].replace([np.inf,-np.inf],[0,0])
	dfGroup[name+'_cv'] = dfGroup[name+'_cv'].fillna(0)
	dfGroup[name+'_Q1'] = data.apply(lambda  x: np.percentile(x, 0.25))
	dfGroup[name+'_Q2'] = data.apply(lambda  x: np.percentile(x, 0.5))
	dfGroup[name+'_Q3'] = data.apply(lambda  x: np.percentile(x, 0.75))
	dfGroup[name+'_interRan'] = dfGroup[name+'_Q3'].sub(dfGroup[name+'_Q1'])
	dfGroup[name+'_skew'] = data.apply(lambda  x: pd.Series(x).skew()).fillna(0)
	dfGroup[name+'_kurt'] = data.apply(lambda  x: pd.Series(x).kurt()).fillna(0)
    
	return dfGroup

def get_point_feature(df):
    
	point_x = get_feature(df['x'], 'x')
	point_y = get_feature(df['y'], 'y')
	point = pd.concat([point_x, point_y], axis=1)
    
	point['target_x'] = df['target_x'].values
	point['target_y'] = df['target_y'].values
    

	return point
    
def get_dist_feature(df):
	dist_target = get_feature(df['dist_target'], 'dist_target')
	dist_x_target =  get_feature(df['dist_x_target'], 'dist_x_target')
	dist_y_target =  get_feature(df['dist_y_target'], 'dist_y_target')
	diff =  get_feature(df['dist'], 'dist')
	diff_x =  get_feature(df['diff_x'], 'diff_x')
	diff_y =  get_feature(df['diff_y'], 'diff_y')
    
	dist = pd.concat([dist_target, dist_x_target, dist_y_target,
                      diff, diff_x, diff_y], axis=1)

	return dist

def get_time_feature(df):
	t = get_feature(df['t'], 't')
	t_diff = get_feature(df['diff_t'], 'diff_t')
    
	t = pd.concat([t, t_diff], axis=1)

	return t

def get_v_feature(df):
	v_x = get_feature(df['v_x'], 'v_x')
	v_y = get_feature(df['v_y'], 'v_y')
	v = get_feature(df['v'], 'v')
	v_diff_x = get_feature(df['diff_v_x'], 'diff_v_x')
	v_diff_y = get_feature(df['diff_v_y'], 'diff_v_y')
	v_diff = get_feature(df['diff_v'], 'diff_v')
    
	v = pd.concat([v_x, v_y, v,
                   v_diff_x, v_diff_y, v_diff], axis=1)

	return v
    
def get_a_feature(df):
	a_x = get_feature(df['a_x'], 'a_x')
	a_y = get_feature(df['a_y'], 'a_y')
	a = get_feature(df['a'], 'a')
    
	a = pd.concat([a_x, a_y, a], axis=1)
	
	with open('a_feature.json', 'w',encoding='utf-8')as f:
		json.dump(list(a.columns), f, ensure_ascii=False)
	file = open('a_feature.json','w',encoding='utf-8') 
	json.dump(list(a.columns),file,ensure_ascii=False)  
	file.close() 

	return a
def get_other_feature(data):
	dfGroup=pd.DataFrame()
	dfGroup['point_count'] = data['x'].apply(lambda x: len(x))
	dfGroup['x_back_num'] = data['diff_x'].apply(lambda x: min( (np.array(x) > 0).sum(), (np.array(x) < 0).sum()))
	dfGroup['y_back_num'] = data['diff_y'].apply(lambda x: min( (np.array(x) > 0).sum(), (np.array(x) < 0).sum()))
	dfGroup['x_equal_0'] = data['diff_x'].apply(lambda x:  (np.array(x) == 0).sum())
	dfGroup['y_equal_0'] = data['diff_y'].apply(lambda x:  (np.array(x) == 0).sum())
	dfGroup['equal_0'] = data['dist'].apply(lambda x: (np.array(x) == 0).sum())
	return dfGroup
	
def make_df(df):
	df = data_process(df)
	df = data_diff(df, ['x', 'y', 't'])
	df = get_dist(df)
	df = get_v(df)
	df = data_diff(df, ['v', 'v_x', 'v_y'])
	df = get_a(df)
	
    
	point = get_point_feature(df[['x','y','target_x','target_y']])
	dist = get_dist_feature(df[['diff_x', 'diff_y','dist_target', 'dist', 'dist_x_target', 'dist_y_target']])
	t = get_time_feature(df[['t','diff_t']])
	v = get_v_feature(df[['v', 'v_x','v_y', 'diff_v', 'diff_v_x','diff_v_y']])
	a = get_a_feature(df[['a','a_x', 'a_y']])
	other = get_other_feature(df)
	
	df1 = pd.concat([point, dist, t, v,a,other], axis=1)
	return df1.fillna(0)    

def save_df(df,name):
	global path
	global id_data
	global label
	global train_len
	global test_len
	df['id'] = id_data
	train = df.ix[:train_len-1,:]
	train['label'] = label
	test = df.ix[train_len:train_len+test_len-1,:]
	testB = df.ix[train_len+test_len:,:]

	train.to_csv(path+"\\" +name+ "train.csv", index=None)
	test.to_csv(path+"\\" +name+"test.csv", index=None)
	testB.to_csv(path+"\\" +name+"testB.csv", index=None)
	
def input_df():
	#set path
	path = r'G:\比賽分享\data'
	train_path = os.path.join(path, 'dsjtzs_txfz_training.txt')
	test_path = os.path.join(path, 'dsjtzs_txfz_test1.txt')
	testB_path = os.path.join(path, 'dsjtzs_txfz_testB.txt')
	#load data
	train = pd.read_csv(train_path, sep=' ', names=['id','point', 'target','label']).ix[:100]#實際執行 去掉 .ix[:100]																					
	test = pd.read_csv(test_path, sep=' ', names=['id','point', 'target']).ix[:100]
	testB =pd.read_csv(testB_path, sep=' ', names=['id','point', 'target']).ix[:100]
	    
	#合併資料集
	label=train['label'].copy()
	train.drop('label',axis=1,inplace=True)
	df = pd.concat([train, test, testB], ignore_index=True)
	id_data = df['id'].copy()
	df.drop('id',axis=1,inplace=True)
	
	train_len = len(train)
	test_len = len(test)
	
	global path
	global id_data
	global label
	global train_len
	global test_len
	return df
		
if __name__ == '__main__':
	
	
	
	df = input_df()
	df = make_df(df)

	save_df(df,'all')
這是最基礎,也是最重要的環節,在這之後,需要進行特徵選擇來篩選掉無用的特徵,

可以使用LDA、PCA進行特徵提取,然後使用filter、wrapper封裝器進行特徵選擇。下面是相關部落格:

對於PCA、filter的描述(可能)有後續更新,看我心情吧~

以上兩個步驟,基本上完成了比賽的一半,接下來就是調參和模型融合以及過擬合的處理

對於調參這門玄學,我目前還沒有參透,最多隻會使用grid_scearch暴力搜尋一下,所以這部分我先不講。

模型融合,就是使用xgboost等一系列大殺器對資料進行擬合,這個在上個部落格已經詳細提到。

下面介紹幾個手動模型融合的方法:

1.投票法(VOTE)

多個模型進行預測,把他們的結果融合起來

對於分類問題 相當於取眾數

對於迴歸問題 可以取平均值

2.Stacking

相比 Blending,Stacking 能更好地利用訓練資料。以 5-Fold Stacking 為例,它的基本原理如圖所示:

Stacking

整個過程很像 Cross Validation。首先將訓練資料分為 5 份,接下來一共 5 個迭代,每次迭代時,將 4 份資料作為 Training Set 對每個 Base Model 進行訓練,然後在剩下一份 Hold-out Set 上進行預測。同時也要將其在測試資料上的預測儲存下來。這樣,每個 Base Model 在每次迭代時會對訓練資料的其中 1 份做出預測,對測試資料的全部做出預測。5 個迭代都完成以後我們就獲得了一個 #訓練資料行數 x #Base Model 數量

 的矩陣,這個矩陣接下來就作為第二層的 Model 的訓練資料。當第二層的 Model 訓練完以後,將之前儲存的 Base Model 對測試資料的預測(因為每個 Base Model 被訓練了 5 次,對測試資料的全體做了 5 次預測,所以對這 5 次求一個平均值,從而得到一個形狀與第二層訓練資料相同的矩陣)拿出來讓它進行預測,就得到最後的輸出。

再接下來就是對過擬合的處理,通過繪製learning_carve等評分曲線來觀察過擬合程度,根據相應的特點,我們採取不同方式處理過擬合:

http://blog.csdn.net/heyongluoyao8/article/details/49429629

大致過程到此結束。

coding the new world

與君共勉

相關推薦

資料挑戰賽

相對於我的雜亂無章,dalao們做比賽時將每個環節分檔案處理,這樣好看也好改,分別分為以下幾個步驟: 1.資料處理 2.特徵選擇 3.調參 4.模型融合 5.過擬合的處理 在做特徵提取時,對種可以提取得到的資料都提取了12種特徵,一共提取了大概一百多個特徵。。。可能這就是我

2018中國高校計算機大賽——資料挑戰賽合作方:快手

賽程安排       本次大賽分為初賽、複賽和決賽三個階段,其中初賽均由參賽隊伍下載資料在本地進行演算法設計和除錯,並通過大賽報名官網提交結果檔案;複賽要求參賽者在科賽網的K-Lab平臺上進行資料分析和處理,可使用平臺提供的計算資源和工具包;決賽要求參賽者進行現場演示和答辯。初賽(5月26日—6月30日) 

2018中國高校計算機大賽—資料挑戰賽top2解題方案

經過激烈的競爭,從倆千多人,一千二百多支隊伍,從初賽到複賽再到決賽的答辯,最終拿到了第二的名次,雖然有點遺憾,但參加這個比賽收穫了很多,對大資料領域又有了新的認識,在過程中,最重要的是堅持,有新的想法要敢於嘗試。總結一下,個人覺得資料探勘類的題目更多的應該先去了解資料,理

資料資料治理|資料治理第九

   魅族大資料平臺的一個技術分享活動,話題是《大資料治理之路》.魅族大資料平臺工作人員分享了一些他們的大資料治理經驗,很有內容。 首先,他們整理了一個治理流程,架構圖 然後,依照架構圖,大致講了架構圖中的每個模組,以及將模組串聯起來的一個管理流程,流程圖如下: 然

PayPal高階工程總監:讀完這100論文 就能成資料高手附論文下載

Big Data technology has been extremely disruptive with open source playing a dominant role in shaping its evolution. While on one hand it has been disrup

資料面試HR電話瞭解

1什麼是HA叢集? 所謂HA,即高可用(7*24小時不中斷服務) HA叢集是hadoop高可用叢集,即有兩個namenode,一個active,一個stanby,active的name掛掉之後,stanby的namenode就會切換成active, 最關鍵的是消除單節點故障 雙namenode協調工作

資料測試開源優測

什麼是BI? BI(Business Intelligence)即商務智慧,它是一套完整的解決方案,用來將企業中現有的資料(原始資料或商業資料或業務資料等)進行有效的整合,快速準確地提供報表並提出決策依據,幫助企業做出明智的業務經營決策。 原始資料記錄了企業日常事

java 中的資料型別BigInteger和BigDecimal

一、為什麼為用到BigInteger和BigDecimal這種資料型別呢?       我們非常清楚,java裡面整型int與浮點型float,double它們存放資料的範圍是有邊界的。那麼如果需要更大的資料時,這些資料型別肯定是滿足不了這種需求,所以就用到了BigInteger和BigDecimal來解決

七週速學資料分析業務知識

在前面我們提到了Excel、資料視覺化、資料分析思維、資料庫知識,統計學知識,但是有了這些知識還不是足夠了,還需要學習Python/R和業務知識,因為資料分析是針對各種各樣的業務的,但是很多人對於這些業務不是很清楚的,所以如果想加入資料分析行業的時候一定要多多瞭解一些業務的知識,這樣才能夠更好的分析資料。

資料資料治理|Spark SQL結構化資料分析第六

  資料科學家們早已熟悉的R和Pandas等傳統資料分析框架 雖然提供了直觀易用的API,卻侷限於單機,無法覆蓋分散式大資料場景。在Spark1.3.0以Spark SQL原有的SchemaRDD為藍本,引入了Spark DataFrameAPI,不僅為Scala、Python、Jav

`輕鬆搞定資料結構線性表

資料結構(線性表) 相關的C/C++基礎知識 typedef 語句的使用 //①宣告一個結構體,或者為 一個型別修改名字方便理解。 typedef struct xxx{ int xxxx; }newN

資料學習之小白如何學資料詳細

大資料這個話題熱度一直高居不下,不僅是國家政策的扶持,也是科技順應時代的發展。想要學習大資料,我們該怎麼做呢?大資料學習路線是什麼?先帶大家瞭解一下大資料的特徵以及發展方向。 大資料的三個發展方向,平臺搭建/優化/運維/監控、大資料開發/設計/架構、資料分析/挖掘。 先說一下大資料的4V特徵: 資料

資料的應用場景都有哪些電商

現在人們的生活離不開電商,電商的出現使得傳統的銷售行業受到了衝擊,現在大家也十分熱衷於網上購物,所以現在的電商平臺有很多。那麼如果使用大資料的話,電商會有什麼樣發展呢?下面就有小編為大家解答一下這個問題。 如果電商使用了大資料,那麼電商就能夠做到精準營銷。那麼什麼是精準營銷呢?所謂精準營銷就是通過使用者

資料資料治理|資料之數倉平臺設計第十

對於大資料來說,數倉的作用不言而喻,承載著整個公司全業務線的資料,現階段,在hadoop上的數倉主要是用來解決企業內部資料的分析,尤其是各種各樣的統計分析報表。本文主要結合自己公司目前數倉的結構設計和現階段解決的問題而敘述和分享,如有不明,錯誤之處,各位看官可指出,非常感謝! 下圖為數倉整體的技

資料技術背景介紹開號

1、什麼是大資料? 大資料(Big Data),指無法在一定時間範圍內用常規軟體工具進行捕捉、管理和處理的資料集合,是需要新處理模式才能具有更強的決策力、洞察發現力和流程優化能力的海量、高增長率和多樣化的資訊資產。 大資料的5V特點(IBM提出):

機器學習競賽分享:NFL資料

kaggle競賽分享:NFL大資料碗 - 上 競賽簡介 一年一度的NFL大資料碗,今年的預測目標是通過兩隊球員的靜態資料,預測該次進攻推進的碼數,並轉換為該概率分佈; 競賽連結 https://www.kaggle.com/c/nfl-big-data-bowl-2020 專案連結,該專案程式碼已經publi

資料基礎1zookeeper原始碼解析

五 原始碼解析   public enum ServerState { LOOKING, FOLLOWING, LEADING, OBSERVING;}zookeeper伺服器狀態:剛啟動LOOKING,follower是FOLLOWING,leader是LEADING,observer是

資料導論4——OLTP與OLAP、資料庫與資料倉庫

公司內部的資料自下而上流動,同時完成資料到資訊、知識、洞察的轉化過程。 而企業內部資料,從日常OLTP流程中產生,實時儲存進不同的資料庫中。同時定期被提取、經格式轉化、清洗和載入(ETL),以統一的格式儲存進資料倉庫,以供決策者進行OLAP處理,並將處理結果視覺化。 OLTP & OLAP 企業

資料選擇題

1.which among the following command is used to copy a directory from one node to another in HDFS? 1.rcp  2.distcp   √