2013-07-03 20 views
22

Tôi đang trong quá trình tìm cách làm việc với mạng thần kinh trong R. Là vấn đề học tập, tôi đã đang sử dụng số following problem tại số Kaggle:Làm việc với neuralnet trong R lần đầu tiên: nhận "yêu cầu đối số ma trận/vector phức tạp/số"

Đừng lo lắng, vấn đề này được thiết kế đặc biệt để mọi người học cùng, không có phần thưởng nào gắn liền với nó.

Tôi bắt đầu với một hồi quy logistic đơn giản, điều này thật tuyệt vời khi tôi bị ướt chân. Bây giờ tôi muốn học cách làm việc với các mạng thần kinh. dữ liệu huấn luyện của tôi trông như thế này (Cột: Row):

- survived: 1 
- pclass: 3 
- sex:  male 
- age:  22.0 
- sibsp: 1 
- parch: 0 
- ticket: PC 17601 
- fare:  7.25 
- cabin: C85 
- embarked: S 

đang bắt đầu R của tôi trông như thế này:

> net <- neuralnet(survived ~ pclass + sex + age + sibsp + 
        parch + ticket + fare + cabin + embarked, 
        train, hidden=10, threshold=0.01) 

Khi tôi chạy dòng mã này tôi nhận được lỗi sau:

Error in neurons[[i]] %*% weights[[i]] : 
    requires numeric/complex matrix/vector arguments 

Tôi hiểu rằng vấn đề là theo cách tôi trình bày các biến đầu vào của mình nhưng tôi quá nhiều người mới để hiểu những gì tôi cần làm để sửa lỗi này. Có ai giúp được không?

Cảm ơn!

+2

Nhìn vào dữ liệu của bạn lúc đầu, tôi tin rằng bạn đã chuyển đổi tất cả dữ liệu thành các giá trị số. Ví dụ: cabin = c85, điều đó có nghĩa là gì? Nếu u chuyển đổi giá trị kiểu này thành số, sự cố của bạn sẽ được giải quyết. – user1471980

Trả lời

35

Trước một cách mù quáng đưa ra các dữ liệu vào máy tính, nó là một ý tưởng tốt để nhìn vào nó:

d <- read.csv("train.csv") 
str(d) 
# 'data.frame': 891 obs. of 12 variables: 
# $ PassengerId: int 1 2 3 4 5 6 7 8 9 10 ... 
# $ Survived : int 0 1 1 1 0 0 0 0 1 1 ... 
# $ Pclass  : int 3 1 3 1 3 3 1 3 3 2 ... 
# $ Name  : Factor w/ 891 levels "Abbing, Mr. Anthony",..: 109 191 358 277 16 559 520 629 417 581 ... 
# $ Sex  : Factor w/ 2 levels "female","male": 2 1 1 1 2 2 2 2 1 1 ... 
# $ Age  : num 22 38 26 35 35 NA 54 2 27 14 ... 
# $ SibSp  : int 1 1 0 1 0 0 0 3 0 1 ... 
# $ Parch  : int 0 0 0 0 0 0 0 1 2 0 ... 
# $ Ticket  : Factor w/ 681 levels "110152","110413",..: 524 597 670 50 473 276 86 396 345 133 ... 
# $ Fare  : num 7.25 71.28 7.92 53.1 8.05 ... 
# $ Cabin  : Factor w/ 148 levels "","A10","A14",..: 1 83 1 57 1 1 131 1 1 1 ... 
# $ Embarked : Factor w/ 4 levels "","C","Q","S": 4 2 4 4 4 3 4 4 4 2 ... 
summary(d) 

Một số các biến có quá nhiều giá trị có ích (ít nhất là trong mô hình đầu tiên của bạn): bạn có thể xóa tên, vé, cabin và hành khách. Bạn cũng có thể muốn chuyển đổi một số biến số (nói, lớp), thành các thừa số, nếu nó có ý nghĩa hơn.

Kể từ neuralnet chỉ giao dịch với các biến định lượng, bạn có thể chuyển đổi tất cả các biến định tính (yếu tố) để nhị phân ("giả") biến, với các chức năng model.matrix - nó là một trong những tình huống rất hiếm trong R không thực hiện chuyển đổi cho bạn.

m <- model.matrix( 
    ~ Survived + Pclass + Sex + Age + SibSp + Parch + Fare + Embarked, 
    data = d 
) 
head(m) 
library(neuralnet) 
r <- neuralnet( 
    Survived ~ Pclass + Sexmale + Age + SibSp + Parch + Fare + EmbarkedC + EmbarkedQ + EmbarkedS, 
    data=m, hidden=10, threshold=0.01 
) 
+1

Cảm ơn bạn!Đây chính xác là kiểu phản hồi mà tôi đã hy vọng. Cảm ơn bạn đã dành thời gian trả lời chi tiết như vậy. – user2548029

+0

Cảm ơn bạn vì điều này! Tôi có một câu hỏi @VincentZoonekynd, là có một quy tắc nhất định cho những biến nào được áp dụng cho chuyển đổi 'model.matrix'? –

+1

@llorgge: tất cả các biến định tính, tức là, các loại của 'yếu tố' (hoặc' ký tự'), sẽ được chuyển thành các biến giả. Nhưng vì các biến số được giữ lại, không được biến đổi, bạn thực sự có thể đặt tất cả các biến. –

6

Thông báo lỗi "yêu cầu các tham số ma trận/số nguyên phức tạp" xảy ra khi bạn có các biến yếu tố hoặc ký tự trong dữ liệu của mình.

Có ba cách để giải quyết vấn đề này:

  1. Xóa biến
  2. Nếu biến là một yếu tố ra lệnh, sử dụng số nguyên thay thế.
  3. Nếu biến là ký tự, hãy biến đổi thành yếu tố và sau đó biến thành biến giả.

Bạn có thể sử dụng model.matrix() đã đề cập ở trên hoặc hàm class.ind() từ gói nnet để chuyển hệ số vào biến giả.

+0

Đó là điều ngạc nhiên của tôi vì SPSS cần bạn đặt các biến yếu tố riêng biệt trong hộp được chỉ định. – Espanta

Các vấn đề liên quan