2016-01-14 3 views
4

Я применяю случайный алгоритм леса в трех различных языках программирования в то же псевдо выборки набора данных (1000 набл, двоичном 1/0 зависимой переменной, 10 числовые объясняющие переменные):Random Forest Расхождение между R и Matlab & Python

  1. Matlab 2015a (то же самое для 2012a), используя команду"Treebagger" (часть статистики и машинного обучения Toolbox)
  2. R с помощью "RandomForest" пакет : https://cran.r-project.org/web/packages/randomForest/index.html
  3. Python с использованием "RandomForestClassifier" из sklearn.ensemble: http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html

Я также стараюсь, чтобы сохранить все параметры модели идентичны по языкам программирования (нет. деревьев, бутстрап-выборка всего образца, №. переменных, случайным образом отобранных в качестве кандидатов при каждом расколе, критерий для измерения качества раскола).

Хотя Matlab и Python производят в основном те же результаты (то есть probabilties), результаты R очень разные.

Какова возможная причина различия между результатами, полученными R с одной стороны, и Matlab & Python - с другой?

Я предполагаю, что есть некоторый параметр модели по умолчанию, который отличается от R, который я не знаю или который жестко закодирован в базовом пакете randomForest.

Точный код я побежал выглядит следующим образом:

Matlab:

b = TreeBagger(1000,X,Y, 'FBoot',1, 'NVarToSample',4, 'MinLeaf',1, 'Method', 'classification','Splitcriterion', 'gdi') 
[~,scores,~] = predict(b,X); 

Python:

clf = RandomForestClassifier(n_estimators=1000, max_features=4, bootstrap=True) 
scores_fit = clf.fit(X, Y) 
scores = pd.DataFrame(clf.predict_proba(X)) 

R:

results.rf <- randomForest(X,Y, ntree=1000, type = "classification", sampsize = length(Y),replace=TRUE,mtry=4) 
scores <- predict(results.rf, type="prob", 
    norm.votes=FALSE, predict.all=FALSE, proximity=FALSE, nodes=FALSE) 

ответ

4

Когда вы звоните predict на объект randomForest в R без предоставления набора данных, он возвращает прогнозы вне пакета. В ваших других методах вы снова передаете данные обучения. Я подозреваю, что если вы делаете это в R-версии, ваши вероятности будут похожи:

scores <- predict(results.rf, X, type="prob", 
    norm.votes=FALSE, predict.all=FALSE, proximity=FALSE, nodes=FALSE) 

Также обратите внимание, что если вы хотите беспристрастные probabilites, то R подход возвращения прогнозов OOB является лучшим подходом при прогнозировании на обучение данные.

+0

Большое спасибо, я внедрил ваше предложенное решение, и результаты значительно улучшились. – Markkk

+0

Чтобы быть точным: все три пакета программного обеспечения дают в основном одинаковые результаты. Во всяком случае, у меня есть быстрый вопрос: может ли кто-нибудь объяснить огромную разницу в времени вычислений между R & Python, с одной стороны, где результаты получены мгновенно, а Matlab, с другой стороны, где оценка модели и предсказание занимают несколько секунд каждая? – Markkk

+0

Реализация R написана на языке Fortran. Вероятно, версия scikit - Cython. Я подозреваю, что версия Matlab - это чистый Matlab? – Zelazny7

Смежные вопросы