Как я могу использовать K-кратную перекрестную проверку для отрицательной биномиальной регрессии в sklearn? - PullRequest
0 голосов
/ 01 августа 2020

Я собираюсь применить модель отрицательной биномиальной регрессии к набору данных и исследовать оценки модели, а также вес и значимость функций с помощью перекрестной проверки (K-Fold). Вот фрейм данных после применения масштабатора MinMax. w4 - категориальная переменная.

data.head()


     w1      w2      w3      w4     Y
0   0.17    0.44    0.00    2004    1   
1   0.17    0.83    0.22    2004    0   
2   0.00    1.00    0.34    2005    0
3   1.00    0.00    1.00    2005    1
4   1.00    0.22    0.12    2006    3

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

scores = []
kfold = KFold(n_splits=10, shuffle=True, random_state=1)
for train, test in kfold.split(data):
    model = smf.glm(formula = "Y ~ w1 + w2 + w3 + C(w4)", data=X.iloc[train,:], family=sm.families.NegativeBinomial()).fit()
    scores = scores.append(model.get_prediction(X.iloc[test,:])
    
print(scores)

1 Ответ

0 голосов
/ 01 августа 2020

Вы определили X и Y? Кажется, что вы передаете data DataFrame методу kfold.split, но позже вы ссылаетесь на X и Y как на объекты данных. Попробуйте сначала настроить X = data[['w1', 'w2', 'w3', 'w4']], а затем ссылаться на них, как в своем примере.

Кроме того, я заметил, что вы перезаписываете исходный список scores в scores = model.get_prediction(X.iloc[test,:]) Например:

X = data[['w1', 'w2', 'w3', 'w4']].values
Y = data['Y'].values
preds, scores = [], []
kfold = KFold(n_splits=10, shuffle=True, random_state=1)
for train_idx, test_idx in kfold.split(data):
    X_train, X_test = X[train_idx], X[test_idx]
    y_test = Y[test_idx]
    model = smf.glm(formula = "Y ~ w1 + w2 + w3 + C(w4)", 
                    data=X_train, 
                    family=sm.families.NegativeBinomial()).fit()
    preds.append(model.get_prediction(X_test))
    scores.append(model.score(X_test, y_test))
print(scores)
...