randomForest использует R для регрессии, имеет смысл?

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

введите здесь описание изображения

И мой код тоже прилагается.

library(randomForest)
require(data.table)
data = fread("C:/stockcrazy.csv")
PEratio <- data$offeringPE/data$industryPE
data_update <- data.frame(data,PEratio)

train <- data_update[1:47,]
test <- data_update[48:57,]

Для приведенного выше набора данных для обучения и тестирования я не уверен, нужно ли мне выполнять перекрестную проверку этих данных. И я не знаю, как это сделать.

data.model <- randomForest(yield ~ offerings + offerprice + PEratio + count + bingo 
                           + purchase , data=train, importance=TRUE)

par(mfrow = c(1, 1))
varImpPlot(data.model, n.var = 6, main = "Random Forests: Top 6 Important Variables")
importance(data.model)
plot(data.model)


model.pred <- predict(data.model, newdata=test)
model.pred

d <- data.frame(test,model.pred)

Я не уверен, что результат IncMSE хорош или плох. Кто-нибудь может это интерпретировать?введите здесь описание изображения

Кроме того, я обнаружил, что предсказанные значения тестовых данных не являются хорошим предсказанием реальных данных. Итак, как я могу улучшить это?

введите здесь описание изображения


person Elif Y    schedule 10.11.2014    source источник


Ответы (1)


Давайте посмотрим. Начнем с %IncMSE:

Я нашел этот действительно хороший ответ на перекрестную проверку о %IncMSE который я цитирую:

если предиктор важен в вашей текущей модели, то назначение других значений для этого предиктора случайным образом, но «реалистично» (т. е. перестановка значений этого предиктора в вашем наборе данных) должно иметь негативное влияние на предсказание, то есть: использование той же модели для предсказания из данных, которые одинаковы, за исключением одной переменной, должны давать худшие прогнозы.

Итак, вы выполняете прогностическую меру (MSE) с исходным набором данных, а затем с «переставленным» набором данных и каким-то образом сравниваете их. С одной стороны, поскольку мы ожидаем, что первоначальная MSE всегда будет меньше, разница может быть учтена. Наконец, чтобы сделать значения сопоставимыми по переменным, они масштабируются.

Это означает, что в вашем случае наиболее важной переменной является покупка, т.е. когда переменная покупка была переставлена ​​(то есть порядок значений изменен случайным образом), результирующая модель была на 12% хуже, чем при наличии переменной в ее исходном порядке с точки зрения расчета среднего квадратная ошибка. MSE был на 12% выше при использовании переставленной переменной покупки, что означает, что эта переменная является наиболее важной. Важность переменной — это всего лишь мера того, насколько важными были ваши переменные-предикторы в используемой вами модели. В вашем случае покупка была самой важной, а коэффициент P/E был наименьшим (для этих 6 переменных). Это не то, что вы можете интерпретировать как хорошее или плохое, потому что оно не показывает, насколько хорошо модель соответствует невидимым данным. Надеюсь, теперь это ясно.

Для перекрестной проверки:

Вам не нужно выполнять перекрестную проверку на этапе обучения, поскольку это происходит автоматически. Приблизительно 2/3 записей используются для создания дерева, а оставшаяся 1/3 (данные вне пакета) используется для последующей оценки дерева (квадрат R для дерева вычисляется с использованием данные ооб)

Что касается улучшения модели:

Показывая только 10 первых строк прогнозируемого и фактического значений доходности, вы не можете принять безопасное решение о том, хороша модель или плоха. Что вам нужно, так это тест на физическую форму. Наиболее распространенным является R в квадрате. Это упрощенно, но для сравнения моделей и получения первого мнения о вашей модели это делает свою работу. Это рассчитывается моделью для каждого дерева, которое вы создаете, и к нему можно получить доступ с помощью data.model$rsq. Он варьируется от 0 до 1, где 1 соответствует идеальной модели, а 0 указывает на очень плохое соответствие (иногда оно может даже принимать отрицательные значения, что указывает на плохое соответствие). Если ваш rsq плохой, вы можете попробовать следующее, чтобы улучшить свою модель, хотя нет уверенности, что вы получите желаемые результаты:

  1. Калибруйте свои деревья по-другому. Измените количество выращенных деревьев и обрежьте деревья, указав большое число узлов. (здесь вы используете 500 деревьев по умолчанию и размер узла 5, что может превышать вашу модель.)
  2. Если возможно, увеличьте количество переменных.
  3. Выберите другую модель. Бывают случаи, когда случайный лес не работает.
person LyzandeR    schedule 11.11.2014
comment
спасибо за ваши комментарии и помощь. но я все еще смущен всем процессом. можете отправить мне письмо на мою электронную почту, чтобы мы могли обсудить это более подробно? - person Elif Y; 11.11.2014
comment
Вы упомянули rsq в своем посте, я видел много онлайн-учебников, использующих NMSE как для обучения, так и для тестирования данных. В чем разница между этими двумя? И здесь я не использовал 500 ntree, а размер узла для регрессии равен 5, а не 1. Я делаю регрессию вместо классификации. - person Elif Y; 11.11.2014
comment
NMSE и MSE — это одно и то же. Разница лишь в том, что NMSE нормализован. Нормализация происходит путем деления на произведение средних наблюдаемых значений и средних прогнозируемых значений. альтернативой является нормализация только по средним наблюдаемым значениям (ybar). Я знаю, что вы используете регрессионный rf, и поэтому я предлагаю использовать R в квадрате. В приведенном выше примере вы используете ntrees = 500, потому что это значение по умолчанию, и вы правы, размер узла равен 5. Я изменил это выше. - person LyzandeR; 11.11.2014
comment
Если вы не знакомы с некоторыми из вышеперечисленных, я бы предложил этот книга, которая дает вам отличное введение как в машинное обучение, так и в R. - person LyzandeR; 11.11.2014
comment
Я также добавлю ответ о перекрестной проверке. я пропустил эту часть - person LyzandeR; 11.11.2014
comment
Результатом data.model$rsq является матрица, в которой есть как отрицательное, так и положительное значение. - person Elif Y; 11.11.2014
comment
да. результат на самом деле является вектором, а не матрицей длины (data.model $ rsq) = ntree. так что в вашем случае это 500. k-й элемент вектора - это квадрат R, рассчитанный для k первых деревьев. Таким образом, последний элемент вектора показывает общий R в квадрате для случайного леса на основе записей oob обучающей выборки. Как правило, если этот последний элемент отрицателен или близок к нулю, ваша модель недостаточно хорошо соответствует данным. - person LyzandeR; 11.11.2014
comment
мой результат для данных поезда: Среднее значение квадратов остатков: 872,1524, % Вар объяснил: 16,5. Кажется, нехорошо, да? - person Elif Y; 12.11.2014
comment
Среднее квадратов невязок само по себе мало что говорит (хотя чем ближе к нулю, тем лучше модель). он используется для сравнения различных моделей. Если вы создадите новую модель с меньшей MSE, вы можете сказать, что это лучшая модель. Объяснение %Var само по себе является хорошей мерой соответствия модели. Насколько он хорош, никогда нельзя сказать наверняка. 16,5% - это не лучшее, что вы можете получить, но это определенно лучше, чем случайность, так что это что-то. Всегда есть предел тому, насколько хорошо вы можете предсказать, учитывая ваши предикторы. Если, например, этот предел составляет 20%, то у вас отличная модель. надеюсь, это поможет - person LyzandeR; 12.11.2014
comment
Меня сейчас смутило одно: какие данные я должен использовать для поиска rsq, поезда или полных данных? Я знаю, что должен использовать полные данные, чтобы увидеть важность переменной. - person Elif Y; 12.11.2014
comment
Ну, что я всегда делаю, что должно быть общей практикой, так это: использовать только набор поездов, чтобы получить rsq из вектора data.model$rsq, а затем также использовать набор тестов для оценки вашей модели на совершенно невидимых данных. т. е. используйте функцию прогнозирования, чтобы делать прогнозы для тестового набора, а затем вычисляйте rsq с помощью функции rsquared из пакета misctools, например здесь - person LyzandeR; 12.11.2014
comment
привет, у меня новый вопрос, так как самая важная переменная — переменная доходности, но она может быть динамической, что означает, что для некоторых акций это значение будет меняться. Итак, как я могу сделать это дело? - person Elif Y; 13.11.2014
comment
доходность не самая важная переменная. покупка — самая важная переменная. доходность — это то, что вы пытаетесь предсказать. Я действительно не понимаю вопроса. - person LyzandeR; 13.11.2014
comment
я имею в виду, что некоторые значения доходности, вероятно, со временем изменятся, должен ли я использовать эти наблюдения за доходностью? - person Elif Y; 13.11.2014
comment
наблюдение должно быть моментальным снимком времени. вам нужно выбрать доходность, которая соответствует всем другим переменным, которые у вас есть в определенное время. Если урожай изменится, вы также можете включить это, но как новое наблюдение с новым набором переменных. - person LyzandeR; 13.11.2014
comment
для одной акции может измениться самая высокая цена, поэтому изменится и доходность, но все остальные переменные останутся, например, PE, размещение акций. - person Elif Y; 13.11.2014
comment
Тогда это вопрос к финансовому эксперту. Это зависит от того, какие переменные нужно выбрать для модели и как они взаимодействуют между собой. Может быть, есть сайт финансового обмена, где вы могли бы спросить об этом. Я бы выбрал то, что у меня есть на данный момент, и не заботился бы об изменении цены в будущем. - person LyzandeR; 13.11.2014
comment
, привет, я перезапускаю данные. и мой результат: r2 ‹- rSquared(test$yield, test$yield - предсказание(data.model, newdata=test)), что равно -0,534802, это плохо, верно? - person Elif Y; 15.11.2014
comment
к сожалению, да, это плохо. - person LyzandeR; 15.11.2014