我正在处理一个非常大的数据集。(csv)
数据集由数值列和分类列组成。
其中一列是我的“目标列”,这意味着我想使用其他列来确定哪个值(在 3 个可能的已知值中)可能在“目标列”中。最后检查我的分类与真实数据。
我的问题:
我正在使用 R。
我正在尝试找到一种方法来选择能够提供最佳分类的特征子集。遍历所有子集是不可能的。
有谁知道算法或可以想办法在 R 上做到这一点?
我正在处理一个非常大的数据集。(csv)
数据集由数值列和分类列组成。
其中一列是我的“目标列”,这意味着我想使用其他列来确定哪个值(在 3 个可能的已知值中)可能在“目标列”中。最后检查我的分类与真实数据。
我的问题:
我正在使用 R。
我正在尝试找到一种方法来选择能够提供最佳分类的特征子集。遍历所有子集是不可能的。
有谁知道算法或可以想办法在 R 上做到这一点?
这似乎是一个分类问题。在不知道目标的协变量数量的情况下,无法确定,但神经网络不会解决您的问题吗?
您可以使用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)
在此之后,让我们用数据样本训练神经网络,为此,函数
部分<-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 将有预测。
既然你有数字和分类数据,那么你可以试试 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