Как создать несколько моделей регрессии (statsmodel) в подмножествах фрейма данных pandas, используя цикл for или условие?

1

Как создать несколько регрессионных моделей (statsmodel) в подмножествах кадра данных pandas, используя цикл for или conditon?

У меня есть datframe, у которого есть одно переменное состояние, которое имеет 51 уникальные значения. Я должен сделать модель для каждого государства. По какой-то причине я ограничен регрессией (statsmodel), скажем, с переменной V1, которая должна быть предсказана переменными X1, X2, X3

Состояние равно 1:51 и будет использоваться как условие для разделения этого кадра данных

Как я могу автоматизировать эту задачу с помощью цикла for?

  • 1
    Итак, внутренне вы хотите, чтобы датафрейм разделился на 51 маленький фрейм данных, каждый из которых обслуживает одно из 51 состояний, а затем построил на нем 51 модель ... верно?
  • 0
    это верно. Однако я хочу сосредоточиться на части интерпретации модели, а не делать то же самое 51 раз
Теги:
pandas
for-loop
classification
regression

2 ответа

1

Предполагая, что вас интересует только цикл и не разделение данных на 51 часть, вот моя попытка вашего вопроса:

Допустим, вы определяете свою функцию OLS как:

def OLSfunction(y):

    y_train = traindf[y]
    y_test = testdf[y]
    from statsmodels.api import OLS
    x_train = x_traindf
    x_test = x_testdf
    model = OLS(y_train, x_train)
    result = model.fit()
    print (result.summary())
    pred_OLS = result.predict(x_test)
    print("R2", r2_score(y_test, pred_OLS))



Y_s = ['1','2',.....'51']
for y in Y_s:
    y=y
    OLSfunction(y)

Обратите внимание, что вам нужно будет получить ваш traindf и testdf соответствующим образом для конкретного Y, который вы хотите построить. И они должны быть правильно переданы в функцию OLS. Поскольку у меня нет никакого представления о том, как выглядят ваши данные, я не попадаю в разделение/создание traindf/testdf...

0
import pandas as pd
import os as os
import numpy as np
import statsmodels.formula.api as sm

Сначала я создал dict для хранения 51 набора данных

d = {}
for x in range(0, 52):
    d[x]=ccf.loc[ccf['state'] == x]

d.keys()

dict_keys([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51])

Проверять

d[1].head()

Затем я запустил код в цикле, используя позицию в dict

results={}
for x in range(1, 51):
        results[x] = sm.Logit(d[x].fraudRisk, d[x][names]).fit().summary2()

Однако я чувствовал, что должен использовать множественные классификаторы в sklearn. Сначала мне нужно разделить данные, как указано выше.

from sklearn.model_selection import train_test_split

# Multiple Models
from sklearn.linear_model import LogisticRegression
from sklearn.svm import LinearSVC
from sklearn.neighbors import KNeighborsClassifier  
from sklearn.ensemble import RandomForestClassifier 
from sklearn.naive_bayes import GaussianNB

#Model Metrics
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score
from sklearn.metrics import classification_report
from sklearn.metrics import roc_auc_score


lr={}
gnb={}
svc={}
rfc={}
classifier={}
regr_1={}
regr_2={}
import datetime 
datetime.datetime.now() 

for x in range(1, 51):
    X_train, X_test, y_train, y_test = train_test_split(d[x][names], d[x].fraudRisk, test_size=0.3)
    print(len(X_train))
    print(len(y_test))

    # Create classifiers

    lr[x] = LogisticRegression().fit(X_train, y_train).predict(X_test)
    gnb[x] = GaussianNB().fit(X_train, y_train).predict(X_test)
    svc[x] = LinearSVC(C=1.0).fit(X_train, y_train).predict(X_test)
    rfc[x] = RandomForestClassifier(n_estimators=1).fit(X_train, y_train).predict(X_test)
    classifier[x] = KNeighborsClassifier(n_neighbors=3).fit(X_train, y_train).predict(X_test)  

    print(datetime.datetime.now())
    print("Accuracy Score for model for  state ",x, 'is  ')

    print('LogisticRegression',accuracy_score(y_test,lr[x]))
    print('GaussianNB',accuracy_score(y_test,gnb[x]))
    print('LinearSVC',accuracy_score(y_test,svc[x]))
    print('RandomForestClassifier',accuracy_score(y_test,rfc[x]))
    print('KNeighborsClassifier',accuracy_score(y_test,classifier[x]))

    print("Classification Report for model for state ",x, 'is  ')

    print('LogisticRegression',classification_report(y_test,lr[x]))
    print('GaussianNB',classification_report(y_test,gnb[x]))
    print('LinearSVC',classification_report(y_test,svc[x]))
    print('RandomForestClassifier',classification_report(y_test,rfc[x]))
    print('KNeighborsClassifier',classification_report(y_test,classifier[x]))

    print("Confusion Matrix Report for model for state ",x, 'is  ')  

    print('LogisticRegression',confusion_matrix(y_test,lr[x]))
    print('GaussianNB',confusion_matrix(y_test,gnb[x]))
    print('LinearSVC',confusion_matrix(y_test,svc[x]))
    print('RandomForestClassifier',confusion_matrix(y_test,rfc[x]))
    print('KNeighborsClassifier',confusion_matrix(y_test,classifier[x]))

    print("Area Under Curve for model for state ",x, 'is  ') 

    print('LogisticRegression',roc_auc_score(y_test,lr[x]))
    print('GaussianNB',roc_auc_score(y_test,gnb[x]))
    print('LinearSVC',roc_auc_score(y_test,svc[x]))
    print('RandomForestClassifier',roc_auc_score(y_test,rfc[x]))
    print('KNeighborsClassifier',roc_auc_score(y_test,classifier[x]))

Долгое время занимал 5 моделей X 51 штатов с несколькими метриками, но стоил того. Сообщите мне, есть ли более быстрый или лучший способ написать более элегантный и менее хакерский код

Ещё вопросы

Сообщество Overcoder
Наверх
Меню