Прогнозирование номера заявки с помощью модели GLM

#python #data-science #prediction #glm #poisson

#python #наука о данных #прогнозирование #glm #poisson

Вопрос:

Я провожу тематическое исследование, в котором я должен предсказать номер заявки для каждой политики. Поскольку моя переменная ClaimNb не является двоичной, я не могу использовать логистическую регрессию, но я должен использовать Пуассона. Мой код для модели GLM:

 
 import statsmodels.api as sm
  
  import statsmodels.formula.api as smf
  
  formula= 'ClaimNb ~ BonusMalus VehAge Freq VehGas Exposure VehPower Density DrivAge'
  
  model = smf.glm(formula = formula, data=df,
  family=sm.families.Poisson()) 

 

Я также разделил свои данные

 
   # train-test-split   
   train , test = train_test_split(data,test_size=0.2,random_state=0)
   
   # seperate the target and independent variable
   train_x = train.drop(columns=['ClaimNb'],axis=1)
   train_y = train['ClaimNb']
   
   test_x = test.drop(columns=['ClaimNb'],axis=1)
   test_y = test['ClaimNb'] 

 

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

     from sklearn.linear_model import PoissonRegressor model = PoissonRegressor(alpha=1e-3, max_iter=1000)
    
    model.fit(train_x,train_y)
    
    predict = model.predict(test_x)
 

Пожалуйста, есть ли какой-либо другой способ предсказать и проверить точность модели?

Спасибо

Ответ №1:

Вам нужно назначить model.fit() и прогнозировать с этим, это отличается от sklearn. Кроме того, если вы используете формулу, лучше разделить ваш фрейм данных на обучающий и тестовый, прогнозируйте, используя это. Например:

 import statsmodels.api as sm
import statsmodels.formula.api as smf
import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.randint(0,100,(50,4)),columns=['ClaimNb','BonusMalus','VehAge','Freq'])
#X = df[['BonusMalus','VehAge','Freq']]
#y = df['ClaimNb']

df_train = df.sample(round(len(df)*0.8))
df_test = df.drop(df_train.index)

formula= 'ClaimNb ~ BonusMalus VehAge Freq'
  
model = smf.glm(formula = formula, data=df,family=sm.families.Poisson()) 
result = model.fit()
 

И мы можем сделать прогноз:

 result.predict(df_train)
 

Или:

 result.predict(df_test)
 

Комментарии:

1. Спасибо. Итак, если я понимаю, это не похоже на R, где вы можете создавать новые столбцы с claim_estimated ?

2. вы можете добавить его в свой тестовый фрейм данных, например df_test['pred'] = result.predict(df_test)

3. и как сгруппировать его по политике?

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

5. на самом деле это то же самое, что и в моем заголовке, предсказывающем количество заявок на политику. как только у нас будет предсказанная переменная, и мы добавим ее в фрейм данных, она должна быть сгруппирована по политике, например, политика 1: claimnb= 2 predictedclaim = 1