Как исправить модель статистики (в модели отсутствуют необходимые переменные результата)

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

Это мои импортированные файлы

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sklearn.preprocessing import LabelEncoder , OneHotEncoder
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
import statsmodels.formula.api as sm

Это первые 5 строк моего набора данных:

        gender    age    exercise    hours     grade
0       female    17        3        10        82.4
1       male      18        4        4         78.2
2       male      18        5        9         79.3
3       female    14        2        7         83.2
4       female    18        4        15        87.4


real_x = data_frame.iloc[:,:4].values
real_y = data_frame.iloc[:,4:].values

label_encoder_obj = LabelEncoder()
real_x[:,0] = label_encoder_obj.fit_transform(real_x[:,0])
one_hot_encoder = OneHotEncoder(categorical_features=[2])
real_x = one_hot_encoder.fit_transform(real_x).toarray()

real_x = real_x[:,1:]
training_x,test_x,training_y,test_y=
train_test_split(real_x,real_y,test_size=0.2,random_state=0)

multiple_linear_regression = LinearRegression()
multiple_linear_regression.fit(training_x,training_y)
predection_y = multiple_linear_regression.predict(test_x)


real_x=np.append(arr=np.ones((real_x.shape[0],1)).astype(int),
values=real_x,axis=1)

x_optimization = real_x[:,[0,1,2,3,4,5]] 

В нижней строке я получаю сообщение об ошибке.

regresion_ordinary_least_squar = sm.ols(real_y,data=x_optimization).fit();

# если пропущено == 'поднять', то не пропущена_маска

PatsyError: model is missing required outcome variables

И я видел несколько онлайн-примеров, в которых часть кода

sm.OLS() 

используется вместо

sm.ols()

В чем разница?


person Usman Ghani Mughal    schedule 12.09.2019    source источник
comment
Глядя на ваш код, видно, что API для вышеуказанного — smf.ols('Lottery ~ Literacy + np.log(Pop1831)', data=dat).fit() (взято с statsmodels.org/ стабильный/index.html документ), поэтому кажется, что вам нужно передать формулу.   -  person Chinny84    schedule 12.09.2019
comment
а как передать формулу? и что это значит? Подскажите, пожалуйста, что происходит под капотом? @Chinny84   -  person Usman Ghani Mughal    schedule 12.09.2019
comment
Вы можете ввести это в командной строке/блоке ячеек и т. д. sm.ols? это покажет вам, как использовать функцию (также ссылка, которую я предоставил, должна дать ясность). Вы использовали R раньше? вы должны дать формулу <outcome> ~ independent variables list в качестве формулы.   -  person Chinny84    schedule 12.09.2019
comment
Да, я изучил основы R раньше. Я буду искать формулу, большое спасибо, очень ценю вашу помощь. @Chinny84   -  person Usman Ghani Mughal    schedule 12.09.2019
comment
Без проблем. Надеюсь, поможет.   -  person Chinny84    schedule 12.09.2019


Ответы (2)


Краткий ответ заранее: вы смешиваете две разные версии реализации ols statsmodels и дали модели, которую выбрали неправильные входные данные.

Длинный ответ: Statsmodel включает две версии обычной модели наименьших квадратов.

Принятые настройки импорта, которые я видел:

import statsmodels.api as sm
import statsmodels.formula.api as smf

тогда это выбор:

sm.OLS()
smf.ols()

и ведут себя по разному.

sm.OLS принимает отдельные кадры данных X и Y (или exog и endog). sm.OLS также НЕ добавляет константу в модель. Вы должны добавить это в первую очередь. Также обратите внимание, что версия statsmodel меняет порядок ввода переменных — Y, затем X. В обратном порядке от того, как модели sklearn вводят свои данные.

X = sm.add_constant(X)
model = sm.OLS(Y,X)
results = model.fit()
result.summary()

Это также работает:

X = sm.add_constant(X)
model = sm.OLS(Y,X).fit()
model.summary()

.summary() представляет результаты оценки модели, коэффициентов и p-значений.

smf.ols принимает простую фразу и кадр данных, который включает в себя как ответную или целевую переменную, так и все функции. Фраза patsy позволяет указать модели, какие столбцы использовать при создании модели ols для переменной ответа. Сложная фраза — это строка, которая будет выглядеть как 'y ~ X1 + X2 + X3'. Кроме того, версия smf.ols по умолчанию добавляет перехват.

df = pd.DataFrame({'X1':x, 'X2':x2, 'X3':x3, 'y':Y})
model = smf.ols('y ~ X1 + X2 + X3', df).fit()

поочередно,

phrase = 'y ~ X1 + X2 + X3 + X4'
model = smf.ols(phase,df).fit()

затем выполните:

model.summary2()

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

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

Лично я предпочитаю формульную модель. Но становится неловко, когда вы разбиваете свой фрейм данных на X_train, y_train, X_test, y_test.

Когда я это делаю, я настраиваю свою модель следующим образом:

frames =[y_train, X_train]
df_train = pd.concat(frames, axis=1).reindex(y_train.index)

model = smf.ols(formula, df_train).fit()

Я отмечаю, что вы также используете линейную регрессию sklearn. По умолчанию он также включает в себя перехват. Все три должны давать одинаковые ответы на одних и тех же данных, если добавить константу в модель sm.OLS. прочитайте статью об этом на kaggle здесь.

person Barnstormr    schedule 02.12.2020

Вы должны использовать

импортировать statsmodels.regression.linear_model как sm;

вместо

импортировать statsmodels.formula.api как sm

и использовать

regsion_ordinary_least_squar = sm.OLS(endog = real_y, exog = x_optimization).fit()

вместо

regsion_ordinary_least_squar = sm.ols(real_y,data=x_optimization).fit();

person Saif Tak    schedule 23.12.2019