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.