Saya memiliki dataset spam
yang berisi 58 kolom dan sekitar 3500 baris data yang terkait dengan pesan spam.
Saya berencana menjalankan beberapa regresi linier pada dataset ini di masa depan, tetapi saya ingin melakukan beberapa pra-pemrosesan sebelumnya dan menstandarisasi kolom untuk memiliki mean nol dan varian unit.
Saya telah diberitahu cara terbaik untuk melakukan ini adalah dengan R, jadi saya ingin bertanya bagaimana saya bisa mencapai normalisasi dengan R ? Saya sudah mendapatkan data dengan benar dan saya hanya mencari beberapa paket atau metode untuk melakukan tugas ini.
sumber
Menyadari bahwa pertanyaannya sudah lama dan satu jawaban diterima, saya akan memberikan jawaban lain untuk referensi.
scale
dibatasi oleh fakta bahwa ia menskala semua variabel . Solusi di bawah ini memungkinkan untuk menskala hanya nama variabel tertentu sambil mempertahankan variabel lain tidak berubah (dan nama variabel dapat dihasilkan secara dinamis):yang memberi saya ini:
dan
EDIT 1 (2016) : Alamat komentar Julian: output dari
scale
adalah matriks Nx1 jadi idealnya kita harus menambahkanas.vector
untuk mengubah tipe matriks kembali menjadi tipe vektor. Julian terima kasih!EDIT 2 (2019) : Mengutip komentar Duccio A.: Untuk dplyr terbaru (versi 0.8) Anda perlu mengubah dplyr :: funcs dengan daftar, seperti
dat %>% mutate_each_(list(~scale(.) %>% as.vector), vars=c("y","z"))
EDIT 3 (2020) : Terima kasih kepada @mj_whales: solusi lama sudah usang dan sekarang kita perlu menggunakan
mutate_at
.sumber
f(g(x))
itu akan terlihat lebih bagus jika ada yang menulisx %>% g %>% f
. Dengan kata lain,dat %>% mutate_each_(funs(scale),vars=c("y","z"))
itu adilmutate_each_(dat,funs(scale),vars=c("y","z"))
. Operator sangat membantu ketika rantai sangat panjang karenaf(g(h(i(j(x)))))
bisa sangat sulit dibaca.dplyr
(versi 0.8) yang Anda butuhkan untuk perubahandplyr::funcs
denganlist
, sepertidat %>% mutate_each_(list(~scale(.) %>% as.vector), vars=c("y","z"))
mutate_each_()
sekarang sudah ditinggalkan. Anda bisa menggunakannyamutate_at()
. Cara baru untuk melakukannya adalah:dat2 <- dat %>% mutate_at(c("y", "z"), scale)
Ini berumur 3 tahun. Namun, saya merasa saya harus menambahkan yang berikut:
Normalisasi yang paling umum adalah transformasi-z , di mana Anda mengurangi mean dan membaginya dengan deviasi standar variabel Anda. Hasilnya akan memiliki mean = 0 dan sd = 1.
Untuk itu, Anda tidak perlu paket apa pun.
Itu dia.
sumber
mutate(var = (var - mean(var))/sd(var))
.myVar <- (zVar * sd(zVar)) + mean(zVar)
, kan?newVar <- (zVar * sd(myVar)) + mean(myVar)
. Anda harus menggunakan mean / sd asli. Saat Anda menulisnya, Anda akan berlipat gandasd(zVar)=1
dan menambahkanmean(zVar)=0
, jadi tidak ada yang akan berubah :)Paket 'Caret' menyediakan metode untuk memproses data sebelumnya (mis. Pemusatan dan penskalaan). Anda juga dapat menggunakan kode berikut:
Lebih detail: http://www.inside-r.org/node/86978
sumber
Ketika saya menggunakan solusi yang dinyatakan oleh Dason, alih-alih mendapatkan data frame sebagai hasilnya, saya mendapat vektor angka (nilai skala dari df saya).
Jika seseorang mengalami masalah yang sama, Anda harus menambahkan as.data.frame () ke kode, seperti ini:
Saya harap ini akan bermanfaat bagi ppl yang memiliki masalah yang sama!
sumber
train_dt[-24] <- scale(train_dt[-24])
mana "24" adalah nomor kolom yang akan dikecualikanAnda dapat dengan mudah menormalkan data juga menggunakan data. Fungsi normalisasi dalam paket clusterSim. Ini menyediakan metode normalisasi data yang berbeda.
Argumen
x jenis
vektor, matriks atau dataset tipe
normalisasi: n0 - tanpa normalisasi
n1 - standardisasi ((x-mean) / sd)
n2 - standardisasi posisi ((x-median) / mad)
n3 - unitisasi ((rata-rata x) / rentang)
n3a - unitisasi posisi ((x-median) / range)
n4 - unitisasi dengan nol minimum ((x-min) / range)
n5 - normalisasi dalam kisaran <-1,1> ((x-mean) / max (abs (x-mean)))
n5a - normalisasi posisi dalam kisaran <-1,1> ((x-median) / max (abs (x-median)))
n6 - transformasi hasil bagi (x / sd)
n6a - transformasi hasil bagi posisi (x / mad)
n7 - transformasi hasil bagi (x / rentang)
n8 - transformasi hasil bagi (x / maks)
n9 - transformasi hasil bagi (x / rata-rata)
n9a - transformasi hasil bagi posisi (x / median)
n10 - transformasi hasil bagi (x / jumlah)
n11 - transformasi hasil bagi (x / sqrt (SSQ))
n12 - normalisasi ((rata-rata x) / sqrt (jumlah ((rata-rata x) ^ 2))))
n12a - normalisasi posisi ((x-median) / sqrt (jumlah ((x-median) ^ 2))))
n13 - normalisasi dengan nol menjadi titik pusat ((x-midrange) / (rentang / 2))
normalisasi
"kolom" - normalisasi menurut variabel, "baris" - normalisasi menurut objek
sumber
Dengan
dplyr
v0.7.4 semua variabel dapat diskalakan dengan menggunakanmutate_all()
:Variabel spesifik dapat dikecualikan menggunakan
mutate_at()
:Dibuat pada 2018-04-24 oleh paket reprex (v0.2.0).
sumber
Sekali lagi, meskipun ini adalah pertanyaan lama, ini sangat relevan! Dan saya telah menemukan cara sederhana untuk menormalkan kolom-kolom tertentu tanpa perlu paket apa pun:
Sebagai contoh
Anda akan melihat bahwa kolom y dan z telah dinormalisasi. Tidak perlu paket :-)
sumber
Skala dapat digunakan untuk frame data lengkap dan kolom tertentu. Untuk kolom tertentu, kode berikut dapat digunakan:
Bingkai data lengkap
sumber
The
dplyr
paket memiliki dua fungsi yang melakukan hal ini.Untuk bermutasi kolom tertentu dari tabel data, Anda dapat menggunakan fungsi ini
mutate_at()
. Untuk bermutasi semua kolom, Anda dapat menggunakanmutate_all
.Berikut ini adalah contoh singkat untuk menggunakan fungsi-fungsi ini untuk membakukan data.
Mutasi kolom tertentu:
Matikan semua kolom:
sumber
Sebelum saya menemukan utas ini, saya memiliki masalah yang sama. Saya memiliki tipe kolom yang bergantung pada pengguna, jadi saya menulis satu
for
loop melalui mereka dan mendapatkan kolom yang diperlukanscale
d. Mungkin ada cara yang lebih baik untuk melakukannya, tetapi ini menyelesaikan masalah dengan baik:as.vector
adalah bagian dibutuhkan, karena ternyatascale
tidakrownames x 1
matriks yang biasanya tidak apa yang ingin Anda miliki di Andadata.frame
.sumber
Gunakan paket "recommenderlab". Unduh dan instal paket. Paket ini memiliki perintah "Normalisasi" di dalamnya. Anda juga dapat memilih salah satu dari banyak metode normalisasi yaitu 'center' atau 'Z-score'. Ikuti contoh berikut:
sumber
Fungsi normalisasi dari paket BBMisc adalah alat yang tepat bagi saya karena dapat menangani nilai-nilai NA.
Berikut cara menggunakannya:
Diberikan dataset berikut,
nilai yang dinormalisasi dapat diperoleh seperti ini:
di mana metode perhitungan tangan mengabaikan kolmun yang mengandung NAS:
(normalizedHuman dibuat daftar NAS ...)
mengenai pemilihan kolom khusus untuk perhitungan, metode generik dapat digunakan seperti ini:
sumber
@BBKim cukup banyak memberikan jawaban terbaik, tetapi itu bisa dilakukan lebih pendek. Saya terkejut belum ada yang datang dengan itu.
dat <- data.frame(x = rnorm(10, 30, .2), y = runif(10, 3, 5)) dat <- apply(dat, 2, function(x) (x - mean(x)) / sd(x))
sumber