簡體   English   中英

在R中分類數據集

[英]Categorize dataset in R

我在對數據集進行分類時遇到問題。

數據集是一個矩陣,其中的行是觀察值,而列是要素。 每個特征值都在0到1之間。該數據集用於訓練目的,由於我要使用的方法對小變化敏感,因此必須對數據集進行格式化以使其不敏感。

我的想法是,與其提供原始數據,我不希望根據特征值的數值將特征值分類到bin中,並提供bin中間值作為訓練的訓練數據。

例如 箱為(1-2,2-3,3-4,4-5,5-6,6-7,7-8,8-9,9-10)

dataset #original dataset
>         [,1] [,2] [,3] [,4] [,5]
[1,]    8.1    5.3   10    4.4    4.6
[2,]    5.2   10    3.2    9.3    3.5
[3,]    7.3    1.6    9    8.9    8.4
[4,]    6.4    2.8    8    6.5    9.3
[5,]   10    4.3    2.2    1.1    5.3

transformed_dataset #binned dataset


>         [,1] [,2] [,3] [,4] [,5]
[1,]    8.5    5.5   9.5   4.5    4.5
[2,]    5.5   9.5   3.5    9.5   3.5
[3,]    7.5    1.5   8.5    8.5    8.5
[4,]    6.5    2.5   8.5    6.5    9.5
[5,]    9.5    4.5  2.5    1.5    5.5

我不確定如何將這樣的數據進行naiveBayes ,並將其作為來自library("lattice") naiveBayes輸入。 我知道signif可以將值舍入為給定的數字位數,從而“將其綁定”,但是我實際上無法確定bin的數量。

分級似乎是改善分類的一種方法。 但是我不確定如何提供它作為輸入。

關於data.frame的更新

我想我忘了提到它,但是數據存儲在data.frame ,而我訪問數據的方式是通過$ data進行的。 data.frame都為每個觀察提供標簽,可以通過$ labels訪問。

您在此處可能會遇到一些數據類型的麻煩,因為matrix類不能很好地與因子配合使用-合並間隔最好由因子來描述。

為了進行裝箱,可以使用基本R安裝中的cut功能,例如:

> data <- c(1,2,4,1,5,3,3,5,2,2,5,5,5,7,8,9,5,3,2,6,8,9,3,1)
> breaks <- c(0, 3, 6, 9)
> cut(data, breaks=breaks)
 [1] (0,3] (0,3] (3,6] (0,3] (3,6] (0,3] (0,3] (3,6] (0,3] (0,3] (3,6] (3,6]
 [13] (3,6] (6,9] (6,9] (6,9] (3,6] (0,3] (0,3] (3,6] (6,9] (6,9] (0,3] (0,3]
 Levels: (0,3] (3,6] (6,9]

或者,使用左間隔:

> cut(data, breaks=breaks, right=FALSE)
 [1] [0,3) [0,3) [3,6) [0,3) [3,6) [3,6) [3,6) [3,6) [0,3) [0,3) [3,6) [3,6)
[13] [3,6) [6,9) [6,9) <NA>  [3,6) [3,6) [0,3) [6,9) [6,9) <NA>  [3,6) [0,3)
Levels: [0,3) [3,6) [6,9)

請注意,您提供的中斷應該覆蓋整個數據集,否則您將獲得一些NA

一個簡單的解決方案可能是這樣的:

d <- matrix(c(8.1, 5.3, 10, 4.4, 4.6,
              5.2, 10, 3.2, 9.3, 3.5,
              7.3, 1.6, 9, 8.9, 8.4,
              6.4, 2.8, 8, 6.5, 9.3,
              10, 4.3, 2.2, 1.1, 5.3), nrow=5, ncol=5, byrow=TRUE)

d <- as.data.frame(apply(d, 2, function(column) {
  as.factor(round(column+0.5)-0.5)
}))

導致結果:

> d
   V1  V2  V3  V4  V5
1 8.5 5.5 9.5 4.5 4.5
2 5.5 9.5 3.5 9.5 3.5
3 7.5 1.5 9.5 8.5 8.5
4 6.5 2.5 7.5 6.5 9.5
5 9.5 4.5 2.5 1.5 5.5

轉換后,數據集的列就是因子,這意味着naiveBayes不會將其視為數字變量而是分類變量。

> class(d[,1])
[1] "factor"
> levels(d[,1])
[1] "5.5" "6.5" "7.5" "8.5" "9.5"

請注意,如果您具有等於0的任何值,那么添加和刪除0.5的技巧將失敗-它將分配給級別“ 0”而不是“ 0.5”。 您可以解決此問題,並將此行添加到函數中:

column[which(column == 0)] <- 0.5

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM