сохранить модель от блестящей для более быстрой скорости [дублировать]

В то время как , что вызывает NullReferenceExceptions и подходит к avoid / fix , такое исключение было рассмотрено в других ответах, что многие программисты не имеют " t узнал еще, как независимо отлаживать такие исключения во время разработки.

В Visual Studio это обычно легко благодаря Visual Studio Debugger .


Во-первых, убедитесь, что правильная ошибка будет обнаружена - см. . Как разрешить нарушение «Исключение System.NullReferenceException» в VS2010? Примечание1

Затем либо Начать с отладки (F5) , либо Приложить [отладчик VS] к запуску процесса . Иногда может быть полезно использовать Debugger.Break , в котором будет предложено запустить отладчик.

Теперь, когда NullReferenceException выбрано (или необработанно), отладчик остановится ( помните правило, указанное выше?) в строке, на которой произошло исключение. Иногда ошибка может быть легко обнаружена.

Например, в следующей строке единственный код, который может , вызывает исключение, если myString имеет значение null. Это можно проверить, посмотрев окно Watch или выполнив выражения в окне Immediate Window .

var x = myString.Trim();

В более сложных случаях, таких как следуя ниже, вам нужно будет использовать один из методов выше (Watch или Immediate Windows) для проверки выражений, чтобы определить, было ли str1 пустым или если str2 имеет значение null.

var x = str1.Trim() + str2.Trim();

Once , где было выбрано исключение, это обычно тривиально по отношению к разуму назад, чтобы выяснить, где введенное значение null было [неправильно] -

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


1 Если Break on Throws слишком агрессивен и отладчик останавливается на NPE в библиотеке .NET или сторонних разработчиков, Break на User-Unhandled можно использовать для ограничения выловленных исключений. Кроме того, VS2012 представляет Just My Code , который я рекомендую также включить.

Если вы отлаживаете с включенным Just My Code, поведение немного отличается. При включенном Just My Code отладчик игнорирует исключения, связанные с привилегиями обычного языка (CLR) первого шанса, которые выходят за пределы My Code и не проходят через My Code

blockquote>

63
задан Btibert3 25 February 2011 в 14:58
поделиться

2 ответа

Повторное использование модели для прогнозирования новых наблюдений

Если модель не является дорогостоящей вычислительной, я склонен документировать весь процесс построения модели в R-скрипте, который я повторю, когда это необходимо. Если случайный элемент задействован в подгонке модели, я должен установить известное случайное семя.

Если модель вычислительно дорого вычисляется, то я все еще использую скрипт, как указано выше, но сохраняю используя объекты save() в и rda. Затем я стараюсь изменить сценарий таким образом, что если сохраненный объект существует, загрузите его или, если нет, переустановите модель, используя простое предложение if()...else, обернутое вокруг соответствующих частей кода.

Когда загрузите сохраненный объект модели, обязательно перезагрузите все необходимые пакеты, хотя в вашем случае, если модель логита была установлена ​​с помощью glm(), не будет никаких дополнительных пакетов для загрузки за пределы R.

Например:

> set.seed(345)
> df <- data.frame(x = rnorm(20))
> df <- transform(df, y = 5 + (2.3 * x) + rnorm(20))
> ## model
> m1 <- lm(y ~ x, data = df)
> ## save this model
> save(m1, file = "my_model1.rda")
> 
> ## a month later, new observations are available: 
> newdf <- data.frame(x = rnorm(20))
> ## load the model
> load("my_model1.rda")
> ## predict for the new `x`s in `newdf`
> predict(m1, newdata = newdf)
        1         2         3         4         5         6 
6.1370366 6.5631503 2.9808845 5.2464261 4.6651015 3.4475255 
        7         8         9        10        11        12 
6.7961764 5.3592901 3.3691800 9.2506653 4.7562096 3.9067537 
       13        14        15        16        17        18 
2.0423691 2.4764664 3.7308918 6.9999064 2.0081902 0.3256407 
       19        20 
5.4247548 2.6906722 

Если вы хотите автоматизировать это, то я, вероятно, сделаю следующее в скрипте:

## data
df <- data.frame(x = rnorm(20))
df <- transform(df, y = 5 + (2.3 * x) + rnorm(20))

## check if model exists? If not, refit:
if(file.exists("my_model1.rda")) {
    ## load model
    load("my_model1.rda")
} else {
    ## (re)fit the model
    m1 <- lm(y ~ x, data = df)
}

## predict for new observations
## new observations
newdf <- data.frame(x = rnorm(20))
## predict
predict(m1, newdata = newdf)

Конечно, код генерации данных будет заменен на код загружает ваши фактические данные.

Обновление ранее установленной модели с новыми наблюдениями

Если вы хотите переделать модель с использованием новых новых наблюдений. Тогда update() является полезной функцией. Все, что он делает, это обновить модель с обновленным аргументом модели. Если вы хотите включить новые наблюдения в данные, используемые для соответствия модели, добавьте новые наблюдения в кадр данных, переданный в аргумент 'data', а затем выполните следующее:

m2 <- update(m1, . ~ ., data = df)

, где m1 - исходная, сохраненная модель, . ~ . - это изменение формулы модели, которое в этом случае означает все существующие переменные как с левой, так и с правой стороны ~ (другими словами, не вносите изменений в модель формула), а df - это кадр данных, используемый для подгонки исходной модели, расширенный для включения новых доступных наблюдений.

Вот рабочий пример:

> set.seed(123)
> df <- data.frame(x = rnorm(20))
> df <- transform(df, y = 5 + (2.3 * x) + rnorm(20))
> ## model
> m1 <- lm(y ~ x, data = df)
> m1

Call:
lm(formula = y ~ x, data = df)

Coefficients:
(Intercept)            x  
      4.960        2.222  

> 
> ## new observations
> newdf <- data.frame(x = rnorm(20))
> newdf <- transform(newdf, y = 5 + (2.3 * x) + rnorm(20))
> ## add on to df
> df <- rbind(df, newdf)
> 
> ## update model fit
> m2 <- update(m1, . ~ ., data = df)
> m2

Call:
lm(formula = y ~ x, data = df)

Coefficients:
(Intercept)            x  
      4.928        2.187

Другое упомянул в комментариях formula(), который извлекает формулу из подогнанной модели:

> formula(m1)
y ~ x
> ## which can be used to set-up a new model call
> ## so an alternative to update() above is:
> m3 <- lm(formula(m1), data = df)

Однако, если подгонка модели включает дополнительные аргументы, такие как 'family' или 'subset' аргументы в более сложных функции подгонки модели. Если доступны функции update() для вашей функции подгонки модели (что они предназначены для многих общих функций фитинга, таких как glm()), он обеспечивает более простой способ обновления модели, а не извлечение и повторное использование формулы модели.

Если вы намерены делать все моделирование и будущее предсказание в R, на самом деле нет особого смысла в абстрагировании модели через PMML или подобное.

119
ответ дан Gavin Simpson 26 August 2018 в 05:09
поделиться

Если вы используете одно и то же имя фрейма данных и переменных, вы можете (по крайней мере для lm() и glm()) использовать функцию update для сохраненной модели:

Df <- data.frame(X=1:10,Y=(1:10)+rnorm(10))

model <- lm(Y~X,data=Df)
model

Df <- rbind(Df,data.frame(X=2:11,Y=(10:1)+rnorm(10)))

update(model)

Это без курса, без какой-либо подготовки данных и т. Д. Он просто повторно использует набор спецификаций модели. Имейте в виду, что если вы измените контрасты в то же время, новая модель будет обновляться новыми контрастами, а не старыми.

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

6
ответ дан Joris Meys 26 August 2018 в 05:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: