我正在运行一个基本的语言分类任务。有两个类(0/1),它们大致均匀平衡(689/776)。到目前为止,我只创建了基本的一元语言模型并将它们用作特征。文档术语矩阵,在任何减少之前有 125k 术语。我已将其减少到约 1250 个术语,这些术语出现在所有文档的 20% 以上。
对这个数据集的训练给了我迄今为止表现最好的模型:
library(e1071)
index <- 1:nrow(df.dtm)
testindex <- sample(index, trunc(length(index)/3))
testset <- df.dtm[testindex,]
trainset <- df.dtm[-testindex,]
wts <- 100/table(trainset$labs)
tune.out=tune(svm, labs~., data=trainset, class.weights=wts,
ranges=list(cost=c(0.001, 0.01, 0.1, 1, 5, 10, 100),
gamma=c(0.005,.015, 0.01,0.02,0.03,0.04,0.05)))
bestmod <- tune.out$best.model
ypred<-predict(bestmod, testset)
table(predicted=ypred, truth=testset$labs)
truth
predicted 0 1
0 36 29
1 200 223
如您所见,性能并不好。但至少它在 0 类中预测了一些!到目前为止,在我运行的大多数模型中,性能看起来都比这差很多。例如,完全相同的设置,但使用 tf-idf 而不是词频:
truth
predicted 0 1
0 1 0
1 236 251
这在我运行的模型中更为典型。此外,我使用 scikitlearn 在 python 中得到了相同的结果。
我认为某些特征可能有些可疑,所以我决定尝试随机抽取特征子集并为这些特征拟合模型。当我选择 10% 并运行相同的模型时,会发生以下情况:
truth
predicted 0 1
0 116 123
1 106 143
好吧,性能不是很好,但至少我在 0 类中得到了一些预测。当我包含所有特征时,为什么预测会如此强烈地偏向上述一类?
这是由于功能选择不佳(/实际上没有)导致的预期行为吗?我本以为在那种情况下分类看起来更像是抛硬币,而不是选择一个类的权重……