在具有数字和分类变量的数据集中使用R进行分类

时间:2013-05-24 05:59:36

标签: r machine-learning classification feature-selection

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

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

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

我的问题:

我正在使用R。

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

有人知道算法还是可以想到在R上做这种方式?

2 个答案:

答案 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