spam
スパム メッセージに関連する 58 列と約 3500 行のデータを含むというデータセットがあります。
将来、このデータセットで線形回帰を実行する予定ですが、事前に前処理を行い、列を標準化して平均と単位分散をゼロにしたいと考えています。
これを行う最善の方法は R を使用することだと言われたので、どうすれば R で正規化を達成できますか? 私はすでにデータを適切にロードしており、このタスクを実行するためのパッケージまたはメソッドを探しています。
spam
スパム メッセージに関連する 58 列と約 3500 行のデータを含むというデータセットがあります。
将来、このデータセットで線形回帰を実行する予定ですが、事前に前処理を行い、列を標準化して平均と単位分散をゼロにしたいと考えています。
これを行う最善の方法は R を使用することだと言われたので、どうすれば R で正規化を達成できますか? 私はすでにデータを適切にロードしており、このタスクを実行するためのパッケージまたはメソッドを探しています。
平均が 0 で標準偏差が 1 であると言うつもりだったと仮定する必要があります。データがデータフレームにあり、すべての列が数値である場合はscale
、データに対して関数を呼び出すだけで、必要なことを行うことができます。
dat <- data.frame(x = rnorm(10, 30, .2), y = runif(10, 3, 5))
scaled.dat <- scale(dat)
# check that we get mean of 0 and sd of 1
colMeans(scaled.dat) # faster version of apply(scaled.dat, 2, mean)
apply(scaled.dat, 2, sd)
組み込み関数の使用は上品です。この猫のように:
clusterSim パッケージの data.Normalization 関数を使用して、データを簡単に正規化することもできます。データ正規化のさまざまな方法を提供します。
data.Normalization (x,type="n0",normalization="column")
引数
x
ベクトル、行列、またはデータセット タイプ
正規化のタイプ: n0 - 正規化なし
n1 - 標準化 ((x-mean)/sd)
n2 - 位置の標準化 ((x-median)/mad)
n3 - 単位化 ((x 平均)/範囲)
n3a - 位置の単位化 ((x-median)/range)
n4 - 最小値ゼロの単位化 ((x-min)/範囲)
n5 - 範囲 <-1,1> の正規化 ((x-mean)/max(abs(x-mean)))
n5a - 範囲 <-1,1> の位置の正規化 ((x-median)/max(abs(x-median)))
n6 - 商変換 (x/sd)
n6a - 位置商変換 (x/mad)
n7 - 商変換 (x/範囲)
n8 - 商変換 (x/max)
n9 - 商変換 (x/平均)
n9a - 位置商変換 (x/中央値)
n10 - 商変換 (x/合計)
n11 - 商変換 (x/sqrt(SSQ))
n12 - 正規化 ((x-mean)/sqrt(sum((x-mean)^2)))
n12a - 位置の正規化 ((x-median)/sqrt(sum((x-median)^2)))
n13 - ゼロを中心点とする正規化 ((x-midrange)/(range/2))
正規化
「列」 - 変数による正規化、「行」 - オブジェクトによる正規化
v0.7.4ではdplyr
、次を使用してすべての変数をスケーリングできますmutate_all()
。
library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
library(tibble)
set.seed(1234)
dat <- tibble(x = rnorm(10, 30, .2),
y = runif(10, 3, 5),
z = runif(10, 10, 20))
dat %>% mutate_all(scale)
#> # A tibble: 10 x 3
#> x y z
#> <dbl> <dbl> <dbl>
#> 1 -0.827 -0.300 -0.0602
#> 2 0.663 -0.342 -0.725
#> 3 1.47 -0.774 -0.588
#> 4 -1.97 -1.13 0.118
#> 5 0.816 -0.595 -1.02
#> 6 0.893 1.19 0.998
#> 7 -0.192 0.328 -0.948
#> 8 -0.164 1.50 -0.748
#> 9 -0.182 1.25 1.81
#> 10 -0.509 -1.12 1.16
特定の変数は、次を使用して除外できますmutate_at()
。
dat %>% mutate_at(scale, .vars = vars(-x))
#> # A tibble: 10 x 3
#> x y z
#> <dbl> <dbl> <dbl>
#> 1 29.8 -0.300 -0.0602
#> 2 30.1 -0.342 -0.725
#> 3 30.2 -0.774 -0.588
#> 4 29.5 -1.13 0.118
#> 5 30.1 -0.595 -1.02
#> 6 30.1 1.19 0.998
#> 7 29.9 0.328 -0.948
#> 8 29.9 1.50 -0.748
#> 9 29.9 1.25 1.81
#> 10 29.8 -1.12 1.16
reprex パッケージ(v0.2.0)によって 2018-04-24 に作成されました。
@BBKim はほとんど最良の答えを出しましたが、もっと短くすることもできます。まだ誰も思いつかなかったことに驚いています。
dat <- data.frame(x = rnorm(10, 30, .2), y = runif(10, 3, 5))
dat <- apply(dat, 2, function(x) (x - mean(x)) / sd(x))
パッケージ「recommenderlab」を使用してください。パッケージをダウンロードしてインストールします。このパッケージには、コマンド「Normalize」が組み込まれています。また、正規化の多くの方法、つまり「中心」または「Z スコア」のいずれかを選択することもできます。次の例に従います。
## create a matrix with ratings
m <- matrix(sample(c(NA,0:5),50, replace=TRUE, prob=c(.5,rep(.5/6,6))),nrow=5, ncol=10, dimnames = list(users=paste('u', 1:5, sep=”), items=paste('i', 1:10, sep=”)))
## do normalization
r <- as(m, "realRatingMatrix")
#here, 'centre' is the default method
r_n1 <- normalize(r)
#here "Z-score" is the used method used
r_n2 <- normalize(r, method="Z-score")
r
r_n1
r_n2
## show normalized data
image(r, main="Raw Data")
image(r_n1, main="Centered")
image(r_n2, main="Z-Score Normalization")