statsmodels: Вопросы относительно add_constant - PullRequest
0 голосов
/ 20 апреля 2020

Я пытался войти в Python и использовал некоторые онлайн-курсы (я работаю с Jupyter Notebooks, если это имеет значение, и Python 3). В одном речь шла о статмоделях и регрессиях. Насколько мне сказали мои курсы по статистике, вы хотите включить перехват (я уверен, что есть причины не делать этого, но на самом деле это исключение).

1) Я попытался спросить Google и наткнулся на пример, который мне не совсем понятен: Это пример с сайта statsmodels :

import statsmodels.api as sm
Y = [1,3,4,5,2,3,4]
X = range(1,8)
X = sm.add_constant(X)
model = sm.OLS(Y,X)
results = model.fit()
results.params

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

import statsmodels.api as sm
Y = [1,3,4,5,2,3,4]
X = range(1,8)
model = sm.OLS(Y,X)
results = model.fit()
results.params

Вопрос 1: Это возвращает ошибку: ValueError Traceback (most recent call last) <ipython-input-3-c8dfe3eb8b44> in <module>. Она указывает на ошибку model = sm.OLS(Y,X) - почему?

2a) Вот код, который был в курсе:

Речь идет о прогнозировании цены автомобиля на основе нескольких переменных (пробег, цилиндры, двери)

import pandas as pd
df = pd.read_excel('http://cdn.sundog-soft.com/Udemy/DataScience/cars.xls')

%matplotlib inline
import statsmodels.api as sm
from sklearn.preprocessing import StandardScaler
scale = StandardScaler()

X = df[['Mileage', 'Cylinder', 'Doors']]
y = df['Price']
X[['Mileage', 'Cylinder', 'Doors']] = scale.fit_transform(X[['Mileage', 'Cylinder', 'Doors']].values)

print (X)
est = sm.OLS(y, X).fit()
est.summary()

Вопрос 2: Кажется, что это работает, но также возвращает ошибку: «Значение пытается быть установлено для копии среза из DataFrame. Попробуйте вместо этого использовать .loc [row_indexer, col_indexer] = value "- Что это значит? Это всего лишь предупреждение от pandas, чтобы предупредить о потенциально неправильном синтаксисе, , как кажется, это обсуждение предлагает ?

2b) Тот же код с перехватом:

import pandas as pd
df = pd.read_excel('http://cdn.sundog-soft.com/Udemy/DataScience/cars.xls')

%matplotlib inline
import statsmodels.api as sm
from sklearn.preprocessing import StandardScaler
scale = StandardScaler()

X = df[['Mileage', 'Cylinder', 'Doors']]
y = df['Price']
X = sm.tools.tools.add_constant(X)
X[['Mileage', 'Cylinder', 'Doors']] = scale.fit_transform(X[['Mileage', 'Cylinder', 'Doors']].values)

print (X)
est = sm.OLS(y, X).fit()
est.summary()

Вопрос 3: Коэффициенты не меняются по сравнению с моделью без добавления константы - что я делаю не так? Кроме того, при выполнении print(X) константа указывается как 1 наблюдение, потому что это в основном заполнитель в этой точке? Но почему бы не быть 0?

Вопрос 4: И чтобы оставаться на вершине c из того, что я не понимаю: Когда стандартизация применяется с scale.fit_transform, имеет ли значение, если константа добавляется до или после нее?

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

1 Ответ

2 голосов
/ 20 апреля 2020

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

Вопрос 1 - В python диапазон - это неизменяемые итерируемые объекты, которые позволяют вам перебирать поверх них он не создает списки.

>>> range(1)
range(0, 1)
>>> type(range(1))
<class 'range'>

Вы можете использовать диапазон в течение l oop. Но вы не можете использовать его как объект списка. Вам нужно получить список из диапазона Объект и подходит для OLS.

X = list(range(1,8))

Вопрос 2 - Это означает, что если у вас есть подмножество данных, и вы хотите изменить определенное значение исходного кадра данных, но он обновит подмножество вместо исходного кадра данных или наоборот. Подробнее в этой ссылке

https://www.dataquest.io/blog/settingwithcopywarning/

Вопрос 3 - константа указывает где линия пересекает ось Y. Например, скажем, у вас есть 3 линейные функции.

1) y = 3x + 5
2) y = 3x - 5
3) y = 3x + 0

в этих 3 функциях, коэффициенты 3 и константы + 5, -5 и 0. Что означает, что вы имеют одинаковый наклон для всех функций, но точку, где Ось Y отличается.

Вопрос 4 - Стандартизация объектов вокруг центра и 0 со стандартным отклонением 1. Если вы стандартизируете постоянный массив, он будет равен нулю. Потому что среднее значение равно константе. я думаю, что вы должны добавить константу после стандартизации.

Xchanged=(X−μ)/σ

пример

from sklearn.preprocessing import StandardScaler
x = np.asarray([5]*10, dtype=np.float64)
standardized_data = StandardScaler().fit_transform(x.reshape(-1,1))

вывод

array([[0.],
       [0.],
       [0.],
       [0.],
       [0.],
       [0.],
       [0.],
       [0.],
       [0.],
       [0.]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...