R語言資料離散化使funModeling變得容易
tl; dr:將數值變數轉換為分類,如下圖所示。
閱讀時間〜6分鐘
開始吧!
該軟體包funModeling(從版本> 1.6.6)引入了兩個
功能discretize_get_bins,它們discretize_df協同工作
以幫助我們完成離散化任務。
# First we load the libraries# install.packages("funModeling")library(funModeling)library(dplyr)
我們來看一個例子。首先,我們檢查當前的資料型別:
df_status(heart_disease, print_results = F) %>% select(variable, type, unique, q_na) %>% arrange(type)## variable type unique q_na## 1 gender factor 2 0## 2 chest_pain factor 4 0## 3 fasting_blood_sugar factor 2 0## 4 resting_electro factor 3 0## 5 thal factor 3 2## 6 exter_angina factor 2 0## 7 has_heart_disease factor 2 0## 8 age integer 41 0## 9 resting_blood_pressure integer 50 0## 10 serum_cholestoral integer 152 0## 11 max_heart_rate integer 91 0## 12 exer_angina integer 2 0## 13 slope integer 3 0## 14 num_vessels_flour integer 4 4## 15 heart_disease_severity integer 5 0## 16 oldpeak numeric 40 0
我們有因子,整數和數字變數:一個好的組合!該
改造有兩個步驟。首先,獲得
每個片段開始的削減或閾值。第二步是使用
閾值來獲取變數作為分類。
在下面的例子中兩個變數將被離散化:
max_heart_rate和oldpeak。此外,我們將介紹一些NA值
到oldpeak測試功能資料缺失是如何工作的。
# Introducing some missing values in the first 30 rows of the oldpeak variableheart_disease$oldpeak[1:30]=NA
步驟1)獲取每個輸入變數的bin閾值:
discretize_get_bins返回需要在
discretize_df函式中使用的資料幀,該資料幀返回最終處理的資料幀。
d_bins=discretize_get_bins(data=heart_disease, input=c("max_heart_rate", "oldpeak"), n_bins=5)## [1] "Variables processed: max_heart_rate, oldpeak"# Checking `d_bins` object:d_bins## variable cuts## 1 max_heart_rate -Inf|131|147|160|171|Inf## 2 oldpeak -Inf|0.1|0.3|1.1|2|Inf
引數:
data:包含要處理的變數的資料框。
input:包含變數名稱的字串向量。
n_bins:離散化
資料中要包含的箱/段的數量。
我們可以看到每個變數的每個閾值點(或上邊界)。
請注意,-Inf不是一個實際的上限:下一個
示例中的更多資訊。
步驟2)應用每個變數的閾值:
# Now it can be applied on the same data frame or in a new one (for example, in a predictive model that changes data over time)heart_disease_discretized=discretize_df(data=heart_disease, data_bins=d_bins, stringsAsFactors=T)## [1] "Variables processed: max_heart_rate, oldpeak"
引數:
data:包含要
離散的數值變數的資料框。
data_bins:返回的資料幀discretize_get_bins。如果
使用者更改,則每個上邊界必須用
管道字元(|)分隔,如示例所示。
stringsAsFactors:TRUE預設情況下,最終變數將是
因子(而不是一個字元),並在繪圖時有用。
最終結果和他們的陰謀
之前和之後
最終發行:
describe(heart_disease_discretized %>% select(max_heart_rate,oldpeak))## heart_disease_discretized %>% select(max_heart_rate, oldpeak)#### 2 Variables 303 Observations## ---------------------------------------------------------------------------## max_heart_rate## n missing distinct## 303 0 5#### Value [-Inf, 131) [ 131, 147) [ 147, 160) [ 160, 171) [ 171, Inf]## Frequency 63 59 62 62 57## Proportion 0.208 0.195 0.205 0.205 0.188## ---------------------------------------------------------------------------## oldpeak## n missing distinct## 303 0 6#### Value [-Inf, 0.1) [ 0.1, 0.3) [ 0.3, 1.1) [ 1.1, 2.0) [ 2.0, Inf]## Frequency 97 18 54 54 50## Proportion 0.320 0.059 0.178 0.178 0.165#### Value NA.## Frequency 30## Proportion 0.099## ---------------------------------------------------------------------------p5=ggplot(heart_disease_discretized, aes(max_heart_rate)) + geom_bar(fill="#0072B2") + theme_bw() + theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1))p6=ggplot(heart_disease_discretized, aes(oldpeak)) + geom_bar(fill="#CC79A7") + theme_bw() + theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1))gridExtra::grid.arrange(p5, p6, ncol=2)
顯示最終的變數分佈:
有時候,
在計算變數中顯示的相同頻率時,不可能得到每桶相同數量的情況oldpeak
。
NA處理
關於NA價值觀,新oldpeak變數有六個
類別:定義五個類別n_bins=5加上NA.價值。
注意最後一點表示缺少值的存在。
更多資訊
discretize_df將永遠不會返回一個NA值,而不
會將其轉換為字串NA.。
n_bins設定所有變數的箱數。
如果input缺少,那麼它將執行所有數值/整數
變數,其唯一值的數量大於
箱數(n_bins)。
只有定義的變數input將被處理,而
其餘的變數根本不會被修改。
discretize_get_bins僅返回可以
根據需要手動更改的資料框,無論是在文字檔案還是在R會話中。
用新資料離散化
在我們的資料中,最小值為max_heart_rate71.資料
準備必須對新資料有效;例如,如果一個新病人到達
其max_heart_rate是68,那麼當前程序將分配
他/她來的最低類別。
在其他包中的其他函式中,此準備可能會返回一個,
NA因為它不在該段中。
正如我們之前指出的那樣,如果新資料隨著時間的推移而出現,很可能會
得到新的最小/最大值/秒。這可以打破我們的過程。為了解決這個問題,
discretize_df將始終具有最低/最高值-Inf/Inf;
因此,低於/高於最小值/最大值的任何新值都將被
新增到適用的最低或最高段。
返回的資料幀discretize_get_bins必須儲存以便
將其應用於新資料。如果離散化不是
用新資料執行的,那麼就沒有兩個功能的意義:它只能是
一個。另外,不需要儲存結果
discretize_get_bins。
有了這兩步法,我們可以處理這兩種情況。
關於兩步離散化的結論
discretize_get_bins+的使用discretize_df提供了快速的資料
準備,一個乾淨的資料框架即可使用。清楚地
顯示每個部分開始和結束的位置,進行
統計報告時是不可或缺的。
的決定不會失敗,在新資料的新最小值/最大值打交道時
是只是一個決定。在某些情況下,失敗將是期望的
行為。
人為干預:離散化資料框架的最簡單方法
是選擇與每個變數相同數量的箱子,
就像我們看到的例子一樣,然而,如果需要調整,那麼一些
變數可能需要不同數量的箱子。例如,一個
分散較少的變數可以用少量的箱子來工作。
段的數量的共同值可以是3,5,10或20(但
不多於)。資料科學家做出這個決定是由他們決定的。
獎金曲目:權衡藝術
大量垃圾箱=>更多的噪音捕獲。
箱數量較少=>過度簡化,方差較小。
這些術語聽起來是否和機器學習中的其他術語類似?
答案是肯定的!。僅舉一個例子:在
預測模型中增加或減去變數之間的折衷。
更多的變數:過度配置警報(太詳細的預測模型)。
更少的變數:欠妥的危險(沒有足夠的資訊來
捕捉一般的模式)。
就像東方哲學幾千年來所指出的那樣,有一種藝術在一種價值和另一種價值之間找到適當的平衡。
大資料部落——中國專業的第三方資料服務提供商,提供定製化的一站式資料探勘和統計分析諮詢服務 統計分析和資料探勘諮詢服務 :y0.cn/teradat(諮詢服務請聯絡官網客服) QQ:3025393450 【服務場景】 科研專案; 公司專案外包 ;線上線下一對一培訓 ;學術研究。 【大資料部落】提供定製化的一站式資料探勘和統計分析諮詢服務分享最新的大資料資訊,每天學習一點資料分析,讓我們一起做有態度的資料人 微信客服號:lico_9e QQ交流群:186388004