0

我正在处理一个非常大的数据集。(csv)

数据集由数值列和分类列组成。

其中一列是我的“目标列”,这意味着我想使用其他列来确定哪个值(在 3 个可能的已知值中)可能在“目标列”中。最后检查我的分类与真实数据。

我的问题:

我正在使用 R。

我正在尝试找到一种方法来选择能够提供最佳分类的特征子集。遍历所有子集是不可能的。

有谁知道算法或可以想办法在 R 上做到这一点?

4

2 回答 2

2

这似乎是一个分类问题。在不知道目标的协变量数量的情况下,无法确定,但神经网络不会解决您的问题吗?

您可以使用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 种类型的值。当列具有字符串而不是数值时,这是默认情况下由数据框完成的。

现在,使用列ab我们想要预测c将是哪个值。使用神经网络。对于这个例子,nnet 包很简单。如果您没有安装它,请使用:

install.packages("nnet")

然后,加载它:

require(nnet)

在此之后,让我们用数据样本训练神经网络,为此,函数

部分<-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 来预测列cdata=表示数据来源,在这种情况下,数据框 df 可以 subset=自我解释 size=隐藏层的大小,正如我所说,大约使用总列的 2/3(a+ b) + 总产出(1)

我们现在已经训练了网络,让我们使用它。

使用predict您将使用经过训练的网络来获取新值。

newPredictedValues<-predict(myNet,newdata=df[-portion,])

之后, newPredictedValues 将有预测。

于 2013-05-24T07:06:45.303 回答
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
于 2017-08-25T14:47:24.480 回答