【云端大数据实战】大数据误区、大数据处理步骤分析
生活随笔
收集整理的這篇文章主要介紹了
【云端大数据实战】大数据误区、大数据处理步骤分析
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1.背景
? ? ?? ? ? ??首先感謝這次博客的主辦方CSDN以及在初賽為我投票的網(wǎng)友們,你們的支持是Garvin前進的動力。本文思路的依據(jù)來源于本次天貓大數(shù)據(jù)競賽長達三個月的參賽體驗。博主作為一個在校的學生,可能如果不是這次比賽,很難能夠擁有一套完整的云環(huán)境來對TB級的數(shù)據(jù)進行分析和實踐。下面是博主的一點心得,在此拋磚引玉,希望能給大家在云端大數(shù)據(jù)處理方面帶來一點啟示。2.對于大數(shù)據(jù)和云的一些誤區(qū)
?
? (1)誤區(qū)一:云的計算能力是無窮的,不用考慮效率?
? ? ?? ? ? ? ?我們都知道,云計算的本質就是分布式計算,將現(xiàn)有的工作量,分割開來讓n個不同的服務器協(xié)同完成。說白了云計算的計算能力雖然比我們的pc有優(yōu)越許多,但是它是有計算成本的。當我們處理TB級數(shù)據(jù)的時候,我們還是盡量要考慮一下效率,否則會陷入漫長的等待。 ps:博主參加比賽的時候,因為一開始沒有使用抽樣算法,將整個訓練集拿去訓練,占用了大量的資源,常常一等就是24小時。?
? ?(2)誤區(qū)二:數(shù)據(jù)量越大,預測效果越好?
? ? ?
? ? ? ?大數(shù)據(jù)計算,顧名思義。就是需要一個很大的數(shù)據(jù)量,通過一些算法,找到它們和目標序列的特定規(guī)則和聯(lián)系。這就容易造成一個誤區(qū),是不是數(shù)據(jù)量越大,結果準確。其實對于推薦系統(tǒng)來講,當我們使用隨機森林或是gbrt這些算法的時候,數(shù)據(jù)集在幾百萬的時候往往能得到比數(shù)據(jù)集在幾千萬的時候更好的計算效果。因為對于一個算法來講,如果數(shù)據(jù)集過大,容易造成過擬合。
? ? ? ?所以在面對一個真正的大數(shù)據(jù)集的時候,不要盲目的拿來全部訓練,做好抽樣和正負樣本的比例調整,可能會得到更好的效果。?
??
? (3)誤區(qū)三: 算法的參數(shù)是一成不變的? ? ????
? ? ? ? ? ? ? ??在對大數(shù)據(jù)進行處理的時候,我們往往使用一些已經比較成熟的算法。例如常用的分類算法有svm(支持向量機)、rf(隨機森林)、lr(邏輯回歸)等等。在使用這些算法的時候往往要面對一個比較頭疼的問題就是調參。是否能調到一個理想的參數(shù),對于最后的計算結果有著至關重要的作用。 ? ? ??對于參數(shù),我覺得沒有最好的參數(shù),只有最合適的參數(shù)。不要迷信論文或是網(wǎng)上的一些評論,如果你的訓練集是獨一無二的,就要靜下心來,認真調試最適合自己的參數(shù)。影響一個算法的參數(shù)的因素很多,包括樣本數(shù)量或是正負樣本比例等。 ? ? ?? ? (4)誤區(qū)四:特征越多越好么? ? ? ?? ? ? ??特征重在質量而不是數(shù)量,好的特征對于結果的影響可能會比普通特征大100倍,所以千萬不要隨便的組合數(shù)據(jù)集的一些字段。有的時候一些不好的特征,會對結果產生消極的影響。區(qū)分特征對與結果的影響的方法有很多,下面給一個信息熵的方法: def chooseBestFeatureToSplit(dataSet):numFeatures = len(dataSet[0]) - 1 #the last column is used for the labelsbaseEntropy = calcShannonEnt(dataSet)bestInfoGain = 0.0; bestFeature = -1for i in range(numFeatures): #iterate over all the featuresfeatList = [example[i] for example in dataSet]#create a list of all the examples of this featureuniqueVals = set(featList) #get a set of unique valuesnewEntropy = 0.0for value in uniqueVals:subDataSet = splitDataSet(dataSet, i, value)prob = len(subDataSet)/float(len(dataSet))newEntropy += prob * calcShannonEnt(subDataSet) infoGain = baseEntropy - newEntropy #calculate the info gain; ie reduction in entropyif (infoGain > bestInfoGain): #compare this to the best gain so farbestInfoGain = infoGain #if better than current best, set to bestbestFeature = ireturn bestFeature #returns an integer3.大數(shù)據(jù)云處理步驟
? ? ? (1)首先要了解集成環(huán)境 ? ? ? ? ?? ? ? ? ? ? ?既然是大數(shù)據(jù)處理,那么一定是要有一個云環(huán)境作為依托。我覺得首先要了解自己的集成環(huán)境的基本使用方法,像是spark、hadoop或是odps,他們都有自己的特點。比如博主使用的odps,對于數(shù)據(jù)庫的處理可以用命令行執(zhí)行sql語句,也可以用MapReduce的方法將寫好的jar文件放到云端處理。 ? ? ? ?(2)數(shù)據(jù)集去噪 ? ? ? ? ? ? ?對于一個比較大的數(shù)據(jù)集,肯定是存在一些噪聲部分影響我們的計算操作。將這部分噪音去掉可以保證計算結果的準確性。去噪的方法有很多,這里舉出一個常用的方法,就是將數(shù)值在 ? [均值- ?3倍方差,均值 + 3倍方差] 以外的數(shù)據(jù)濾掉。下面是我寫的一個實現(xiàn)以上去噪方法的代碼,執(zhí)行DenoisMat函數(shù)可以實現(xiàn)此功能。 from __future__ import division def GetAverage(mat):n=len(mat)m= width(mat) num = [0]*mfor j in range(0,m): for i in mat:num[j]=num[j]+i[j] num[j]=num[j]/n return numdef width(lst):i=0for j in lst[0]:i=i+1return idef GetVar(average,mat): ListMat=[]for i in mat: ListMat.append(list(map(lambda x: x[0]-x[1], zip(average, i))))n=len(ListMat)m= width(ListMat) num = [0]*mfor j in range(0,m): for i in ListMat:num[j]=num[j]+(i[j]*i[j]) num[j]=num[j]/n return num def DenoisMat(mat):average=GetAverage(mat)variance=GetVar(average,mat)section=list(map(lambda x: x[0]+x[1], zip(average, variance))) n=len(mat)m= width(mat) num = [0]*mdenoisMat=[] for i in mat:for j in range(0,m):if i[j]>section[j]:i[j]=section[j]denoisMat.append(i) return denoisMat? ?(3)訓練集采樣 ? ? ?? ? ? ? ? ? ? 上文中已經提到了,正確的采樣可以提高計算的準確性。常用的采樣的方法有隨機采樣、系統(tǒng)采樣、分層采樣。
隨機采樣:根據(jù)樣本的編號random出來需要的樣本數(shù)量。 系統(tǒng)采樣:即先將總體的觀察單位按某一順序號分成n個部分,再從第一部分隨機抽取第k號觀察單位,依次用相等間距,從每一部分各抽取一個觀察 單位組成樣本。 分層采樣:先按對觀察指標影響較大的某種特征,將總體分為若干個類別,再從每一層內隨機抽取一定數(shù)量的觀察單位,合起來組成樣本。有按比例 分配和最優(yōu)分配兩種方案。
? ? ? ? 效果的比較是,分層采樣>系統(tǒng)采樣>隨機采樣。以下代碼實現(xiàn)了系統(tǒng)采樣和隨機采樣,分層采樣可以根據(jù)自己的數(shù)據(jù)集結合聚類算法來實現(xiàn)。如果是監(jiān)督學習的話,記得調整正副樣本的比例哦。 ''' Sampling archive@author: Garvin Li ''' import randomdef RandomSampling(dataMat,number):try:slice = random.sample(dataMat, number) return sliceexcept:print 'sample larger than population'def SystematicSampling(dataMat,number): length=len(dataMat)k=length/numbersample=[] i=0if k>0 : while len(sample)!=number:sample.append(dataMat[0+i*k])i+=1 return sampleelse :return RandomSampling(dataMat,number)
? (4)選擇算法訓練樣本 ?? ? ? ? ? ?上面已經提到了很多的算法。針對不同的數(shù)據(jù)集,應該選用不同的算法。舉個例子,這次比賽在線下賽的時候,因為數(shù)據(jù)集比較小,我們使用的邏輯回歸算法就取得了不錯的成績。但是到了線上比賽,隨著數(shù)據(jù)量增加到TB級別,發(fā)現(xiàn)邏輯回歸已經不給力了。使用GBRT可以取得更理想的效果,具體用法可以參考阿里大數(shù)據(jù)比賽sesson2_RF&GBRT.一些常用的算法也可以clone我的github代碼庫(不斷更新中),本文最下方給出地址。
圖 ?3-1 My git-repo
? ?(5)模型融合 ? ? ? ? ? ?模型融合的概念也是這次參加比賽第一次聽說的。其實原理很簡單,每種算法因為自身的收斂方式不同、對特征的調配方式不同,在結果上是有比較大的差異的。如果將不同的模型計算結果加權求和的話,可以充分體現(xiàn)每個算法的長處,對于結果的提升是有比較大幫助的。
4.總結
? ? ?? ? ? ? ?我始終堅信大數(shù)據(jù)和云計算可以改變我們的生活方式甚至我們的意識形態(tài)。在進行大數(shù)據(jù)處理的過程中,看著自己的成績一點一滴的提升,內心會有極大的滿足感。希望有相同志趣的朋友可以留言討論,大家一起學習進步,謝謝大家。 我的Github頁:點擊打開鏈接 本文參加了csdn博客大賽,請為我投票!本文參考了:《機器學習與算法》和 csdn?
u010691898的專欄
/********************************
* 本文來自博客 ?“李博Garvin“
* 轉載請標明出處:http://blog.csdn.net/buptgshengod
******************************************/
總結
以上是生活随笔為你收集整理的【云端大数据实战】大数据误区、大数据处理步骤分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【机器学习算法-python实现】PCA
- 下一篇: csdn开源夏令营-ospaf中期报告