Python 스크립트 "예상 된 2D 배열, 대신 1D 배열이 있습니다."오류가 발생합니까?


87

이 ML 예측을 위해이 자습서 를 따르고 있습니다 .

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import style

style.use("ggplot")
from sklearn import svm

x = [1, 5, 1.5, 8, 1, 9]
y = [2, 8, 1.8, 8, 0.6, 11]

plt.scatter(x,y)
plt.show()

X = np.array([[1,2],
             [5,8],
             [1.5,1.8],
             [8,8],
             [1,0.6],
             [9,11]])

y = [0,1,0,1,0,1]
X.reshape(1, -1)

clf = svm.SVC(kernel='linear', C = 1.0)
clf.fit(X,y)

print(clf.predict([0.58,0.76]))

Python 3.6을 사용하고 있는데 "예상 된 2D 배열, 대신 1D 배열이 있습니다."라는 오류가 발생합니다. 스크립트가 이전 버전 용이라고 생각하지만 3.6 버전으로 변환하는 방법을 모르겠습니다.

이미 시도해보십시오 :

X.reshape(1, -1)

3
어떤 라인에서 오류가 발생합니까?
stackoverflowuser2010

10
X = X.reshape(1, -1). 모양 변경은 제자리에 있지 않습니다.
Mad Physicist

2
@ stackoverflowuser2010 : 나는 이미 2 차원 clf.predict(<a-1d-thing>)이기 때문에 마지막 줄을 추측 할 것 입니다. Xreshape
Mark Dickinson

@MarkDickinson 네, 마지막 줄입니다.
JonTargaryen

2
@JonTargaryen은 올바른 위치에 있지만 결과를 버리고 있습니다. 결과를에 다시 할당합니다 X.
Mad Physicist

답변:


165

predict동일한 2D 배열로 메서드 를 제공해야 하지만 처리하려는 하나 이상의 값이 있습니다. 간단히 말해

[0.58,0.76]

[[0.58,0.76]]

그리고 그것은 작동합니다.

편집 :이 답변이 인기를 얻었으므로 ML에 대한 설명을 조금 더 추가 할 것이라고 생각했습니다. 짧은 버전 : predict학습 데이터 ( X) 와 차원이 동일한 데이터 에만 사용할 수 있습니다 .

문제의 예에서 우리는 컴퓨터에 여러 행 X(각각 2 개의 값 포함)을 제공하고 y. 우리가하려는 경우 predictA - 새 값을 사용하여, 우리의 프로그램은 같은 기대 무리 행을. 하나의 행 (두 개의 값 포함)에만이를 수행하려는 경우에도 해당 행은 다른 배열의 일부 여야합니다.


31
하지만 왜 작동합니까? 나는 문제가 무엇인지 이해하지 못한다.
Charlie Parker

2
더 큰 데이터 프레임에서 이것을 어떻게 달성합니까? (동적)
Sip

4
2D 배열이어야하는 이유는 무엇입니까? 이것의 이유는 무엇입니까?
problemofficer

19

어레이에서 예측을 실행할 때 문제가 발생합니다 [0.58,0.76]. 전화하기 전에 모양을 변경하여 문제를 해결하십시오 predict().

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import style

style.use("ggplot")
from sklearn import svm

x = [1, 5, 1.5, 8, 1, 9]
y = [2, 8, 1.8, 8, 0.6, 11]

plt.scatter(x,y)
plt.show()

X = np.array([[1,2],
             [5,8],
             [1.5,1.8],
             [8,8],
             [1,0.6],
             [9,11]])

y = [0,1,0,1,0,1]

clf = svm.SVC(kernel='linear', C = 1.0)
clf.fit(X,y)

test = np.array([0.58, 0.76])
print test       # Produces: [ 0.58  0.76]
print test.shape # Produces: (2,) meaning 2 rows, 1 col

test = test.reshape(1, -1)
print test       # Produces: [[ 0.58  0.76]]
print test.shape # Produces (1, 2) meaning 1 row, 2 cols

print(clf.predict(test)) # Produces [0], as expected

8

아래 접근 방식을 사용합니다.

reg = linear_model.LinearRegression()
reg.fit(df[['year']],df.income)

reg.predict([[2136]])

6

예측하려는 인스턴스의 데이터 유형이 panda.Series객체 라는 점을 제외하고는 동일한 문제에 직면했습니다 .

한 입력 인스턴스를 예측하기 만하면됩니다. 내 데이터 조각에서 가져 왔습니다.

df = pd.DataFrame(list(BiogasPlant.objects.all()))
test = df.iloc[-1:]       # sliced it here

이 경우 1 차원 배열로 변환 한 다음이를 변환해야 reshape합니다.

 test2d = test.values.reshape(1,-1)

로부터 문서 , valuesNumPy와 배열에 시리즈를 변환합니다.


3

나는 같은 문제에 직면했다. 배열로 만들어야하며, 첫 번째 대괄호가 배열을 초기화하고 두 번째 대괄호가 배열의 요소로 만들기 때문에 2D 배열의 단일 요소로 만들기 위해 이중 대괄호를 넣어야합니다.

따라서 간단히 마지막 문장을 다음과 같이 바꾸십시오.

print(clf.predict(np.array[[0.58,0.76]]))

1

이전에 같은 문제에 직면했지만 어떻게 든 해결책을 찾았습니다 reg.predict([[3300]]). 시도해 볼 수 있습니다 .

스칼라 값을 허용하는 데 사용되는 API가 이제 2D 배열을 제공해야합니다.


1

이중 대괄호 사이에 인수를 삽입하십시오.

regressor.predict ([[값]])

나를 위해 일한


0

하나의 기능으로 내 데이터 프레임 목록이 시리즈로 변환됩니다. 나는 그것을 다시 Dataframe 목록으로 변환해야했고 작동했습니다.

if type(X) is Series:
    X = X.to_frame()

-1

Int64 Type에서 DataFrame에 각각 독립 변수와 종속 변수의 X 및 Y 행렬을 지정하여 1D 배열에서 2D 배열로 변환합니다. 즉 X = pd.DataFrame (X) 및 Y = pd.dataFrame (Y) 여기서 pd 파이썬의 pandas 클래스입니다. 따라서 기능 확장은 오류로 이어지지 않습니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.