คอลัมน์เวกเตอร์ y ถูกส่งผ่านเมื่อคาดว่าอาร์เรย์ 1d


119

ฉันต้องพอดีRandomForestRegressorจากsklearn.ensemble.

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

รหัสนี้ใช้งานได้ตลอดจนกระทั่งฉันทำการประมวลผลข้อมูลล่วงหน้า ( train_y) ข้อความแสดงข้อผิดพลาดระบุว่า:

DataConversionWarning: คอลัมน์เวกเตอร์ y ถูกส่งผ่านเมื่อคาดว่าอาร์เรย์ 1d โปรดเปลี่ยนรูปร่างของ y เป็น (n_samples,) เช่นใช้ ravel ()

รุ่น = forest.fit (train_fold, train_y)

ก่อนหน้าtrain_yนี้เป็นซีรี่ส์ตอนนี้เป็นอาร์เรย์จำนวนนับ (เป็นคอลัมน์เวกเตอร์) ถ้าฉันใช้train_y.ravel()มันจะกลายเป็นเวกเตอร์แถวและไม่มีข้อความแสดงข้อผิดพลาดปรากฏขึ้นผ่านขั้นตอนการคาดคะเนใช้เวลานานมาก (จริง ๆ แล้วมันจะไม่เสร็จสิ้น ... )

ในเอกสารของRandomForestRegressorฉันพบว่าtrain_yควรกำหนดเป็นy : array-like, shape = [n_samples] or [n_samples, n_outputs] ความคิดใด ๆ ในการแก้ปัญหานี้?


คืออะไรtrain_fold.shapeและtrain_y.shape?
Alexander

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

ดูดี คุณได้ลองฝึกข้อมูล 100 แถวเพื่อให้แน่ใจว่าทำงานได้อย่างถูกต้อง (เนื่องจากคุณบอกว่ามันยังไม่เสร็จ) หรือไม่? นอกจากนี้คุณได้ตรวจสอบเนื้อหาของtrain_yข้อมูลของคุณแล้วหรือยังว่าการประมวลผลล่วงหน้าไม่เสียหาย
Alexander

RF_tuned_parametersกรุณาพิมพ์ให้เรา
Imanol Luengo

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

คำตอบ:


192

เปลี่ยนบรรทัดนี้:

model = forest.fit(train_fold, train_y)

ถึง:

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

แก้ไข:

.valuesจะให้ค่าในอาร์เรย์ (รูปร่าง: (n, 1)

.ravel จะแปลงรูปร่างอาร์เรย์นั้นเป็น (n,)


33
อาจมีคนอธิบายสิ่งที่เปลี่ยนแปลงได้จริง
Rahul Bali

2
AttributeError: วัตถุ 'numpy.ndarray' ไม่มีแอตทริบิวต์ 'ค่า'
john ktejik

12
หากคุณมี numpy.ndarray ให้ใช้ train_y.ravel () แทน
Charity Leschinski

13
@RahulParashar ravel()คืออะไร: เมื่อคุณมีy.shape == (10, 1)ใช้y.ravel().shape == (10, ). กล่าวได้ว่า ... มันทำให้อาร์เรย์แบนราบ
PascalVKooten

นี่เป็นคำเตือนที่มีประโยชน์หรือไม่?
alex

18

ฉันยังพบสถานการณ์นี้เมื่อฉันพยายามฝึกตัวจำแนกKNN แต่ดูเหมือนว่าคำเตือนจะหายไปหลังจากที่ฉันเปลี่ยน:
knn.fit(X_train,y_train)
เป็น
knn.fit(X_train, np.ravel(y_train,order='C'))

import numpy as npข้างหน้าของเส้นนี้ผมใช้


เมื่อใช้.ravel()แนวทางเวกเตอร์คอลัมน์ของฉันคือแปลงเป็นเวกเตอร์แถวแทนที่จะเป็นอาร์เรย์ แต่การแก้ไขนี้ใช้ได้ผลสำหรับฉัน
kabdulla

12

ผมมีปัญหาเหมือนกัน. ปัญหาคือป้ายอยู่ในรูปแบบคอลัมน์ในขณะที่คาดว่าจะอยู่ในแถว ใช้np.ravel()

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

หวังว่านี่จะช่วยแก้ปัญหาได้


1
คุณหมายถึงnp.ravel()?
Pramesh Bajracharya

10

ใช้รหัสด้านล่าง:

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

หากคุณยังคงได้รับการตบด้วยข้อผิดพลาดเหมือนด้านล่าง?

Unknown label type: %r" % y

ใช้รหัสนี้:

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

3

อีกวิธีหนึ่งในการทำเช่นนี้คือการใช้ ravel

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

ฉันแค่อยากจะเพิ่มว่าสิ่งนี้จะใช้ได้กับซีรี่ส์ Pandas แต่ไม่ใช่ Pandas DataFrames
Sal Alturaigi

2

ด้วยneuraxleคุณสามารถแก้ปัญหานี้ได้อย่างง่ายดาย:

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 เป็นเฟรมเวิร์กแบบ sklearn สำหรับการปรับแต่งไฮเปอร์พารามิเตอร์และ AutoML ในโครงการการเรียนรู้เชิงลึก!


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

2
แม้ว่ารหัสนี้อาจช่วยแก้ปัญหาได้รวมถึงคำอธิบายว่าทำไมจึงแก้ปัญหานี้ได้จะช่วยปรับปรุงคุณภาพของโพสต์ของคุณได้อย่างแท้จริงและอาจส่งผลให้มีการโหวตเพิ่มขึ้น จำไว้ว่าคุณกำลังตอบคำถามสำหรับผู้อ่านในอนาคตไม่ใช่แค่คนที่ถามตอนนี้ โปรดแก้ไขคำตอบของคุณเพื่อเพิ่มคำอธิบายและระบุข้อ จำกัด และสมมติฐานที่ใช้
Dharman

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.