我正在开发一个非常大的数据集。(csv)
数据集由数字和分类列组成。
其中一列是我的“目标列”,这意味着我想使用其他列来确定哪个值(3个可能的已知值中的哪个)可能位于“目标列”中。最后检查我的分类与真实数据。
我的问题:
我正在使用R。
我试图找到一种方法来选择能够提供最佳分类的特征子集。 遍历所有子集是不可能的。
有人知道算法还是可以想到在R上做这种方式?
答案 0 :(得分:1)
这似乎是一个分类问题。如果不知道你的目标的协变量,不能确定,但神经网络不能解决你的问题吗?
您可以使用 nnet软件包,它使用前馈神经网络并使用多个类。由于您可以只使用因子,因此使用分类列不是问题。
没有数据样本我只能解释一下,但主要是使用函数:
newNet<-nnet(targetColumn~ . ,data=yourDataset, subset=yourDataSubset [..and more values]..)
你获得了训练有素的神经网络。这里最重要的是隐藏层的大小,这是一个棘手的事情。根据经验,它应该大约是输入量的2/3 +输出量(在你的情况下为3)。
然后用:
myPrediction <- predict(newNet, newdata=yourDataset(with the other subset))
您获得预测值。关于如何评估它们,我使用ROCR包但目前只支持二进制分类,我想谷歌搜索会显示一些帮助。
如果你坚持要消除一些协变量,使用cor()函数可以帮助你识别那些较不特征的协变量。
编辑分步指南:
让我们说我们有这个数据框:
str(df)
'data.frame': 5 obs. of 3 variables:
$ a: num 1 2 3 4 5
$ b: num 1 1.5 2 2.5 3
$ c: Factor w/ 3 levels "blue","red","yellow": 2 2 1 2 3
列 c 有3个级别,即可以采用的3种类型的值。当列具有字符串而不是数值时,默认情况下由数据框完成。
现在,使用列 a 和 b ,我们想要预测 c 将是哪个值。使用神经网络。对于这个例子,nnet包很简单。如果您没有安装它,请使用:
install.packages("nnet")
然后,加载它:
require(nnet)
之后,让我们用一个数据样本训练神经网络,为此,函数
部&LT; -sample(1:nrow(DF),0.7 * nrow(DF))
将存储数据帧中70%的行的部分。现在,让我们训练那个网!我建议您查看带有?nnet
的nnet软件包的文档,以获得更深入的了解。仅使用基础知识:
myNet<-nnet( c~ a+b,data=df,subset=portion,size=1)
c~ a+b
是预测的公式。您希望使用列a和b预测列 c
data=
表示数据源,在本例中是数据帧df
subset=
自我解释
正如我所说,size=
隐藏层的大小占总列数的2/3(a + b)+总输出(1)
我们现在已经训练了网,让我们使用它。
使用predict
,您将使用经过培训的网络获取新值。
newPredictedValues<-predict(myNet,newdata=df[-portion,])
之后,newPredictedValues将有预测。
答案 1 :(得分:0)
由于您同时拥有数字和分类数据,因此您可以尝试使用SVM。
我在我的数字数据上使用SVM和KNN,我也尝试应用DNN。 DNN训练特别是R中的大数据非常慢.KNN不需要训练,但用于数值数据。以下是我正在使用的内容。也许你可以看看它。
#Train the model
y_train<-data[,1] #first col is response variable
x_train<-subset(data,select=-1)
train_df<-data.frame(x=x_train,y=y_train)
svm_model<-svm(y~.,data=train_df,type="C")
#Test
y_test<-testdata[,1]
x_test<-subset(testdata,select=-1)
pred<-predict(svm_model,newdata = x_test)
svm_t<-table(pred,y_test)
sum(diag(svm_t))/sum(svm_t) #accuracy