我第一次使用随机森林进行处理,我遇到了一些我无法弄清楚的问题.当我对所有数据集(大约3000行)进行分析时,我没有收到任何错误消息.但是当我对我的数据集的子集(大约300行)执行相同的分析时,我收到一个错误:
dataset <- read.csv("datasetNA.csv", sep=";", header=T)
names (dataset)
dataset2 <- dataset[complete.cases(dataset$response),]
library(randomForest)
dataset2 <- na.roughfix(dataset2)
data.rforest <- randomForest(dataset2$response ~ dataset2$predictorA + dataset2$predictorB+ dataset2$predictorC + dataset2$predictorD + dataset2$predictorE + dataset2$predictorF + dataset2$predictorG + dataset2$predictorH + dataset2$predictorI, data=dataset2, ntree=100, keep.forest=FALSE, importance=TRUE)
# subset of my original dataset:
groupA<-dataset2[dataset2$order=="groupA",]
data.rforest <- randomForest(groupA$response ~ groupA$predictorA + groupA$predictorB+ groupA$predictorC + groupA$predictorD + groupA$predictorE + groupA$predictorF + groupA$predictorG + groupA$predictorH + groupA$predictorI, data=groupA, ntree=100, keep.forest=FALSE, importance=TRUE)
Error in randomForest.default(m, y, ...) : Can't have empty classes …Run Code Online (Sandbox Code Playgroud) 我正在努力使用Scikit学习Python中的随机森林.我的问题是我用它进行文本分类(3个类 - 正/负/中性),我提取的特征主要是单词/ unigrams,所以我需要将它们转换为数字特征.我找到了一种方法做它DictVectorizer的fit_transform:
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import classification_report
from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer(sparse=False)
rf = RandomForestClassifier(n_estimators = 100)
trainFeatures1 = vec.fit_transform(trainFeatures)
# Fit the training data to the training output and create the decision trees
rf = rf.fit(trainFeatures1.toarray(), LabelEncoder().fit_transform(trainLabels))
testFeatures1 = vec.fit_transform(testFeatures)
# Take the same decision trees and run on the test data
Output = rf.score(testFeatures1.toarray(), LabelEncoder().fit_transform(testLabels))
print "accuracy: " + str(Output)
Run Code Online (Sandbox Code Playgroud)
我的问题是该fit_transform方法正在处理火车数据集,其中包含大约8000个实例,但是当我尝试将我的测试集转换为数字特征时,也就是大约80000个实例,我得到一个内存错误,说:
testFeatures1 = vec.fit_transform(testFeatures)
File …Run Code Online (Sandbox Code Playgroud) classification machine-learning random-forest scikit-learn text-classification
R 3.0.0的一个新特性是引入了长向量.但是,.C()和.Fortran()不接受长矢量输入.在R-bloggers上我发现:
这是一种预防措施,因为现有代码不太可能被编写来处理长向量(并且R包装器通常假设长度(x)是整数)
我使用R-package randomForest,这个包显然需要.Fortran(),因为它崩溃了,留下了错误信息
randomForest.default出错:.Fortran不支持long向量(参数20)
如何克服这个问题?我在Windows 7 64位计算机上使用randomForest 4.6-7(在R 3.0.2下构建).
当运行Spark的RandomForest算法时,即使使用相同的种子,我似乎在不同的运行中在树中获得不同的分割.任何人都可以解释我是否做错了(可能),或者实施是错误的(我认为不太可能)?这是我的运行方案:
//read data into rdd
//convert string rdd to LabeledPoint rdd
// train_LP_RDD is RDD of LabeledPoint
// call random forest
val seed = 123417
val numTrees = 10
val numClasses = 2
val categoricalFeaturesInfo: Map[Int, Int] = Map()
val featureSubsetStrategy = "auto"
val impurity = "gini"
val maxDepth = 8
val maxBins = 10
val rfmodel = RandomForest.trainClassifier(train_LP_RDD, numClasses, categoricalFeaturesInfo,
numTrees, featureSubsetStrategy, impurity, maxDepth, maxBins,seed)
println(rfmodel.toDebugString)
Run Code Online (Sandbox Code Playgroud)
在两个不同的运行中,此代码段的输出是不同的.例如,两个结果的差异显示如下:
sdiff -bBWs run1.debug run2.debug
If (feature 2 <= 15.96) | If (feature …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用随机森林在Python中执行聚类.在随机森林的R实现中,您可以设置一个标记来获取邻近矩阵.我似乎无法在随机森林的python scikit版本中找到类似的东西.有谁知道python版本是否有相同的计算?
我是scikit-learn和随机森林回归的新手,并且想知道除了组合预测之外,是否有一种简单的方法可以从随机森林中的每棵树中获得预测.我想在列表中输出所有预测而不是查看整个树.我知道我可以使用apply方法获取叶子索引,但我不知道如何使用它来从叶子中获取值.任何帮助表示赞赏.
编辑:以下是我迄今为止的评论.之前我不清楚是否可以调用estimators_属性中的树,但似乎可以使用该属性在每个树上使用预测方法.这是最好的方法吗?
numberTrees = 100
clf = RandomForestRegressor(n_estimators=numberTrees)
clf.fit(X,Y)
for tree in range(numberTrees):
print(clf.estimators_[tree].predict(val.irow(1)))
Run Code Online (Sandbox Code Playgroud) 我在一个包含8个数字列(预测变量)和1个因子(结果)的数据集上运行随机林.数据集中有1.2M行.当我做:
randomForest(outcome.f ~ a + b + c + d + e + f + g + h,data=mdata)),我收到一个错误:
"Error in randomForest.default(m, y, ...) :
long vectors (argument 26) are not supported in .Fortran"
Run Code Online (Sandbox Code Playgroud)
有什么方法可以防止这种情况吗?我不明白为什么包(显然)试图分配长度为2 ^ 31-1的向量.我使用的是Mac OS X 10.9.2,带有Intel Core i7(如果架构很重要).
会话信息
R version 3.1.0 (2014-04-10)
Platform: x86_64-apple-darwin13.1.0 (64-bit)
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] randomForest_4.6-7
loaded via a namespace (and not attached):
[1] tools_3.1.0
Run Code Online (Sandbox Code Playgroud) 据我所知,random_state在各种sklearn算法中使用它来打破具有相同度量值的不同预测变量(树)之间的联系(例如在中GradientBoosting).但是文档没有澄清或详细说明.喜欢
1)这些种子用于随机数生成的其他地方?比如说RandomForestClassifier,随机数可用于查找一组随机特征来构建预测器.使用子采样的算法可以使用随机数来获得不同的子样本.可以/是同一种子(random_state)在多个随机数生成中扮演一个角色吗?
我主要关心的是
2)这个random_state变量的影响有多远.?这个值能否在预测(分类或回归)方面产生很大的不同.如果是,我应该关注哪种数据集?或者更多的是关于稳定性而不是结果的质量?
3)如果它可以产生很大的不同,如何最好地选择random_state?没有直觉,很难做GridSearch.特别是如果数据集是这样的,一个CV可能需要一个小时.
4)如果动机只是在重复运行中只有稳定的结果/评估我的模型和交叉验证分数,如果我random.seed(X)在使用任何算法之前设置(并使用random_state无),它是否具有相同的效果.
5)假设我random_state在GradientBoosted分类器上使用了一个值,并且我正在交叉验证以找到我的模型的优点(每次都在验证集上得分).一旦满意,我将在整个训练集上训练我的模型,然后将其应用于测试集.现在,完整的训练集比交叉验证中的较小训练集具有更多的实例.因此,random_state与cv循环中发生的情况相比,该值现在可以导致完全不同的行为(特征和个体预测变量的选择).类似于像样本叶子等的事情也可能导致较差的模型,因为设置是CV中的实例数,而实际的实例数更多.这是正确的理解吗?防范这种情况的方法是什么?
我用caret+ 训练了一个随机森林ranger.
fit <- train(
y ~ x1 + x2
,data = total_set
,method = "ranger"
,trControl = trainControl(method="cv", number = 5, allowParallel = TRUE, verbose = TRUE)
,tuneGrid = expand.grid(mtry = c(4,5,6))
,importance = 'impurity'
)
Run Code Online (Sandbox Code Playgroud)
现在我想看看变量的重要性.但是,这些都不起作用:
> importance(fit)
Error in UseMethod("importance") : no applicable method for 'importance' applied to an object of class "c('train', 'train.formula')"
> fit$variable.importance
NULL
> fit$importance
NULL
> fit
Random Forest
217380 samples
32 predictors
No pre-processing
Resampling: Cross-Validated (5 …Run Code Online (Sandbox Code Playgroud) 我有以下代码,它基本上尝试使用randomForest预测Species来自iris数据.我真正想要的是找到解释物种分类的最佳特征(变量).我发现包randomForestExplainer是最好的服务目的.
library(randomForest)
library(randomForestExplainer)
forest <- randomForest::randomForest(Species ~ ., data = iris, localImp = TRUE)
importance_frame <- randomForestExplainer::measure_importance(forest)
randomForestExplainer::plot_multi_way_importance(importance_frame, size_measure = "no_of_nodes")
Run Code Online (Sandbox Code Playgroud)
代码的结果产生了这个图:
根据情节,解释为什么Petal.Length和Petal.Width是最佳因素的关键因素是这些(解释基于小插图):
mean_min_depth - 以参数mean_sample指定的三种方式之一计算的平均最小深度,times_a_root - 使用Xj分割根节点的树的总数(即,基于Xj的值将整个样本分成两个),no_of_nodes - 使用Xj进行拆分的节点总数(如果树浅,通常等于no_of_trees),我不清楚为什么高times_a_root而且no_of_nodes更好?低价mean_min_depth更好?
有什么直观的解释?
该小品信息不能帮助.
random-forest ×10
r ×5
scikit-learn ×4
python ×2
apache-spark ×1
r-caret ×1
regression ×1
scala ×1
vector ×1