Một vectơ cột y đã được chuyển khi một mảng 1d được mong đợi


117

Tôi cần phải phù hợp với RandomForestRegressortừ sklearn.ensemble.

forest = ensemble.RandomForestRegressor(**RF_tuned_parameters)
model = forest.fit(train_fold, train_y)
yhat = model.predict(test_fold)

Mã này luôn hoạt động cho đến khi tôi thực hiện một số xử lý trước dữ liệu ( train_y). Thông báo lỗi cho biết:

DataConversionWarning: Một vectơ cột y được chuyển khi một mảng 1d được mong đợi. Vui lòng thay đổi hình dạng của y thành (n_samples,), ví dụ như sử dụng ravel ().

model = Forest.fit (train_fold, train_y)

Trước đây train_ylà một Chuỗi, bây giờ là mảng numpy (nó là một vectơ cột). Nếu tôi áp dụng train_y.ravel(), thì nó sẽ trở thành một vector hàng và không có thông báo lỗi nào xuất hiện, qua bước dự đoán mất rất nhiều thời gian (thực sự là nó không bao giờ kết thúc ...).

Trong tài liệu của RandomForestRegressortôi thấy rằng train_ynên được định nghĩa là y : array-like, shape = [n_samples] or [n_samples, n_outputs] Bất kỳ ý tưởng làm thế nào để giải quyết vấn đề này?


là gì train_fold.shapevà là train_y.shapegì?
Alexander

@Alexander: train_fold: tuple (749904,24) ... train: y.ravel (): tuple (749904,)
Klausos Klausos

Nhìn ổn. Bạn đã thử đào tạo 100 hàng dữ liệu để đảm bảo nó hoạt động bình thường (vì bạn đã nói rằng nó không bao giờ hoàn thành)? Ngoài ra, bạn đã kiểm tra nội dung train_ydữ liệu của mình để đảm bảo việc xử lý trước không làm hỏng nó chưa?
Alexander

Hãy in RF_tuned_parameterscho chúng tôi.
Imanol Luengo

@imaluengo: {'n_estimators': 40, 'max_features': 0.8, 'n_jobs': 2, 'verbose': True, 'min_samples_split': 6, 'random_state': 123}
Klausos Klausos 8/12/15

Câu trả lời:


189

Thay đổi dòng này:

model = forest.fit(train_fold, train_y)

đến:

model = forest.fit(train_fold, train_y.values.ravel())

Biên tập:

.valuessẽ cung cấp các giá trị trong một mảng. (hình dạng: (n, 1)

.ravel sẽ chuyển đổi hình dạng mảng đó thành (n,)


33
Ai đó có thể giải thích những gì nó thực sự thay đổi.
Rahul Bali

2
AttributeError: Đối tượng 'numpy.ndarray' không có thuộc tính 'giá trị'
john ktejik

12
Nếu bạn có numpy.ndarray, hãy sử dụng train_y.ravel () để thay thế.
Charity Leschinski

13
@RahulParashar là gì ravel(): khi bạn có y.shape == (10, 1), sử dụng y.ravel().shape == (10, ). Nói cách khác ... nó làm phẳng một mảng.
PascalVKooten

Đây thậm chí là một cảnh báo hữu ích?
alex

18

Tôi cũng gặp phải tình huống này khi tôi đang cố gắng đào tạo một bộ phân loại KNN . nhưng có vẻ như cảnh báo đã biến mất sau khi tôi thay đổi:
knn.fit(X_train,y_train)
thành
knn.fit(X_train, np.ravel(y_train,order='C'))

Trước dòng này tôi đã sử dụng import numpy as np.


Khi sử dụng cách .ravel()tiếp cận, vectơ cột của tôi đã được chuyển đổi thành một vectơ hàng chứ không phải một mảng, nhưng bản sửa lỗi này đã hiệu quả với tôi.
kabdulla

12

Tôi đã từng gặp vấn đề tương tự. Vấn đề là các nhãn ở định dạng cột trong khi nó mong đợi nó ở một hàng. sử dụngnp.ravel()

knn.score(training_set, np.ravel(training_labels))

Hy vọng điều này giải quyết nó.


1
Ý bạn là np.ravel()?
Pramesh Bajracharya

10

sử dụng mã dưới đây:

model = forest.fit(train_fold, train_y.ravel())

nếu bạn vẫn nhận được một cái tát do lỗi giống như bên dưới?

Unknown label type: %r" % y

sử dụng mã này:

y = train_y.ravel()
train_y = np.array(y).astype(int)
model = forest.fit(train_fold, train_y)

3

Một cách khác để làm điều này là sử dụng ravel

model = forest.fit(train_fold, train_y.values.reshape(-1,))

Tôi chỉ muốn nói thêm rằng điều này sẽ hoạt động với Pandas Series, nhưng không phải Pandas DataFrames.
Sal Alturaigi

2

Với neuraxle , bạn có thể dễ dàng giải quyết điều này:

p = Pipeline([
   # expected outputs shape: (n, 1)
   OutputTransformerWrapper(NumpyRavel()), 
   # expected outputs shape: (n, )
   RandomForestRegressor(**RF_tuned_parameters)
])

p, outputs = p.fit_transform(data_inputs, expected_outputs)

Neuraxle là một khung giống sklearn để điều chỉnh siêu thông số và AutoML trong các dự án học sâu!


1
format_train_y=[]
for n in train_y:
    format_train_y.append(n[0])

2
Mặc dù mã này có thể giải quyết câu hỏi, bao gồm giải thích về cách thức và lý do tại sao điều này giải quyết vấn đề sẽ thực sự giúp cải thiện chất lượng bài đăng của bạn và có thể dẫn đến nhiều phiếu bầu hơn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai, không chỉ người hỏi bây giờ. Vui lòng chỉnh sửa câu trả lời của bạn để thêm giải thích và đưa ra dấu hiệu về những giới hạn và giả định nào được áp dụng.
Dharman

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.