sklearn: Đã tìm thấy các mảng có số lượng mẫu không nhất quán khi gọi LinearRegression.fit ()


102

Tôi chỉ cố gắng thực hiện một hồi quy tuyến tính đơn giản nhưng tôi bị bối rối bởi lỗi này vì:

regr = LinearRegression()
regr.fit(df2.iloc[1:1000, 5].values, df2.iloc[1:1000, 2].values)

sản xuất:

ValueError: Found arrays with inconsistent numbers of samples: [  1 999]

Các vùng chọn này phải có cùng kích thước và chúng phải là các mảng không có hạt, vậy tôi còn thiếu gì?

Câu trả lời:


116

Có vẻ như sklearn yêu cầu hình dạng dữ liệu của (số hàng, số cột). Nếu hình dạng dữ liệu của bạn là (số hàng) (999, ), nó không hoạt động. Bằng cách sử dụng numpy.reshape(), bạn nên thay đổi hình dạng của mảng thành (999, 1), ví dụ: sử dụng

data=data.reshape((999,1))

Trong trường hợp của tôi, nó hoạt động với điều đó.


6
hình dạng dữ liệu của tôi là (10L,), làm cách nào để chuyển đổi nó thành (10L, 1). Khi tôi sử dụng data = data.reshape (LEN (dữ liệu), 1), hình dạng kết quả là (10L, 1L) không (10L, 1)
user3841581

@ user3841581 vui lòng tham khảo bài đăng này .
George Liu

1
@Boern Cảm ơn bạn đã nhận xét. Tôi cũng phát hiện ra rằng X_train phải có kích thước (N, 1) nhưng y_train phải có kích thước (N,) chứ không phải (N, 1), nếu không nó không hoạt động, ít nhất là không đối với tôi.
CrossEntropy

data.reshape (...) có thể hiển thị cảnh báo mô tả nếu dữ liệu là đối tượng Dòng. Sử dụng data.values.reshape (...)
NightFurry

data = data.reshape (-1,1)
Itachi

24

Có vẻ như bạn đang sử dụng khung dữ liệu gấu trúc (từ tên df2).

Bạn cũng có thể làm như sau:

regr = LinearRegression()
regr.fit(df2.iloc[1:1000, 5].to_frame(), df2.iloc[1:1000, 2].to_frame())

LƯU Ý: Tôi đã xóa "giá trị" vì điều đó chuyển đổi Sê-ri gấu trúc thành numpy.ndarray và numpy.ndarray không có thuộc tính to_frame ().


11

Đã xem trong khóa học nền tảng học sâu Udacity:

df = pd.read_csv('my.csv')
...
regr = LinearRegression()
regr.fit(df[['column x']], df[['column y']])

2
Cảm ơn! Điều này thực sự là đơn giản và dễ hiểu nhất!
Juan A. Navarro

Trên thực tế, tham số Y được mong đợi dưới dạng (chiều dài,) hình dạng. Cảm ơn!
Michael_Zhang

5

Tôi nghĩ rằng đối số "X" của regr.fit cần phải là một ma trận, vì vậy điều sau sẽ hoạt động.

regr = LinearRegression()
regr.fit(df2.iloc[1:1000, [5]].values, df2.iloc[1:1000, 2].values)

4

Tôi gặp phải lỗi này vì tôi đã chuyển đổi dữ liệu của mình thành np.array. Tôi đã khắc phục sự cố bằng cách chuyển đổi dữ liệu của mình thành dữ liệu np.matrixthay thế và thực hiện chuyển vị.

ValueError: regr.fit(np.array(x_list), np.array(y_list))

Chính xác: regr.fit(np.transpose(np.matrix(x_list)), np.transpose(np.matrix(y_list)))


2
expects X(feature matrix)

Cố gắng đặt các tính năng của bạn trong một bộ như thế này:

tính năng = ['TV', 'Đài phát thanh', 'Báo chí']
X = dữ liệu [tính năng]

1

Tôi phải đối mặt với một vấn đề tương tự. Vấn đề trong trường hợp của tôi là, Số hàng trong X không bằng số hàng trong y.

tức là số lượng mục nhập trong các cột tính năng không bằng số lượng đường dẫn trong biến mục tiêu vì tôi đã bỏ một số hàng từ cột freature.


0

Để phân tích hai mảng (array1 và array2), chúng cần đáp ứng hai yêu cầu sau:

1) Họ cần phải là một numpy.ndarray

Kiểm tra với

type(array1)
# and
type(array2)

Nếu đó không phải là trường hợp, ít nhất một trong số họ thực hiện

array1 = numpy.ndarray(array1)
# or
array2 = numpy.ndarray(array2)

2) Kích thước cần phải như sau:

array1.shape #shall give (N, 1)
array2.shape #shall give (N,)

N là số mục có trong mảng. Để cung cấp cho array1 số trục phù hợp, hãy thực hiện:

array1 = array1[:, numpy.newaxis]

0

Như đã đề cập ở trên, đối số X phải là một ma trận hoặc một mảng numpy với các kích thước đã biết. Vì vậy, bạn có thể sử dụng cái này:

df2.iloc[1:1000, 5:some_last_index].values

Vì vậy, khung dữ liệu của bạn sẽ được chuyển đổi thành một mảng với các kích thước đã biết và bạn sẽ không cần phải định hình lại nó


-1

trong quá trình phân luồng thử nghiệm tàu, bạn có thể đã mắc lỗi

x_train,x_test,y_train,y_test=sklearn.model_selection.train_test_split(X,Y,test_size)

Đoạn mã trên là đúng

Bạn có thể đã làm như dưới đây là sai

x_train,y_train,x_test,y_test=sklearn.model_selection.train_test_split(X,Y,test_size)
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.