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 ().

user24981
источник
11

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

df = pd.read_csv('my.csv')
...
regr = LinearRegression()
regr.fit(df[['column x']], df[['column y']])
xilef
источник
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

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

Энди Дж.
источник
0

Несколько дней я столкнулся с той же проблемой. Причина заключалась в разных размерах массивов.

Энгр Салихин Африди
источник
-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)
навин
источник