簡體   English   中英

在R中使用randomForest輸入類型不匹配錯誤

[英]Type Mismatch Error using randomForest in R

我正在嘗試在R中使用隨機森林對某些kaggle數據進行分類,但是每當嘗試使用已創建的模型時,我都會不斷收到以下錯誤消息。

Error in predict.randomForest(fit, newdata = test, type = "class") : 
  Type of predictors in new data do not match that of the training data

我完全不知道該錯誤的原因,而Google並沒有太大幫助。 任何幫助或見解將不勝感激。 下面給出了簡單的代碼段,它是對kaggle問題之一的響應。

fit = randomForest(as.factor(IsBadBuy) ~ VehicleAge + WheelTypeID + Transmission + WarrantyCost + VehOdo + Auction, 
                   data=training, importance=TRUE, do.trace=100, keep.forest=TRUE)

prediction = predict(fit, newdata=test, type='class')

t = table(observed=test[, 'IsBadBuy'], predict=prediction)

對於像我這樣的R新手來說,當他們說“錯誤消息的含義恰如其分:您的訓練數據中至少有一個變量的類型與測試數據中的等效變量不匹配”時,他們是對的。

請執行以下操作以確認沒有明顯不同:
str(training)str(NewData)

這將列出培訓和新數據的功能和類型。 像我以前一樣,您可能仍然感到困惑的原因是數據類型可能看起來匹配,但仍然出錯。 可能將兩個要素集/要素列都列為一個因素,但級別不同。 我的新數據要小得多,沒有培訓數據所具備的所有功能。 這會讓您大失所望。 解決方法是:在處理新數據並進行分解時,傳遞所有可能的水平。 這樣可以使您與之匹敵,並且一切正常。

dataframe$ColToFactor <- factor(dataframe$ColToFactor, levels=c("PossibleLvl1", "PossibleLvl2", "PossibleLvl3", account for all possible))

那對我來說很重要。

看一下此頁面,可能會有所幫助:

http://gettinggeneticsdone.blogspot.be/2011/02/split-data-frame-into-testing-and.html

它說明了如何使用優雅的功能將數據幀分為R中的測試集和訓練集,以及如何在隨機森林中使用它。

此錯誤主要是由於分類預測器造成的,假設分類的特定類別的預測器在訓練模型時在訓練集中發生,而在預測發生此錯誤時在測試集中沒有發生

(例如)考慮一個分類預測變量,稱為“薪水水平”,低,中,高三個級別所有這些類在訓練集中至少發生一次,但在測試集中,一個類別說“中等”根本不出現,變量“ salary_level”被預測函數視為在測試中具有兩個類別的新變量或不同變量。 因此錯誤數據不匹配。

您可以通過使用函數table(data_name $ variable_name)或table(data_name [,columnposition])分析類別變量的類來克服此問題

這是一個舊帖子,但是我看到幾個月的活動了。 我自己遇到了這個問題,但是在網絡上找不到解決方案。 我用一個粗略的解決方案解決了我的問題。

其他答案中說明了出現此類錯誤的原因。 簡而言之,如果訓練和測試數據集中的變量的因子水平數不相等,那么您將得到這樣的錯誤。 盡管如果您在訓練數據中具有所有級別,但在測試數據中卻沒有所有級別,則您會遇到此類問題(至少我知道)。

如果您有一個數據集,並且想要將其拆分以進行訓練和測試,則最好將其拆分,以便在訓練和測試數據集中很好地表示所有級別。 但是,如果您要創建適用於看不見的數據的預測變量,則最好找到解決方案。

例如,如果在“ b”列中有一個包含3個級別的數據框。

a<-c(1,2,3,1,3,2,4,5)
b<-as.factor(c(1,2,3,2,3,1,1,2))
d<-c(3,2,5,2,4,2,4,4)
dat<-cbind(a,b,d)

並且如果您在“ b”列中只有兩個級別的測試數據。

a<-c(1,2,2,1,3)
b<-as.factor(c(1,2,1,1,2))
d<-c(3,2,5,2,4)
testData<-cbind(a,b,d)

然后,您得到錯誤。 在我的骯臟解決方案中,我在測試數據中添加了三行包含因子水平的行,然后在添加因子水平后將其刪除。

testData[,2]<-as.character(testData[,2]) # First changing the factor to character
addition<-testDat[1:3,] ## this will be added to testData
addition[,2]<-c(1,2,3)  ## Changing the content to get the known factor levels
testData<-rbind(addition,testData) ## add the new rows to the testData
testData[,2]<-as.factor(testData) ## And now converting back to factor

## And finally removing the added rows
testData<-testData[4:nrow(testData),]

我的腳本不是整齊的,修復也不是整齊的。 但是,我每次都執行一次此步驟,以便稍后再返回時可以理解。 可能有人可以用幾行代碼編寫相同的代碼。

暫無
暫無

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

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