ValueError: Ожидаемый 2D-массив, вместо него получен скалярный массив - PullRequest
0 голосов
/ 21 января 2019

Во время практики модели простой линейной регрессии я получил эту ошибку:

ValueError: Expected 2D array, got scalar array instead:
array=60.
Reshape your data either using array.reshape(-1, 1) if your data has a single 
feature or array.reshape(1, -1) if it contains a single sample.

Это мой код (Python 3.7):

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
data = pd.read_csv("hw_25000.csv")


hgt = data.Height.values.reshape(-1,1)
wgt = data.Weight.values.reshape(-1,1)

regression = LinearRegression()
regression.fit(hgt,wgt)

print(regression.predict(60))


print(data.columns)

plt.scatter(data.Height,data.Weight)
x = np.arange(min(data.Height),max(data.Height)).reshape(-1,1)
plt.plot(x,regression.predict(x),color="red")
plt.xlabel("Height")
plt.ylabel("Weight")
plt.title("Simple Linear Regression Model")
plt.show()

print(r2_score(wgt,regression.predict(hgt)))

Я действительно не знаю, что не такс моим кодом, поэтому я ценю любую помощь.Спасибо

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Краткий ответ:

regression.predict([[60]])

Длинный ответ: regression.predict принимает двумерный массив значений, для которых вы хотите предсказать.Каждый элемент в массиве - это «точка», которую вы хотите, чтобы ваша модель предсказывала.Предположим, мы хотим предсказать точки 60, 52 и 31. Тогда мы скажем regression.predict([[60], [52], [31]])

. Причина, по которой нам нужен двумерный массив, заключается в том, что мы можем выполнять линейную регрессию в пространстве более высокой размерности, чем просто2d.Например, мы могли бы сделать линейную регрессию в трехмерном пространстве.Предположим, что мы хотим предсказать «z» для данной точки данных (x, y).Тогда нам нужно будет сказать regression.predict ([[x, y]]).

Продолжая этот пример, мы могли бы предсказать «z» для набора точек «x» и «y».Например, мы хотим предсказать значения «z» для каждой из точек: (0, 2), (3, 7), (10, 8).Тогда мы бы сказали regression.predict ([[0, 2], [3, 7], [10, 8]]), который полностью демонстрирует необходимость для regression.predict принимать двумерный массив значений для прогнозирования по точкам.

0 голосов
/ 21 января 2019

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

hgt = np.random.randint(50, 70, 10).reshape(-1, 1)
wgt = np.random.randint(90, 120, 10).reshape(-1, 1)
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score

regression = LinearRegression()
regression.fit(hgt,wgt)

regression.predict([[60]])

Вы получите

array([[105.10013717]])
...