Hãy xem xét các nguồn lỗi cho các dự đoán phân loại của bạn, so với các nguồn dự đoán tuyến tính. Nếu bạn phân loại, bạn có hai nguồn lỗi:
- Lỗi từ phân loại vào thùng sai
- Lỗi từ chênh lệch giữa giá trị trung bình bin và giá trị đích ("vị trí vàng")
Nếu dữ liệu của bạn có độ ồn thấp, thì bạn thường sẽ phân loại vào đúng thùng. Nếu bạn cũng có nhiều thùng thì nguồn lỗi thứ hai sẽ thấp. Nếu ngược lại, bạn có dữ liệu nhiễu cao, thì bạn có thể phân loại sai vào thùng sai thường xuyên và điều này có thể chi phối lỗi tổng thể - ngay cả khi bạn có nhiều thùng nhỏ, do đó, nguồn lỗi thứ hai là nhỏ nếu bạn phân loại chính xác. Sau đó, một lần nữa, nếu bạn có ít thùng, thì bạn sẽ thường xuyên phân loại chính xác hơn, nhưng lỗi trong thùng của bạn sẽ lớn hơn.
Cuối cùng, nó có thể đi xuống một sự tương tác giữa tiếng ồn và kích thước thùng.
Dưới đây là một ví dụ đồ chơi nhỏ, mà tôi đã chạy trong 200 mô phỏng. Một mối quan hệ tuyến tính đơn giản với tiếng ồn và chỉ có hai thùng:
Bây giờ, hãy chạy cái này với độ ồn thấp hoặc cao. (Tập huấn luyện ở trên có độ ồn cao.) Trong mỗi trường hợp, chúng tôi ghi lại các MSE từ mô hình tuyến tính và từ mô hình phân loại:
nn.sample <- 100
stdev <- 1
nn.runs <- 200
results <- matrix(NA,nrow=nn.runs,ncol=2,dimnames=list(NULL,c("MSE.OLS","MSE.Classification")))
for ( ii in 1:nn.runs ) {
set.seed(ii)
xx.train <- runif(nn.sample,-1,1)
yy.train <- xx.train+rnorm(nn.sample,0,stdev)
discrete.train <- yy.train>0
bin.medians <- structure(by(yy.train,discrete.train,median),.Names=c("FALSE","TRUE"))
# plot(xx.train,yy.train,pch=19,col=discrete.train+1,main="Training")
model.ols <- lm(yy.train~xx.train)
model.log <- glm(discrete.train~xx.train,"binomial")
xx.test <- runif(nn.sample,-1,1)
yy.test <- xx.test+rnorm(nn.sample,0,0.1)
results[ii,1] <- mean((yy.test-predict(model.ols,newdata=data.frame(xx.test)))^2)
results[ii,2] <- mean((yy.test-bin.medians[as.character(predict(model.log,newdata=data.frame(xx.test))>0)])^2)
}
plot(results,xlim=range(results),ylim=range(results),main=paste("Standard Deviation of Noise:",stdev))
abline(a=0,b=1)
colMeans(results)
t.test(x=results[,1],y=results[,2],paired=TRUE)
Như chúng ta thấy, việc phân loại có cải thiện độ chính xác đến mức độ nhiễu trong ví dụ này hay không.
Bạn có thể chơi xung quanh một chút với dữ liệu mô phỏng hoặc với các kích cỡ thùng khác nhau.
Cuối cùng, lưu ý rằng nếu bạn đang thử các kích cỡ thùng khác nhau và giữ cho các kích thước hoạt động tốt nhất, bạn không nên ngạc nhiên rằng điều này hoạt động tốt hơn mô hình tuyến tính. Rốt cuộc, về cơ bản, bạn đang thêm nhiều mức độ tự do hơn và nếu bạn không cẩn thận (xác thực chéo!), Bạn sẽ kết thúc việc vượt quá các thùng.