Циклическая линейная регрессия в Python

#python #dataframe #loops #predict

Вопрос:

df_tmp

 zipcode.  var1   var2.  orders
Z1.       20.     19.    20
Z1.       50.     28.    10
Z1.       80.     45.    26
Z2.       19.     36.    10
Z2.       20.     90.    16
Z2.       40.     59.    18
 

Я использую следующую функцию для общего прогнозирования —

 #split x and y
x = df_tmp.drop(columns=['orders'])
y = df_tmp['orders']

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size = 0.20, random_state = 0)

from sklearn import datasets, linear_model
from sklearn.linear_model import LinearRegression
import statsmodels.api as sm
from scipy import stats

X2 = sm.add_constant(X_train)
est = sm.OLS(y_train, X2).fit()
X_test = sm.add_constant(X_test) # add again the constant
y_test_predicted = est.predict(X_test)
y_test_predicted

 

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

Спасибо!

Ответ №1:

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

Это будет намного быстрее, чем использование для циклов.

Код здесь:

 from sklearn.model_selection import train_test_split
import statsmodels.api as sm

zipcodes = df_tmp['zipcode.'].unique()
different_df_sections = (df_tmp.loc[df_tmp['zipcode.'] == x] for x in zipcodes)

def calculate_predictions(df_tmp):

    x = df_tmp.drop(columns=['orders'])
    y = df_tmp['orders']
    X_train, X_test, y_train, y_test = train_test_split(x, y, test_size = 0.20, random_state = 0)
    X2 = sm.add_constant(X_train)
    est = sm.OLS(y_train, X2).fit()
    X_test = sm.add_constant(X_test) # add again the constant
    y_test_predicted = est.predict(X_test)

    return y_test_predicted

different_predictions = map(calculate_predictions, different_df_sections)
all_predictions = [x for x in different_predictions]
 

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

1. Я получаю ошибку со значением: При n_samples=1, test_size=0,2 и train_size=Нет, результирующий набор поездов будет пустым. Отрегулируйте любой из вышеупомянутых параметров.

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

3. Отредактировал сейчас с помощью другого подхода, который, я думаю, лучше…

4. Спасибо за помощь, тест на поезд, похоже, все еще не работает для меня. Однако — « different_predictions = карта(вычисление_предикций, section_generator(X_train, X_test, y_train, y_test)) ` ` изменено на ` ` different_predictions = карта(вычисление_предикций, section_generator(X_train, X_test, y_train, y_test, zipcodes)) » По-прежнему не работает. Однако, если я не использую поезд и тестовый сплит, это работает! Я постараюсь еще немного погрузиться, чтобы исправить ситуацию