日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
干貨收藏!Python完整代碼帶你一文看懂抽樣

1.什么時(shí)候需要抽樣

抽樣工作在數(shù)據(jù)獲取較少或處理大量數(shù)據(jù)比較困難的時(shí)期非常流行,這主要有以下幾方面原因:

  • 數(shù)據(jù)計(jì)算資源不足。計(jì)算機(jī)軟硬件的限制是導(dǎo)致抽樣產(chǎn)生的基本原因之一,尤其是在數(shù)據(jù)密集的生物、科學(xué)工程等領(lǐng)域,不抽樣往往無(wú)法對(duì)海量數(shù)據(jù)進(jìn)行計(jì)算。
  • 數(shù)據(jù)采集限制。很多時(shí)候抽樣從數(shù)據(jù)采集端便已經(jīng)開(kāi)始,例如做社會(huì)調(diào)查必須采用抽樣方法進(jìn)行研究,因?yàn)楦緹o(wú)法對(duì)所有人群做調(diào)查。
  • 時(shí)效性要求。抽樣帶來(lái)的是以局部反映全局的思路,如果方法正確,可以以極小的數(shù)據(jù)計(jì)算量來(lái)實(shí)現(xiàn)對(duì)整體數(shù)據(jù)的統(tǒng)計(jì)分析,在時(shí)效性上會(huì)大大增強(qiáng)。

如果存在上述條件限制或有類似強(qiáng)制性要求,那么抽樣工作仍然必不可少。

但是在當(dāng)前數(shù)據(jù)化運(yùn)營(yíng)的大背景下,數(shù)據(jù)計(jì)算資源充足、數(shù)據(jù)采集端可以采集更多的數(shù)據(jù)并且可以通過(guò)多種方式滿足時(shí)效性的要求,抽樣工作是否就沒(méi)有必要了?其實(shí)不是的,即使上述限制條件都滿足,還有很多場(chǎng)景依然需要通過(guò)抽樣方法來(lái)解決具體問(wèn)題。

  • 通過(guò)抽樣來(lái)實(shí)現(xiàn)快速的概念驗(yàn)證。數(shù)據(jù)工作中可能會(huì)包括創(chuàng)新性或常識(shí)性項(xiàng)目,對(duì)于這類項(xiàng)目進(jìn)行快速驗(yàn)證、迭代和交付結(jié)論往往是概念驗(yàn)證的關(guān)鍵,通過(guò)抽樣方法帶來(lái)的不僅是計(jì)算效率的提升,還有前期數(shù)據(jù)準(zhǔn)備、數(shù)據(jù)預(yù)處理、算法實(shí)現(xiàn)等各個(gè)方面的開(kāi)發(fā),以及服務(wù)器、硬件的配套方案的部署等內(nèi)容的可行性、簡(jiǎn)單化和可操作性。
  • 通過(guò)抽樣來(lái)解決樣本不均衡問(wèn)題。通過(guò)欠抽樣、過(guò)抽樣以及組合/集成的方法解決不均衡的問(wèn)題,這個(gè)過(guò)程就用到了抽樣方法。
  • 無(wú)法實(shí)現(xiàn)對(duì)全部樣本覆蓋的數(shù)據(jù)化運(yùn)營(yíng)場(chǎng)景。典型場(chǎng)景包括市場(chǎng)研究、客戶線下調(diào)研分析、產(chǎn)品品質(zhì)檢驗(yàn)、用戶電話滿意度調(diào)查等,在這些場(chǎng)景下無(wú)法實(shí)現(xiàn)對(duì)所有樣本的采集、分析、處理和建模。
  • 定性分析的工作需要。在定性分析工作中,通常不需要定量分析時(shí)的完整假設(shè)、精確數(shù)據(jù)和復(fù)雜統(tǒng)計(jì)分析過(guò)程,更多的是采用訪問(wèn)、觀察和文獻(xiàn)法收集資料并通過(guò)主觀理解和定性分析找到問(wèn)題答案,該過(guò)程中主要依靠人自身的能力而非密集的計(jì)算機(jī)能力來(lái)完成研究工作。如果不使用抽樣方法,那么定性分析將很難完成。

2 如何進(jìn)行抽樣

抽樣方法從整體上分為非概率抽樣和概率抽樣兩種。非概率抽樣不是按照等概率的原則進(jìn)行抽樣,而是根據(jù)人類的主觀經(jīng)驗(yàn)和狀態(tài)進(jìn)行判斷;概率抽樣則是以數(shù)學(xué)概率論為基礎(chǔ),按照隨機(jī)的原則進(jìn)行抽樣。本節(jié)以下內(nèi)容介紹的抽樣方法屬于概率抽樣。

1. 簡(jiǎn)單隨機(jī)抽樣

該抽樣方法是按等概率原則直接從總樣本中抽取n個(gè)樣本,這種隨機(jī)抽樣方法簡(jiǎn)單、易于操作,但是它并不能保證樣本能完美代表總體。這種抽樣的基本前提是所有樣本個(gè)體都是等概率分布的,但真實(shí)情況卻是多數(shù)樣本都不是或無(wú)法判斷是否是等概率分布的。

在簡(jiǎn)單隨機(jī)抽樣中,得到的結(jié)果是不重復(fù)的樣本集,還可以使用有放回的簡(jiǎn)單隨機(jī)抽樣,這樣得到的樣本集中會(huì)存在重復(fù)數(shù)據(jù)。該方法適用于個(gè)體分布均勻的場(chǎng)景。

2. 等距抽樣

等距抽樣是先將總體中的每個(gè)個(gè)體按順序編號(hào),然后計(jì)算出抽樣間隔,再按照固定抽樣間隔抽取個(gè)體。

這種操作方法易于理解、簡(jiǎn)便易行,但當(dāng)總體樣本的分布呈現(xiàn)明顯的分布規(guī)律時(shí)容易產(chǎn)生偏差,例如增減趨勢(shì)、周期性規(guī)律等。該方法適用于個(gè)體分布均勻或呈現(xiàn)明顯的均勻分布規(guī)律,無(wú)明顯趨勢(shì)或周期性規(guī)律的數(shù)據(jù)。

3. 分層抽樣

分層抽樣是先將所有個(gè)體樣本按照某種特征劃分為幾個(gè)類別,然后從每個(gè)類別中使用隨機(jī)抽樣或等距抽樣的方法選擇個(gè)體組成樣本。這種操作方法能明顯降低抽樣誤差,并且便于針對(duì)不同類別的數(shù)據(jù)樣本進(jìn)行單獨(dú)研究,因此是一種較好的實(shí)現(xiàn)方法。該方法適用于帶有分類邏輯的屬性、標(biāo)簽等特征的數(shù)據(jù)。

4. 整群抽樣

整群抽樣是先將所有樣本分為幾個(gè)小群體集,然后隨機(jī)抽樣幾個(gè)小群體集來(lái)代表總體。

這種操作方法與之前的3種方法的差異點(diǎn)在于該方法抽取的是小群體集,而不是每個(gè)數(shù)據(jù)個(gè)體本身。該方法雖然簡(jiǎn)單易行,但是樣本的分布受限于小群體集的劃分,抽樣誤差較大。這種方法適用于小群體集的特征差異比較小的數(shù)據(jù),并且對(duì)劃分小群體集有更高要求。

3.抽樣需要注意的幾個(gè)問(wèn)題

1. 數(shù)據(jù)抽樣要能反映運(yùn)營(yíng)背景

數(shù)據(jù)能正確反映運(yùn)營(yíng)背景,這看起來(lái)非常簡(jiǎn)單,但實(shí)際上需要數(shù)據(jù)工作者對(duì)于運(yùn)營(yíng)環(huán)節(jié)和流程非常熟悉才有可能實(shí)現(xiàn)。以下是常見(jiàn)的抽樣不能反映運(yùn)營(yíng)背景的情況。

  • 數(shù)據(jù)時(shí)效性問(wèn)題:使用過(guò)時(shí)的數(shù)據(jù)(例如1年前的數(shù)據(jù))來(lái)分析現(xiàn)在的運(yùn)營(yíng)狀態(tài)。
  • 缺少關(guān)鍵因素?cái)?shù)據(jù):沒(méi)有將運(yùn)營(yíng)分析涉及的主要因素所產(chǎn)生的數(shù)據(jù)放到抽樣數(shù)據(jù)中,導(dǎo)致無(wú)法根據(jù)主要因素產(chǎn)生有效結(jié)論,模型效果差,例如抽樣中沒(méi)有覆蓋大型促銷活動(dòng)帶來(lái)的銷售增長(zhǎng)。
  • 不具備業(yè)務(wù)隨機(jī)性:有意/無(wú)意多抽取或覆蓋特定數(shù)據(jù)場(chǎng)景,使得數(shù)據(jù)明顯趨向于特定分布規(guī)律,例如在做社會(huì)調(diào)查時(shí)使用北京市的抽樣數(shù)據(jù)來(lái)代表全國(guó)。
  • 沒(méi)有考慮業(yè)務(wù)增長(zhǎng)性:在成長(zhǎng)型公司中,公司的發(fā)展不都是呈現(xiàn)線性趨勢(shì)的,很多時(shí)候會(huì)呈現(xiàn)指數(shù)趨勢(shì)。這時(shí)需要根據(jù)這種趨勢(shì)來(lái)使業(yè)務(wù)滿足不同增長(zhǎng)階段的分析需求,而不只是集中于增長(zhǎng)爆發(fā)區(qū)間。
  • 沒(méi)有考慮數(shù)據(jù)來(lái)源的多樣性:只選擇某一來(lái)源的數(shù)據(jù)做抽樣,使得數(shù)據(jù)的分布受限于數(shù)據(jù)源。例如在做各分公司的銷售分析時(shí),僅將北方大區(qū)的數(shù)據(jù)納入其中做抽樣,而忽視了其他大區(qū)的數(shù)據(jù),其結(jié)果必然有所偏頗。
  • 業(yè)務(wù)數(shù)據(jù)可行性問(wèn)題:很多時(shí)候,由于受到經(jīng)費(fèi)、權(quán)限、職責(zé)等方面的限制,在數(shù)據(jù)抽樣方面無(wú)法按照數(shù)據(jù)工作要求來(lái)執(zhí)行,此時(shí)要根據(jù)運(yùn)營(yíng)實(shí)際情況調(diào)整。這點(diǎn)往往被很多數(shù)據(jù)工作者忽視。

2. 數(shù)據(jù)抽樣要能滿足數(shù)據(jù)分析和建模需求

數(shù)據(jù)抽樣必須兼顧后續(xù)的其他數(shù)據(jù)處理工作,尤其是分析和建模需求。這時(shí)需要注意以下幾個(gè)方面的問(wèn)題。

(1)抽樣樣本量的問(wèn)題

對(duì)于大多數(shù)數(shù)據(jù)分析建模而言,數(shù)據(jù)規(guī)模越大,模型擬合結(jié)果越準(zhǔn)確。但到底如何定義數(shù)據(jù)量的大小,筆者根據(jù)不同類型的數(shù)據(jù)應(yīng)用總結(jié)為以下幾個(gè)維度:

  • 以時(shí)間為維度分布的,至少包含一個(gè)能滿足預(yù)測(cè)的完整業(yè)務(wù)周期。例如,做月度銷售預(yù)測(cè)的,至少包含12個(gè)月的數(shù)據(jù);做日銷售預(yù)測(cè)的,至少包含30天的數(shù)據(jù),如果一天中包含特定周期,則需要重復(fù)多個(gè)周期。同時(shí),時(shí)間性特征的要充分考慮季節(jié)性、波動(dòng)性、節(jié)假日等特殊規(guī)律,這些都要盡量包含在抽樣數(shù)據(jù)中。
  • 做預(yù)測(cè)(包含分類和回歸)分析建模的,需要考慮特征數(shù)量和特征值域(非數(shù)值型)的分布,通常數(shù)據(jù)記錄數(shù)要同時(shí)是特征數(shù)量和特征值域的100倍以上。例如數(shù)據(jù)集有5個(gè)特征,假如每個(gè)特征有2個(gè)值域,那么數(shù)據(jù)記錄數(shù)需要至少在1000(100×5×2)條以上。
  • 做關(guān)聯(lián)規(guī)則分析建模的,根據(jù)關(guān)聯(lián)前后項(xiàng)的數(shù)量(每個(gè)前項(xiàng)或后項(xiàng)可包含多個(gè)要關(guān)聯(lián)的主體,例如品牌+商品+價(jià)格關(guān)聯(lián)),每個(gè)主體需要至少1000條數(shù)據(jù)。例如只做單品銷售關(guān)聯(lián),那么單品的銷售記錄需要在1000條以上;如果要同時(shí)做單品+品牌的關(guān)聯(lián),那么需要至少2000條數(shù)據(jù)。
  • 對(duì)于異常檢測(cè)類分析建模的,無(wú)論是監(jiān)督式還是非監(jiān)督式建模,由于異常數(shù)據(jù)本來(lái)就是小概率分布的,因此異常數(shù)據(jù)記錄一般越多越好。

以上的數(shù)據(jù)記錄數(shù)不是固定的,在實(shí)際工作時(shí),如果沒(méi)有特定時(shí)間要求,筆者一般會(huì)選擇一個(gè)適中的樣本量做分析,此時(shí)應(yīng)綜合考慮特征數(shù)、特征值域分布數(shù)、模型算法適應(yīng)性、建模需求等;如果是面向機(jī)器計(jì)算的工作項(xiàng)目,一般會(huì)選擇盡量多的數(shù)據(jù)參與計(jì)算,而有關(guān)算法實(shí)時(shí)性和效率的問(wèn)題會(huì)讓技術(shù)和運(yùn)維人員配合實(shí)現(xiàn),例如提高服務(wù)器配置、擴(kuò)大分布式集群規(guī)模、優(yōu)化底層程序代碼、使用實(shí)時(shí)計(jì)算的引擎和機(jī)制等。

(2)抽樣樣本在不同類別中的分布問(wèn)題

做分類分析建模問(wèn)題時(shí),不同類別下的數(shù)據(jù)樣本需要均衡分布。

抽樣樣本能準(zhǔn)確代表全部整體特征:

  • 非數(shù)值型的特征值域(例如各值頻數(shù)相對(duì)比例、值域范圍等)分布需要與總體一致。
  • 數(shù)值型特征的數(shù)據(jù)分布區(qū)間和各個(gè)統(tǒng)計(jì)量(如均值、方差、偏度等)需要與整體數(shù)據(jù)分布區(qū)間一致。
  • 缺失值、異常值、重復(fù)值等特殊數(shù)據(jù)的分布要與整體數(shù)據(jù)分布一致。

異常檢測(cè)類數(shù)據(jù)的處理:

  • 對(duì)于異常檢測(cè)類的應(yīng)用要包含全部異常樣本。對(duì)于異常檢測(cè)類的分析建模,本來(lái)異常數(shù)據(jù)就非常稀少,因此抽樣時(shí)要優(yōu)先將異常數(shù)據(jù)包含進(jìn)去。
  • 對(duì)于需要去除非業(yè)務(wù)因素的數(shù)據(jù)異常,如果有類別特征需要與類別特征分布一致;如果沒(méi)有類別特征,屬于非監(jiān)督式的學(xué)習(xí),則需要與整體分布一致。

4.代碼實(shí)操:Python數(shù)據(jù)抽樣

本示例中,將使用random包以及自定義代碼實(shí)現(xiàn)抽樣處理。數(shù)據(jù)源文件data2.txt、data3.txt和data4.txt位于“附件-chapter3”中。

整個(gè)示例代碼分為5部分。

第1部分:導(dǎo)入需要的庫(kù)

 
 
  1. import random # 導(dǎo)入標(biāo)準(zhǔn)庫(kù) 
  2. import numpy as np # 導(dǎo)入第三方庫(kù) 

這里用到了Python內(nèi)置標(biāo)準(zhǔn)庫(kù)random以及第三方庫(kù)Numpy,前者用于做隨機(jī)抽樣,后者用于讀取文件并做數(shù)據(jù)切片使用。

第2部分:實(shí)現(xiàn)簡(jiǎn)單隨機(jī)抽樣

 
 
  1. data = np.loadtxt('data3.txt') # 導(dǎo)入普通數(shù)據(jù)文件 
  2. data_sample = data[random.sample([i for i in range(len(data))], 2000)] 
  3.  # 隨機(jī)抽取2000個(gè)樣本 
  4. print(data_sample[:2]) # 打印輸出前2條數(shù)據(jù) 
  5. print(len(data_sample)) # 打印輸出抽樣樣本量 

首先通過(guò)Numpy的loadtxt方法讀取數(shù)據(jù)文件。

然后使用Random庫(kù)中的sample方法做數(shù)據(jù)抽樣。由于sample庫(kù)要求抽取的對(duì)象是一個(gè)序列或set,因此這里使用了一個(gè)列表推導(dǎo)式直接基于data數(shù)據(jù)集的記錄數(shù)生成索引列表,然后再返回給sample隨機(jī)抽樣,抽樣數(shù)量為2000;最后從data中直接基于索引獲得隨機(jī)抽樣后的結(jié)果。

打印輸出前2條數(shù)據(jù)和總抽樣樣本量。返回結(jié)果如下:

 
 
  1. [[-4.59501348 8.82741653 4.40096599 3.40332532 -6.54589933] 
  2.  [-7.23173404 -8.92692519 6.82830873 3.0378005 4.64450399]]
  3. 2000 
  • 相關(guān)知識(shí)點(diǎn):Python中的列表推導(dǎo)式

本示例中,我們使用了列表推導(dǎo)式來(lái)生成data的索引列表。傳統(tǒng)方法的實(shí)現(xiàn)可以這樣寫:

 
 
  1. ind = [] 
  2. for i in range(len(data)): 
  3.  ind.append(i) 

而這里的列表推導(dǎo)式的寫法[i for i in range(len(data))]除了在語(yǔ)法上更加簡(jiǎn)潔和優(yōu)雅外,在性能上同樣會(huì)有提升。我們通過(guò)如下實(shí)驗(yàn)做簡(jiǎn)單測(cè)試,對(duì)從0到1000000的每個(gè)數(shù)求平方然后添加到列表。兩種方法如下:

 
 
  1. # 方法1:傳統(tǒng)方法 
  2. import time 
  3. t0=time.time() # 開(kāi)始時(shí)間 
  4. ind = [] 
  5. for i in range(1000000): 
  6.  sqr_values = i*i 
  7.  ind.append(sqr_values) 
  8. t1 = time.time() # 結(jié)束時(shí)間 
  9. print(t1-t0) # 打印時(shí)間 
  10. # 方法2:列表推導(dǎo)式 
  11. import time 
  12. t0=time.time() # 開(kāi)始時(shí)間 
  13. sqr_values = [i*i for i in range(1000000)] 
  14. t1 = time.time() # 結(jié)束時(shí)間 
  15. print(t1-t0) # 打印時(shí)間 

上述代碼執(zhí)行后的輸出結(jié)果分別是:

 
 
  1. 0.39202237129211426 
  2. 0.12700724601745605 

上面只是簡(jiǎn)單的計(jì)算邏輯并且數(shù)據(jù)量也不大,如果配合大數(shù)據(jù)量以及更復(fù)雜的運(yùn)算,那么效率提升會(huì)非常明顯。與之類似的還有生成器表達(dá)式、字典推導(dǎo)式,都是很Pythonic的實(shí)現(xiàn)方法。

第3部分:實(shí)現(xiàn)等距抽樣

 
 
  1. data = np.loadtxt('data3.txt') # 導(dǎo)入普通數(shù)據(jù)文件 
  2. sample_count = 2000 # 指定抽樣數(shù)量 
  3. record_count = data.shape[0] # 獲取最大樣本量 
  4. width = record_count / sample_count # 計(jì)算抽樣間距 
  5. data_sample = [] # 初始化空白列表,用來(lái)存放抽樣結(jié)果數(shù)據(jù) 
  6. i = 0 # 自增計(jì)數(shù)以得到對(duì)應(yīng)索引值 
  7. while len(data_sample) <= sample_count and i * width <= record_count - 1: 
  8.  # 當(dāng)樣本量小于等于指定抽樣數(shù)量并且矩陣索引在有效范圍內(nèi)時(shí) 
  9.  data_sample.append(data[int(i * width)]) # 新增樣本 
  10.  i += 1 # 自增長(zhǎng) 
  11. print(data_sample[:2]) # 打印輸出前2條數(shù)據(jù) 
  12. print(len(data_sample)) # 打印輸出樣本數(shù)量 

首先使用Numpy的loadtxt方法讀取數(shù)據(jù)文件;然后指定抽樣樣本量為2000,并通過(guò)讀取原始數(shù)據(jù)的形狀找到最大樣本量邊界,這可以用來(lái)作為循環(huán)的終止條件之一;接著通過(guò)最大樣本量除抽樣樣本量得到抽樣間距;建立一個(gè)空列表用于存儲(chǔ)最終抽樣結(jié)果數(shù)據(jù),通過(guò)一個(gè)變量i做循環(huán)增長(zhǎng)并用來(lái)做索引遞增,然后進(jìn)入抽樣條件判斷過(guò)程。

當(dāng)樣本量小于等于指定抽樣數(shù)量并且矩陣索引在有效范圍內(nèi)時(shí)做處理,這里需要注意的是索引從0開(kāi)始,因此最大數(shù)量值減去1得到循環(huán)邊界,否則會(huì)報(bào)索引溢出錯(cuò)誤。

通過(guò)列表的append方法不斷追加通過(guò)間距得到的新增樣本,在本節(jié)后面的方法中還會(huì)提到列表追加的extend方法,前者用于每次追加1個(gè)元素,后者用于批量追加多個(gè)元素。

i += 1指的是每次循環(huán)都增加1,可以寫成i = i + 1。

最后打印輸出前2條數(shù)據(jù)和抽樣樣本量。

返回結(jié)果如下:

 
 
  1. [array([-3.08057779, 8.09020329, 2.02732982, 2.92353937, -6.06318211]), array([-2.11984871, 7.74916701, 5.7318711 , 4.75148273, -5.68598747])] 
  2. 2000 

第4部分:實(shí)現(xiàn)分層抽樣

 
 
  1. data2 = np.loadtxt('data2.txt')    # 導(dǎo)入帶有分層邏輯的數(shù)據(jù) 
  2. each_sample_count = 200    # 定義每個(gè)分層的抽樣數(shù)量 
  3. label_data_unique = np.unique(data2[:, -1])    # 定義分層值域 
  4. sample_data = []    # 定義空列表,用于存放最終抽樣數(shù)據(jù) 
  5. sample_dict = {}    # 定義空字典,用來(lái)顯示各分層樣本數(shù)量 
  6. for label_data in label_data_unique:    # 遍歷每個(gè)分層標(biāo)簽 
  7.  sample_list = []    # 定義空列表,用于存放臨時(shí)分層數(shù)據(jù) 
  8.  for data_tmp in data2:    # 讀取每條數(shù)據(jù) 
  9.  if data_tmp[-1] == label_data:    # 如果數(shù)據(jù)最后一列等于標(biāo)簽 
  10.  sample_list.append(data_tmp)    # 將數(shù)據(jù)加入分層數(shù)據(jù)中 
  11.  each_sample_data = random.sample(sample_list, each_sample_count) 
  12.  # 對(duì)每層數(shù)據(jù)都隨機(jī)抽樣 
  13.  sample_data.extend(each_sample_data)    # 將抽樣數(shù)據(jù)追加到總體樣本集 
  14.  sample_dict[label_data] = len(each_sample_data)  # 樣本集統(tǒng)計(jì)結(jié)果 
  15. print(sample_dict)    # 打印輸出樣本集統(tǒng)計(jì)結(jié)果 

首先使用Numpy的loadtxt方法導(dǎo)入帶有分層邏輯的數(shù)據(jù)。在該示例中,讀取的數(shù)據(jù)文件中包含了分類標(biāo)簽,放在最后一列。該列分類標(biāo)簽用于做分層抽樣的標(biāo)識(shí)。接著通過(guò)unique方法獲取分層(分類標(biāo)簽)的值域,用于后續(xù)做循環(huán)處理。然后分別定義了用于存放臨時(shí)分層數(shù)據(jù)、最終抽樣數(shù)據(jù)、顯示各分層樣本數(shù)量的空列表和空字典。

下面進(jìn)入正式的主循環(huán)過(guò)程,實(shí)現(xiàn)分層抽樣:

  • 遍歷每個(gè)分層標(biāo)簽,用來(lái)做數(shù)據(jù)的分層劃分,數(shù)據(jù)一共分為2類標(biāo)簽(0和1)。
  • 讀取每條數(shù)據(jù)并判斷數(shù)據(jù)的分層標(biāo)簽是否與分層標(biāo)簽相同,如果是則將數(shù)據(jù)加入各分層數(shù)據(jù)列表中。
  • 當(dāng)每個(gè)分層標(biāo)簽處理完成后會(huì)得到該分層標(biāo)簽下的所有數(shù)據(jù),此時(shí)使用Python內(nèi)置的random庫(kù)的sample方法進(jìn)行抽樣。由于抽樣結(jié)果是一個(gè)列表,因此這里使用extend(而不是append)批量追加到最終抽樣數(shù)據(jù)列表中。然后將每個(gè)分層標(biāo)簽得到的樣本數(shù)量,通過(guò)len方法對(duì)列表長(zhǎng)度進(jìn)行統(tǒng)計(jì),并打印輸出各個(gè)分層對(duì)應(yīng)的樣本數(shù)量。結(jié)果是每個(gè)分層都按照指定數(shù)量抽取樣本,輸出如下:
 
 
  1. {0.0: 200, 1.0: 200} 

第5部分:實(shí)現(xiàn)整群抽樣

 
 
  1. data3 = np.loadtxt('data4.txt')   # 導(dǎo)入已經(jīng)劃分好整群的數(shù)據(jù)集 
  2. label_data_unique = np.unique(data3[:, -1])   # 定義整群標(biāo)簽值域 
  3. print(label_data_unique)   # 打印輸出所有整群標(biāo)簽 
  4. sample_label = random.sample(set(label_data_unique), 2) # 隨機(jī)抽取2個(gè)整群 
  5. sample_data = []   # 定義空列表,用來(lái)存儲(chǔ)最終抽樣數(shù)據(jù) 
  6. for each_label in sample_label:   # 遍歷每個(gè)整群標(biāo)簽值域 
  7.  for data_tmp in data3:   # 遍歷每個(gè)樣本 
  8.  if data_tmp[-1] == each_label:   # 判斷樣本是否屬于抽樣整群 
  9.  sample_data.append(data_tmp)   # 樣本添加到最終抽樣數(shù)據(jù)集 
  10. print(sample_label)   # 打印輸出樣本整群標(biāo)簽 
  11. print(len(sample_data))   # 打印輸出總抽樣數(shù)據(jù)記錄條數(shù) 

首先使用Numpy的loadtxt方法導(dǎo)入已經(jīng)劃分好整群的數(shù)據(jù)集。在該示例中,讀取的數(shù)據(jù)文件中的最后一列存放了不同整群的標(biāo)識(shí),整群一共被劃分為4個(gè)群組,標(biāo)識(shí)分別為0、1、2、3。接著通過(guò)unique方法獲取整群標(biāo)簽的值域,用于基于整群的抽樣。打印輸出結(jié)果如下:

 
 
  1. [ 0. 1. 2. 3.] 

然后使用Random的sample方法從整群標(biāo)簽中進(jìn)行抽樣,這里定義抽取2個(gè)整群。最后將所有屬于抽取到的整群下的數(shù)據(jù)進(jìn)行讀取和追加,并得到最終樣本集,打印輸出樣本集的整群標(biāo)簽和總樣本數(shù)量,結(jié)果如下:

 
 
  1. [3.0, 1.0] 
  2. 502 

由于是隨機(jī)概率抽樣,因此讀者使用代碼抽取到的樣本很可能與筆者示例不一致,這屬于正?,F(xiàn)象。另外,讀者多次隨機(jī)抽樣程序也可能得到不一樣的結(jié)果。

上述過(guò)程中,需要考慮的關(guān)鍵點(diǎn)是:如何根據(jù)不同的數(shù)據(jù)特點(diǎn)、建模需求、業(yè)務(wù)背景綜合考慮抽樣方法,得到最適合的結(jié)果

代碼實(shí)操小結(jié):本節(jié)示例中,主要用了幾個(gè)知識(shí)點(diǎn):

  • 使用Numpy的loadtxt方法讀取數(shù)據(jù)文件。
  • 使用內(nèi)置標(biāo)準(zhǔn)庫(kù)Random庫(kù)中的sample方法做數(shù)據(jù)抽樣。
  • 對(duì)列表通過(guò)索引做截取、通過(guò)len方法做長(zhǎng)度統(tǒng)計(jì)、通過(guò)append和extend做追加等操作。
  • 字典賦值操作。
  • 使用Numpy的unique方法獲得唯一值。
  • 通過(guò)for和while循環(huán),遍歷一個(gè)可迭代的對(duì)象。
  • if條件語(yǔ)句的使用,尤其是單條件和多條件判斷。

名稱欄目:干貨收藏!Python完整代碼帶你一文看懂抽樣
當(dāng)前網(wǎng)址:http://www.5511xx.com/article/cdhidcp.html