ValueError: exog не 1d или 2d при попытке соответствовать statsmodels OLS - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь подогнать простую модель OLS, используя statsmodels, загружая 2 numpy массивов с именами столбцов. Однако при попытке подобрать модель я получаю эту ошибку:

ValueError: exog is not 1d or 2d

Чтобы сделать пример воспроизводимым, я использовал набор данных sklearn и создал массивы. Мой код таков:

import numpy as np
import pandas as pd
import statsmodels.api as sm
from sklearn import datasets ## imports datasets from scikit-learn
data = datasets.load_boston() ## loads Boston dataset from datasets library

df = pd.DataFrame(data.data, columns=data.feature_names)
Y = pd.DataFrame(data.target, columns=["MEDV"])
Y = Y.to_numpy(dtype=[('MEDV', 'float64')])
X = df.to_numpy(dtype=[('CRIM', 'float64'), ('ZN', 'float64'), ('INDUS', 'float64'), ('CHAS', 'float64'), ('NOX', 'float64'),
                   ('RM', 'float64'), ('AGE', 'float64'), ('DIS', 'float64'), ('RAD', 'float64'), ('TAX', 'float64'),
                   ('PTRATIO', 'float64'), ('B', 'float64'), ('LSTAT', 'float64')])


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

Это не имеет никакого смысла, поскольку моя переменная Y представляет собой вертикальный вектор чисел, так что это, безусловно, 1D или 2D.

Кто-нибудь понимает, почему я получаю эту ошибку?

1 Ответ

0 голосов
/ 07 мая 2020

Простое исправление:

import numpy as np
import pandas as pd

import statsmodels.api as sm
from sklearn import datasets ## imports datasets from scikit-learn
data = datasets.load_boston() ## loads Boston dataset from datasets library

df = pd.DataFrame(data.data, 
                  columns=data.feature_names)

Y = pd.DataFrame(data.target, columns=["MEDV"])

X = df.to_numpy()
Y = Y.to_numpy()

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

Давайте посмотрим на различия между двумя подходами:

Y = pd.DataFrame(data.target, columns=["MEDV"])

(Y.to_numpy(dtype=[('MEDV', 'float64')]))[:10]
array([[(24. ,)],
       [(21.6,)],
       [(34.7,)],
       [(33.4,)],
       [(36.2,)],
       [(28.7,)],
       [(22.9,)],
       [(27.1,)],
       [(16.5,)],
       [(18.9,)]], dtype=[('MEDV', '<f8')])
# That is an array of tuples

Y.to_numpy()[:10]
array([[24. ],
       [21.6],
       [34.7],
       [33.4],
       [36.2],
       [28.7],
       [22.9],
       [27.1],
       [16.5],
       [18.9]])
# This is an array of floats

То же самое происходит с X.

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