Tôi có cấu hình R sau:
Hệ điều hành: LinuxR phiên bản 3.0.1 (2013-05-16)rmr2 phiên bản 2.2.1rhdfs phiên bản 1.0.6hadoop phiên bản 1.2.0
Làm cách nào để chuyển đổi kết quả của mô hình svm bằng hadoop với gói rmr2? Vì vậy tôi có thể sử dụng mô hình đã xây dựng như bình thường:
dự đoán(svm1, "dữ liệu mới")
Tôi có đoạn mã sau:
# đặt biến eviremonet
Sys.setenv(HADOOP_CMD="~/Downloads/hadoop-1.2.0/bin/hadoop")
Sys.setenv(HADOOP_HOME="~/Downloads/hadoop-1.2.0/")
# bắt đầu hadoop
# tải thư viện
thư viện (rmr2)
thư viện (rhdfs)
thư viện (e1071)
# tải dữ liệu mẫu
dữ liệu (mống mắt)
# khởi tạo hdfs
hdfs.init()
# đẩy dữ liệu lên hdfs
iris.dfs <- to.dfs(iris)
# xác định chức năng bản đồ
iris.map <- hàm(k, v)
{
svm(v$Species ~ ., data=v)
}
#rummarjob
iris.svm <- mapreduce(input=iris.dfs, map=iris.map)
# lấy lại kết quả
iris.res <- from.dfs(iris.svm)
svm1 <- svm(iris$Species ~ ., data=iris)
lớp(iris.res)
lớp (svm1)
Kết quả của cả hai lớp như sau:
> lớp(iris.res)
[1] "danh sách"
> lớp(svm1)
[1] "svm.formula" "svm"
>str(svm1)
Danh sách 30
$ call : ngôn ngữ svm(công thức = iris$Species ~ ., data = iris)
$ loại: số 0
hạt nhân $: số 2
chi phí $: số 1
$ độ : số 3
$ gamma : số 0,25
$ coef0 : số 0
$nu : số 0,5
$ epsilon : số 0,1
$ thưa thớt: logi SAI
$ được chia tỷ lệ : logi [1:4] TRUE TRUE TRUE TRUE
$x.scale :Danh sách 2
..$ được chia tỷ lệ:trung tâm: Được đặt tên num [1:4] 5,84 3,06 3,76 1,20
.. ..- attr(*, "names")= chr [1:4] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width"
..$scaled:scale : Được đặt tên num [1:4] 0,828 0,436 1,765 0,762
.. ..- attr(*, "names")= chr [1:4] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width"
$y.scale : NULL
$nclass: int 3
$ cấp độ : chr [1:3] "setosa" "versicolor" "virginica"
$ tot.nSV : int 51
$ nSV : int [1:3] 8 22 21
$ nhãn : int [1:3] 1 2 3
$ SV : số [1:51, 1:4] -1,743 -1,864 -0,173 -0,535 -1,501 ...
..- attr(*, "dimnames")=Danh sách 2
.. ..$ : chr [1:51] "9" "14" "16" "21" ...
.. ..$ : chr [1:4] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width"
Chỉ số $: int [1:51] 9 14 16 21 23 24 26 42 51 53 ...
$ rho : số [1:3] -0,0203 0,1312 -0,0629
$compprob: logi SAI
$ thăm dòA : NULL
$probB : NULL
$sigma : KHÔNG
$ coefs : num [1:51, 1:2] 0,0891 0,0000 0,8652 0,0000 0,0000 ...
$ na.action : NULL
$ được trang bị : Hệ số w/ 3 cấp độ "setosa",,"versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
..- attr(*, "names")= chr [1:150] "1" "2" "3" "4" ...
$ quyết định.giá trị: num [1:150, 1:3] 1,20 1,06 1,18 1,11 1,19 ...
..- attr(*, "dimnames")=Danh sách 2
.. ..$ : chr [1:150] "1" "2" "3" "4" ...
.. ..$ : chr [1:3] "setosa/versicolor" "setosa/virginica" "versicolor/virginica"
$ terms :Các lớp 'thuật ngữ', 'công thức' chiều dài 3 iris$Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width
.. ..- attr(*, "variables")= danh sách ngôn ngữ(iris$Species, Sepal.Length, Sepal.Width, Petal.Length, Petal.Width)
.. ..- attr(*, "factors")= int [1:5, 1:4] 0 1 0 0 0 0 0 1 0 0 ...
.. .. ..- attr(*, "dimnames")=Danh sách 2
.. .. .. ..$ : chr [1:5] "iris$Species" "Sepal.Length" "Sepal.Width" "Petal.Length" ...
.. .. .. ..$ : chr [1:4] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width"
.. ..- attr(*, "term.labels")= chr [1:4] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width"
.. ..- attr(*, "order")= int [1:4] 1 1 1 1
.. ..- attr(*, "chặn")= num 0
.. ..- attr(*, "response")= int 1
.. ..- attr(*, ".Environment")=
.. ..- attr(*, "predvars")= danh sách ngôn ngữ(iris$Species, Sepal.Length, Sepal.Width, Petal.Length, Petal.Width)
.. ..- attr(*, "dataClasses")= Được đặt tên là chr [1:5] "factor" "numeric" "numeric" "numeric" ...
.. .. ..- attr(*, "names")= chr [1:5] "iris$Species" "Sepal.Length" "Sepal.Width" "Petal.Length" ...
- attr(*, "class")= chr [1:2] "svm.formula" "svm"
>str(iris.res)
Danh sách 2
Khóa $: NULL
$val:Danh sách 30
..$ call : ngôn ngữ svm(công thức = v$Species ~ ., data = v)
..$ loại: số 0
..$ kernel : số 2
..$ chi phí : số 1
..$ độ : số 3
..$ gamma : số 0,25
..$ coef0 : số 0
..$ nu : số 0,5
..$ epsilon : số 0,1
..$ thưa thớt : logi FALSE
..$ được chia tỷ lệ : logi [1:4] TRUE TRUE TRUE TRUE
..$ x.scale :Danh sách 2
.. ..$scaled:center: Được đặt tên num [1:4] 5,84 3,06 3,76 1,20
.. .. ..- attr(*, "names")= chr [1:4] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width"
.. ..$scaled:scale : Được đặt tên num [1:4] 0,828 0,436 1,765 0,762
.. .. ..- attr(*, "names")= chr [1:4] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width"
..$y.scale : NULL
..$ nclass : int 3
..$ cấp độ : chr [1:3] "setosa" "versicolor" "virginica"
..$ tot.nSV : int 51
..$ nSV : int [1:3] 8 22 21
..$ nhãn : int [1:3] 1 2 3
..$ SV : num [1:51, 1:4] -1,743 -1,864 -0,173 -0,535 -1,501 ...
.. ..- attr(*, "dimnames")=Danh sách 2
.. .. ..$ : chr [1:51] "9" "14" "16" "21" ...
.. .. ..$ : chr [1:4] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width"
..$ chỉ số: int [1:51] 9 14 16 21 23 24 26 42 51 53 ...
..$ rho : num [1:3] -0,0203 0,1312 -0,0629
..$ compprob : logi FALSE
..$ thăm dòA : NULL
..$ thăm dòB : NULL
..$sigma : KHÔNG
..$ coefs : num [1:51, 1:2] 0,0891 0,0000 0,8652 0,0000 0,0000 ...
..$ na.action : NULL
..$ được trang bị : Hệ số w/ 3 cấp độ "setosa",,"versicolor",..: 1 1 1 1 1 1 1 1 1 1 1 ...
.. ..- attr(*, "names")= chr [1:150] "1" "2" "3" "4" ...
..$ quyết định.giá trị: num [1:150, 1:3] 1,20 1,06 1,18 1,11 1,19 ...
.. ..- attr(*, "dimnames")=Danh sách 2
.. .. ..$ : chr [1:150] "1" "2" "3" "4" ...
.. .. ..$ : chr [1:3] "setosa/versicolor" "setosa/virginica" "versicolor/virginica"
..$ terms :Các lớp 'thuật ngữ', 'công thức' dài 3 v$Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width
.. .. ..- attr(*, "variables")= danh sách ngôn ngữ(v$Species, Sepal.Length, Sepal.Width, Petal.Length, Petal.Width)
.. .. ..- attr(*, "factors")= int [1:5, 1:4] 0 1 0 0 0 0 0 1 0 0 ...
.. .. .. ..- attr(*, "dimnames")=Danh sách 2
.. .. .. .. ..$ : chr [1:5] "v$Species" "Sepal.Length" "Sepal.Width" "Petal.Length" ...
.. .. .. .. ..$ : chr [1:4] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width"
.. .. ..- attr(*, "term.labels")= chr [1:4] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width"
.. .. ..- attr(*, "order")= int [1:4] 1 1 1 1
.. .. ..- attr(*, "chặn")= num 0
.. .. ..- attr(*, "response")= int 1
.. .. ..- attr(*, ".Environment")=
.. .. ..- attr(*, "predvars")= danh sách ngôn ngữ(v$Species, Sepal.Length, Sepal.Width, Petal.Length, Petal.Width)
.. .. ..- attr(*, "dataClasses")= Chr được đặt tên [1:5] "factor" "numeric" "numeric" "numeric" ...
.. .. .. ..- attr(*, "names")= chr [1:5] "v$Species" "Sepal.Length" "Sepal.Width" "Petal.Length" ...
Nhưng làm cách nào tôi có thể chuyển đổi danh sách kết quả thành cùng lớp với lệnh gọi smv thông thường?
Chỉ cần thay đổi svm(v$Species ~ ., data=v)
được bọc trong một chức năng bản đồ danh sách
Gọi, chẳng hạn như list(svm(v$species~ ., data=v))
.map chỉ có thể trả về danh sách, ma trận, vectơ và khung dữ liệu. Nếu bạn trả về một mô hình (rõ ràng, không phải thứ tôi đã thực hiện có mục đích), nó sẽ bị ép buộc vào một danh sách. Có lẽ miễn là giá trị trả về không phải là một trong bốn giá trị được hỗ trợ, tôi có thể thực hiện điều đó một cách phòng thủ và chỉ cần tát một cái danh sách
, nhưng tôi không muốn cố tỏ ra quá thông minh và đoán quá nhiều. Một vấn đề khác với cách tiếp cận của bạn là hàm bản đồ sẽ được gọi trên một tập hợp con tùy ý của tập dữ liệu (đối với các tập dữ liệu lớn hơn), do đó bạn sẽ nhận được danh sách các mô hình ở đầu ra (à, sau khi bạn gọi giá trị đầu ra). bạn có nhiều máy vectơ hỗ trợ, bạn sẽ làm gì, bạn có xử lý nó một cách tổng thể không? Nhưng các tập con trong giai đoạn ánh xạ là tùy ý, chúng không có bất kỳ thuộc tính thống kê nào, chẳng hạn như được ngẫu nhiên hóa. Có vẻ như bạn cho rằng rmr có siêu năng lực làm cho hàm svm được phân bố song song, nhưng thực tế không phải vậy, nó sẽ chỉ gọi nó song song trên cluster có các khối dữ liệu khác nhau. Trong một ví dụ nhỏ, chỉ có một khối, nhưng điều này là lừa dối. thử rmr.options(keyval.length = 3)
Xem điều gì xảy ra với các khối rất nhỏ (không phù hợp để sản xuất). Một cách tiếp cận khác là xây dựng mô hình trên mẫu lớn nhất mà bạn có thể tải trên một máy và sau đó chạy dự đoán song song. Tất nhiên, điều này không thể mở rộng được trong giai đoạn tìm hiểu, nhưng tôi biết đó là điều mà các công ty khởi nghiệp lớn làm. Hãy xem bài viết lấy mẫu lại của Uri Laserson trên blog cloudera, tôi nghĩ nó sẽ cung cấp cho bạn một số ý tưởng hay. Cuối cùng, chúng tôi có một diễn đàn dành riêng cho rmr và các gói liên quan trên Google Groups và rất hoan nghênh bạn tham gia cộng đồng của chúng tôi.
Tôi là một lập trình viên xuất sắc, rất giỏi!