Sử dụng lại mô hình để dự đoán cho các quan sát mới
Nếu mô hình không tốn kém về mặt tính toán, tôi có xu hướng ghi lại toàn bộ quá trình xây dựng mô hình trong một tập lệnh R để tôi chạy lại khi cần. Nếu một yếu tố ngẫu nhiên có liên quan đến việc điều chỉnh mô hình, tôi đảm bảo đặt một hạt ngẫu nhiên đã biết.
Nếu mô hình tốn kém về mặt tính toán, thì tôi vẫn sử dụng một tập lệnh như trên, nhưng tiết kiệm các đối tượng mô hình bằng đối tượng save()
into và rda. Sau đó, tôi có xu hướng sửa đổi tập lệnh sao cho nếu đối tượng đã lưu tồn tại, hãy tải nó hoặc nếu không, hãy chỉnh sửa lại mô hình, bằng cách sử dụng một if()...else
mệnh đề đơn giản bao quanh các phần liên quan của mã.
Khi tải đối tượng mô hình đã lưu của bạn, hãy nhớ tải lại bất kỳ gói nào được yêu cầu, mặc dù trong trường hợp của bạn nếu mô hình logit phù hợp thông qua glm()
sẽ không có bất kỳ gói bổ sung nào để tải ngoài R.
Đây là một ví dụ:
> set.seed(345)
> df <- data.frame(x = rnorm(20))
> df <- transform(df, y = 5 + (2.3 * x) + rnorm(20))
>
> m1 <- lm(y ~ x, data = df)
>
> save(m1, file = "my_model1.rda")
>
>
> newdf <- data.frame(x = rnorm(20))
>
> load("my_model1.rda")
>
> predict(m1, newdata = newdf)
1 2 3 4 5 6
6.1370366 6.5631503 2.9808845 5.2464261 4.6651015 3.4475255
7 8 9 10 11 12
6.7961764 5.3592901 3.3691800 9.2506653 4.7562096 3.9067537
13 14 15 16 17 18
2.0423691 2.4764664 3.7308918 6.9999064 2.0081902 0.3256407
19 20
5.4247548 2.6906722
Nếu muốn tự động hóa việc này, thì tôi có thể làm như sau trong một tập lệnh:
df <- data.frame(x = rnorm(20))
df <- transform(df, y = 5 + (2.3 * x) + rnorm(20))
if(file.exists("my_model1.rda")) {
load("my_model1.rda")
} else {
m1 <- lm(y ~ x, data = df)
}
newdf <- data.frame(x = rnorm(20))
predict(m1, newdata = newdf)
Tất nhiên, mã tạo dữ liệu sẽ được thay thế bằng mã tải dữ liệu thực tế của bạn.
Cập nhật mô hình được trang bị trước đó với các quan sát mới
Nếu bạn muốn trang bị lại mô hình bằng cách sử dụng các quan sát mới bổ sung. Sau đó update()
là một chức năng hữu ích. Tất cả những gì nó làm là trang bị lại mô hình với một hoặc nhiều đối số mô hình được cập nhật. Nếu bạn muốn bao gồm các quan sát mới trong dữ liệu được sử dụng để phù hợp với mô hình, hãy thêm các quan sát mới vào khung dữ liệu được chuyển đến đối số 'data'
, rồi thực hiện như sau:
m2 <- update(m1, . ~ ., data = df)
nơi m1
được bản gốc, lưu mô hình phù hợp, . ~ .
là thay đổi mô hình công thức, mà trong trường hợp này có nghĩa là bao gồm tất cả các biến đang tồn tại trên cả hai bên tay trái và bên phải của ~
(nói cách khác, làm cho không có thay đổi công thức mô hình), và df
là khung dữ liệu được sử dụng để phù hợp với mô hình ban đầu, được mở rộng để bao gồm các quan sát mới có sẵn.
Đây là một ví dụ hoạt động:
> set.seed(123)
> df <- data.frame(x = rnorm(20))
> df <- transform(df, y = 5 + (2.3 * x) + rnorm(20))
>
> m1 <- lm(y ~ x, data = df)
> m1
Call:
lm(formula = y ~ x, data = df)
Coefficients:
(Intercept) x
4.960 2.222
>
>
> newdf <- data.frame(x = rnorm(20))
> newdf <- transform(newdf, y = 5 + (2.3 * x) + rnorm(20))
>
> df <- rbind(df, newdf)
>
>
> m2 <- update(m1, . ~ ., data = df)
> m2
Call:
lm(formula = y ~ x, data = df)
Coefficients:
(Intercept) x
4.928 2.187
Những người khác đã được đề cập trong các bình luận formula()
, trong đó trích xuất công thức từ một mô hình được trang bị:
> formula(m1)
y ~ x
>
>
> m3 <- lm(formula(m1), data = df)
Tuy nhiên, nếu khớp mô hình liên quan đến các đối số bổ sung, như 'family'
hoặc 'subset'
đối số trong các hàm khớp mô hình phức tạp hơn. Nếu update()
các phương pháp có sẵn cho chức năng điều chỉnh mô hình của bạn (chúng dành cho nhiều chức năng điều chỉnh phổ biến, chẳng hạn như glm()
), thì nó cung cấp một cách đơn giản hơn để cập nhật mô hình phù hợp hơn là trích xuất và sử dụng lại công thức mô hình.
Nếu bạn có ý định thực hiện tất cả các mô hình hóa và dự đoán tương lai trong R, có vẻ như không có nhiều điểm trong việc trừu tượng hóa mô hình thông qua PMML hoặc tương tự.
data
lập luận ... giả định rằng tôi hiểu bạn một cách chính xác ...