Lỗi trong tập lệnh Python “Mảng 2D mong đợi, thay vào đó là mảng 1D:”?


81

Tôi đang làm theo hướng dẫn này để đưa ra dự đoán ML này:

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]))

Tôi đang sử dụng Python 3.6 và tôi gặp lỗi "Mảng 2D mong đợi, thay vào đó là mảng 1D:" Tôi nghĩ tập lệnh dành cho các phiên bản cũ hơn, nhưng tôi không biết cách chuyển đổi nó sang phiên bản 3.6.

Đã thử với:

X.reshape(1, -1)

3
Dòng nào đang sản xuất lỗi?
stackoverflowuser2010

10
X = X.reshape(1, -1). Định hình lại không đúng chỗ.
Mad Physicist

2
@ stackoverflowuser2010: Tôi đoán dòng cuối cùng clf.predict(<a-1d-thing>), vì Xnó đã là hai chiều ( reshapemặc dù vô dụng ).
Mark Dickinson

@MarkDickinson Vâng, dòng cuối cùng là.
JonTargaryen

2
@JonTargaryen định hình lại ở đúng nơi, nhưng bạn đang loại bỏ kết quả. Gán lại kết quả cho X.
Mad Physicist,

Câu trả lời:


157

Bạn chỉ cần cung cấp predictphương thức với cùng một mảng 2D, nhưng với một giá trị mà bạn muốn xử lý (hoặc nhiều hơn). Tóm lại, bạn chỉ cần thay thế

[0.58,0.76]

Với

[[0.58,0.76]]

Và nó sẽ hoạt động.

CHỈNH SỬA: Câu trả lời này đã trở nên phổ biến vì vậy tôi nghĩ tôi sẽ thêm một chút giải thích về ML. Phiên bản ngắn: chúng tôi chỉ có thể sử dụng predicttrên dữ liệu có cùng chiều với dữ liệu huấn luyện ( X).

Trong ví dụ được đề cập, chúng tôi cung cấp cho máy tính một loạt các hàng X(mỗi hàng có 2 giá trị) và chúng tôi hiển thị cho nó các câu trả lời chính xác trong đó y. Khi chúng ta muốn predictsử dụng các giá trị mới, chương trình của chúng ta cũng mong đợi như vậy - một loạt các hàng. Ngay cả khi chúng ta muốn làm điều đó chỉ với một hàng (với hai giá trị), hàng đó phải là một phần của một mảng khác.


31
nhưng tại sao điều đó lại hoạt động? Tôi không hiểu vấn đề là gì.
Charlie Parker

2
làm cách nào để đạt được điều này cho các khung dữ liệu lớn hơn? (động)
Nhâm nhi

4
Tại sao nó phải là một mảng 2D? Lý do đằng sau điều này là gì?
problemmofficer

18

Sự cố đang xảy ra khi bạn chạy dự đoán trên mảng [0.58,0.76]. Khắc phục sự cố bằng cách định hình lại nó trước khi bạn gọi 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

7

Tôi sử dụng cách tiếp cận dưới đây.

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

reg.predict([[2136]])

5

Tôi gặp phải vấn đề tương tự ngoại trừ kiểu dữ liệu của trường hợp tôi muốn dự đoán là một panda.Seriesđối tượng.

Tôi chỉ cần dự đoán một trường hợp đầu vào. Tôi lấy nó từ một phần dữ liệu của mình.

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

Trong trường hợp này, bạn sẽ cần chuyển đổi nó thành mảng 1-D và sau đó là reshapenó.

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

Từ các tài liệu , valuessẽ chuyển đổi Series thành một mảng không rõ ràng.


2

Tôi phải đối mặt với cùng một vấn đề. Bạn chỉ cần biến nó thành một mảng và hơn nữa bạn phải đặt dấu ngoặc vuông kép để biến nó thành một phần tử duy nhất của mảng 2D vì dấu ngoặc nhọn đầu tiên khởi tạo mảng và dấu ngoặc thứ hai làm cho nó trở thành một phần tử của mảng đó.

Vì vậy, chỉ cần thay thế câu lệnh cuối cùng bằng:

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

1

Tôi đã gặp phải vấn đề tương tự trước đó nhưng bằng cách nào đó tôi đã tìm ra giải pháp, Bạn có thể thử reg.predict([[3300]]).

API được sử dụng để cho phép giá trị vô hướng nhưng bây giờ bạn cần cung cấp một mảng 2D.


1

Chỉ cần chèn đối số giữa dấu ngoặc vuông kép:

regressor.p Dự đoán ([[giá trị]])

điều đó đã làm việc cho tôi


0

Với một tính năng, danh sách Dataframe của tôi sẽ chuyển đổi thành Series. Tôi đã phải chuyển đổi nó trở lại danh sách Dataframe và nó hoạt động.

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

-1

Ma trận X và Y của Biến độc lập và Biến phụ thuộc tương ứng với DataFrame từ Kiểu int64 để nó được chuyển đổi từ mảng 1D sang mảng 2D .. tức là X = pd.DataFrame (X) và Y = pd.dataFrame (Y) trong đó pd thuộc lớp gấu trúc trong trăn. và do đó tính năng mở rộng lần lượt không dẫn đến bất kỳ lỗi nào!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.