簡體   English   中英

在具有數值和分類變量的數據集中使用 R 進行分類

[英]Classification using R in a data set with numeric and categorical variables

我正在處理一個非常大的數據集。(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 種類型的值。 當列具有字符串而不是數值時,這是默認情況下由數據框完成的操作。

現在,使用列ab我們想預測c 將是哪個值。 使用神經網絡。 nnet 包對於這個例子來說已經足夠簡單了。 如果您沒有安裝它,請使用:

install.packages("nnet")

然后,加載它:

require(nnet)

在此之后,讓我們用數據樣本訓練神經網絡,為此,函數

部分<-樣本(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= self explanatory 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM