1. 程式人生 > >R語言資料離散化使funModeling變得容易

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 【大資料部落】r語言電商網站爬蟲