隨機生成訓練樣本
數據是寶貴的,因此我們在使用數據的時候,往往需要在有限的數據量中選取其中一部分進行操作,尤其是預測分析,這就涉及到數據的選取問題,如何選?原則是什麼?實踐證明隨機抽樣是個不錯的方法。本篇,我們圍繞各式各樣的隨機抽樣函數進行,它們相似而不雷同,稱得上各有秋色。
1、doBy包中的sampleby()函數
功能:可以分組/分層抽取,並指定每組/每層抽取的比率
基本格式:
sampleBy(formula, frac = 0.1, replace=FALSE, ...)
#formula用於確定分組/分層的依據,該欄位類型可以為字元,也可以是數值。
#frac用於確定樣本數量佔總體比例,即抽樣比例,默認為10%。
#replace=FALSE表示默認為不重複抽樣,即抽取的內容不再放回參與後續抽取,若需要進行重複抽樣,則設置為replace=TRUE。
例: 從iris數據集中,對每種鳶尾花抽取10%作為樣本數據
這裡分層依據為鳶尾花品種,即Species列。
sampleBy(formula = ~Species, frac=0.1, data = iris) Sepal.Length Sepal.Width Petal.Length Petal.Width Speciessetosa.7 4.6 3.4 1.4 0.3 setosasetosa.11 5.4 3.7 1.5 0.2 setosasetosa.23 4.6 3.6 1.0 0.2 setosasetosa.32 5.4 3.4 1.5 0.4 setosasetosa.43 4.4 3.2 1.3 0.2 setosaversicolor.67 5.6 3.0 4.5 1.5 versicolorversicolor.70 5.6 2.5 3.9 1.1 versicolorversicolor.80 5.7 2.6 3.5 1.0 versicolorversicolor.86 6.0 3.4 4.5 1.6 versicolorversicolor.98 6.2 2.9 4.3 1.3 versicolorvirginica.101 6.3 3.3 6.0 2.5 virginicavirginica.105 6.5 3.0 5.8 2.2 virginicavirginica.108 7.3 2.9 6.3 1.8 virginicavirginica.121 6.9 3.2 5.7 2.3 virginicavirginica.135 6.1 2.6 5.6 1.4 virginica
從結果來看,符合我們的預期,iris數據集中共有3種鳶尾花,每種鳶尾花50條記錄,按照10%的比例計算,每種鳶尾花應該抽出5條記錄。
2、dplyr包的sample_n()函數
功能:從數據中抽取指定數量的樣本
基本格式:
sample_n(tbl, size, replace = FALSE, weight = NULL,...)
#tbl為待抽取的原始數據
#size為需要抽取的樣本數量
# replace = FALSE表示不重複抽樣,如需進行重複抽樣(有放回的抽樣)則設置 replace = TRUE
#weight = NULL表示默認無權重值,通常用某一欄位值設置權重,且R會自動將各權重之和設定為1.
例:從iris數據集中抽取10個樣本,不重複抽樣,用Sepal.Length值作為權重
set.seed(1)sample_n(iris,size=10,replace = F,weight =Sepal.Length)Sepal.Length Sepal.Width Petal.Length Petal.Width Species148 6.5 3.0 5.2 2.0 virginica147 6.3 2.5 5.0 1.9 virginica56 5.7 2.8 4.5 1.3 versicolor2 4.9 3.0 1.4 0.2 setosa141 6.7 3.1 5.6 2.4 virginica10 4.9 3.1 1.5 0.1 setosa30 4.7 3.2 1.6 0.2 setosa65 5.6 2.9 3.6 1.3 versicolor122 5.6 2.8 4.9 2.0 virginica131 7.4 2.8 6.1 1.9 virginica
3、dplyr包的sample_frac()函數
功能:從數據中抽取指定比例的樣本
基本格式:
sample_frac(tbl, size = 1, replace = FALSE, weight = NULL,...)
#tbl為待抽取的原始數據。
#size為需要抽取的樣本數量佔總體樣本的比例,默認值為size=1,表示抽取全體作為樣本,一般我們是不希望抽取全部數據的,所以我們會設置size為小於1的數,比如size=0.6。
# replace = FALSE表示不重複抽樣,如需進行重複抽樣(有放回的抽樣)則設置 replace = TRUE。
#weight = NULL表示默認無權重值,通常用某一欄位值設置權重,且R會自動將各權重之和設定為1。
例:從iris數據集中抽取10%的數據作為樣本數據,不重複抽樣,用Sepal.Length值作為權重
set.seed(1)sample_frac(iris,size=0.1,replace = F,weight =Sepal.Length) Sepal.Length Sepal.Width Petal.Length Petal.Width Species148 6.5 3.0 5.2 2.0 virginica147 6.3 2.5 5.0 1.9 virginica56 5.7 2.8 4.5 1.3 versicolor2 4.9 3.0 1.4 0.2 setosa141 6.7 3.1 5.6 2.4 virginica10 4.9 3.1 1.5 0.1 setosa30 4.7 3.2 1.6 0.2 setosa65 5.6 2.9 3.6 1.3 versicolor122 5.6 2.8 4.9 2.0 virginica131 7.4 2.8 6.1 1.9 virginica125 6.7 3.3 5.7 2.1 virginica145 6.7 3.3 5.7 2.5 virginica37 5.5 3.5 1.3 0.2 setosa69 6.2 2.2 4.5 1.5 versicolor99 5.1 2.5 3.0 1.1 versicolor
4、sample()函數
特徵:每一個元素被抽取的概率相等,為隨機抽樣。
基本格式:sample(x,size,replace=FALSE,prob)
#x為待抽樣的對象
#size為抽取的數量
#replace=FALSE表示默認為不重複抽樣,即抽取的內容不再放回參與後續抽取,若需要進行重複抽樣,則設置為replace=TRUE
#prob為抽中概率,默認為等概率抽樣,即隨機抽樣,若需要進行非等概率抽樣,則可以設置抽中概率,如prob=c(0.2,0.5)
注意,概率之和不用等於1。
例:隨機從iris數據集中抽取15行樣本數據
set.seed(1)sampledata <- iris[sample(nrow(iris),size=15,replace=FALSE),]sampledata Sepal.Length Sepal.Width Petal.Length Petal.Width Species40 5.1 3.4 1.5 0.2 setosa56 5.7 2.8 4.5 1.3 versicolor85 5.4 3.0 4.5 1.5 versicolor134 6.3 2.8 5.1 1.5 virginica30 4.7 3.2 1.6 0.2 setosa131 7.4 2.8 6.1 1.9 virginica137 6.3 3.4 5.6 2.4 virginica95 5.6 2.7 4.2 1.3 versicolor90 5.5 2.5 4.0 1.3 versicolor9 4.4 2.9 1.4 0.2 setosa29 5.2 3.4 1.4 0.2 setosa25 4.8 3.4 1.9 0.2 setosa143 5.8 2.7 5.1 1.9 virginica53 6.9 3.1 4.9 1.5 versicolor105 6.5 3.0 5.8 2.2 virginica
#第一步:sample(nrow(iris),size=15)用於抽出15個行號,nrow(iris)用於計算iris數據集總共的行數,在設置種子為1後(set.seed(1)),抽出的行號如下:
[1] 40 56 85 134 30 131 137 95 90 9 29 25 143 53 105
#第二步:iris[..., ]用於取15個行號對應的列值,並且取所有列。
5、sampling包strata()函數
基本格式:
strata(data, stratanames=NULL, size, method=c("srswor","srswr","poisson","systematic"), pik,description=FALSE)
#data為待抽樣數據。
#stratanames為分層變數名稱。
#size:用於指定每層中抽出的樣本數量。
#method: 從4種抽樣方法選擇一種,分別為無放回、有放回、泊松、系統抽樣,默認為無放回抽樣。
#pik用於設置每層抽樣概率。
#description表示是否輸出含有各層基本信息的結果,默認為不輸出。
例:對iris數據集進行分層抽樣,按照鳶尾花品種進行分層,每層分別抽取2,4,6個樣本,採用無放回抽樣,不返回各層基本信息。
example<-strata(iris,stratanames="Species",size=c(2,4,6),method="srswor",description=FALSE)data<-getdata(iris,example) Sepal.Length Sepal.Width Petal.Length Petal.Width Species ID_unit Prob Stratum14 4.3 3.0 1.1 0.1 setosa 14 0.04 119 5.7 3.8 1.7 0.3 setosa 19 0.04 160 5.2 2.7 3.9 1.4 versicolor 60 0.08 279 6.0 2.9 4.5 1.5 versicolor 79 0.08 293 5.8 2.6 4.0 1.2 versicolor 93 0.08 295 5.6 2.7 4.2 1.3 versicolor 95 0.08 2103 7.1 3.0 5.9 2.1 virginica 103 0.12 3108 7.3 2.9 6.3 1.8 virginica 108 0.12 3110 7.2 3.6 6.1 2.5 virginica 110 0.12 3131 7.4 2.8 6.1 1.9 virginica 131 0.12 3133 6.4 2.8 5.6 2.2 virginica 133 0.12 3148 6.5 3.0 5.2 2.0 virginica 148 0.12 3
從代碼可見,抽樣由兩部分組成,第一步,確定樣本所在行,第二步,使用getdata()函數將樣本截取出來。
注意:截取的樣本數據中會增加一些欄位,ID_unit、Prob、Stratum,如果你不需要,可以使用以下代碼將其刪除,這裡我們換個思路,即只選取前幾列。
(data<-select(data,Sepal.Length:Species)) Sepal.Length Sepal.Width Petal.Length Petal.Width Species14 4.3 3.0 1.1 0.1 setosa19 5.7 3.8 1.7 0.3 setosa60 5.2 2.7 3.9 1.4 versicolor79 6.0 2.9 4.5 1.5 versicolor93 5.8 2.6 4.0 1.2 versicolor95 5.6 2.7 4.2 1.3 versicolor103 7.1 3.0 5.9 2.1 virginica108 7.3 2.9 6.3 1.8 virginica110 7.2 3.6 6.1 2.5 virginica131 7.4 2.8 6.1 1.9 virginica133 6.4 2.8 5.6 2.2 virginica148 6.5 3.0 5.2 2.0 virginica
如有其他好工具出現,後續更新。
(轉載請註明出處)
推薦閱讀: