sklearn: обнаружены массивы с несогласованным количеством выборок при вызове LinearRegression.fit ()


103

Просто пытаюсь выполнить простую линейную регрессию, но эта ошибка меня сбивает с толку:

regr = LinearRegression()
regr.fit(df2.iloc[1:1000, 5].values, df2.iloc[1:1000, 2].values)

который производит:

ValueError: Found arrays with inconsistent numbers of samples: [  1 999]

Эти выборки должны иметь одинаковые размеры, и они должны быть многочисленными массивами, так что мне не хватает?

Ответы:


117

Похоже, для sklearn требуется форма данных (номер строки, номер столбца). Если ваша форма данных (номер строки) как (999, ), она не работает. Используя numpy.reshape(), вы должны изменить форму массива (999, 1), например, используя

data=data.reshape((999,1))

В моем случае это сработало.


6
моя форма данных - (10L,), как мне преобразовать ее в (10L, 1). Когда я использую data = data.reshape (len (data), 1), результирующая форма будет (10L, 1L), а не (10L, 1)
user3841581

@ user3841581, пожалуйста, обратитесь к этому сообщению .
Джордж Лю

1
@Boern Спасибо за комментарий. Я также обнаружил, что X_train должен иметь размер (N, 1), но y_train должен иметь размер (N,), а не (N, 1), иначе это не сработает, по крайней мере, для меня.
CrossEntropy

data.reshape (...) может отображать предупреждение об ограничении цен, если data является объектом Series. Используйте data.values.reshape (...)
NightFurry

data = data.reshape (-1,1)
Итачи

25

Похоже, вы используете фрейм данных pandas (от имени df2).

Вы также можете сделать следующее:

regr = LinearRegression()
regr.fit(df2.iloc[1:1000, 5].to_frame(), df2.iloc[1:1000, 2].to_frame())

ПРИМЕЧАНИЕ. Я удалил «значения», так как это преобразовывает серию панд в numpy.ndarray, а numpy.ndarray не имеет атрибута to_frame ().


11

Из курса Udacity Deep Learning Foundation:

df = pd.read_csv('my.csv')
...
regr = LinearRegression()
regr.fit(df[['column x']], df[['column y']])

2
Спасибо! Это действительно самый простой и понятный способ!
Хуан А. Наварро

Фактически, параметр Y ожидается как форма (длина,). Спасибо!
Michael_Zhang

6

Я думаю, что аргумент "X" regr.fit должен быть матрицей, поэтому следующее должно работать.

regr = LinearRegression()
regr.fit(df2.iloc[1:1000, [5]].values, df2.iloc[1:1000, 2].values)

4

Я столкнулся с этой ошибкой, потому что преобразовал свои данные в формат np.array. Я решил проблему, np.matrixвместо этого преобразовав свои данные в формат и применив транспонирование.

ValueError: regr.fit(np.array(x_list), np.array(y_list))

Верный: regr.fit(np.transpose(np.matrix(x_list)), np.transpose(np.matrix(y_list)))


3
expects X(feature matrix)

Попробуйте поместить свои функции в такой кортеж:

features = ['TV', 'Radio', 'Newspaper']
X = данные [особенности]

1

Столкнулся с похожей проблемой. В моем случае проблема заключалась в том, что количество строк в X не было равно количеству строк в y.

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


0

Для анализа двух массивов (array1 и array2) они должны соответствовать следующим двум требованиям:

1) Они должны быть numpy.ndarray

Проверить с

type(array1)
# and
type(array2)

Если это не так, хотя бы один из них выполняет

array1 = numpy.ndarray(array1)
# or
array2 = numpy.ndarray(array2)

2) Размеры должны быть следующими:

array1.shape #shall give (N, 1)
array2.shape #shall give (N,)

N - количество элементов в массиве. Чтобы предоставить array1 правильное количество осей, выполните:

array1 = array1[:, numpy.newaxis]

0

Как упоминалось выше, аргумент X должен быть матрицей или массивом numpy с известными размерами. Так что вы, вероятно, могли бы использовать это:

df2.iloc[1:1000, 5:some_last_index].values

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



-1

во время тестового сплита на поезде вы могли сделать ошибку

x_train,x_test,y_train,y_test=sklearn.model_selection.train_test_split(X,Y,test_size)

Приведенный выше код правильный

Возможно, вы поступили так, как показано ниже, что неверно

x_train,y_train,x_test,y_test=sklearn.model_selection.train_test_split(X,Y,test_size)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.