ข้อผิดพลาด train_test_split (): พบตัวแปรอินพุตที่มีจำนวนตัวอย่างที่ไม่สอดคล้องกัน


21

ค่อนข้างใหม่สำหรับ Python แต่สร้างแบบจำลอง RF แรกของฉันขึ้นอยู่กับข้อมูลการจำแนกบางส่วน ฉันแปลงฉลากทั้งหมดให้เป็นข้อมูลตัวเลข int64 และโหลดลงใน X และ Y เป็นอาร์เรย์ที่มีจำนวนมาก แต่ฉันกดปุ่มข้อผิดพลาดเมื่อฉันพยายามฝึกนางแบบ

นี่คือลักษณะของอาร์เรย์ของฉัน:

>>> X = np.array([[df.tran_cityname, df.tran_signupos, df.tran_signupchannel, df.tran_vmake, df.tran_vmodel, df.tran_vyear]])

>>> Y = np.array(df['completed_trip_status'].values.tolist())

>>> X
array([[[   1,    1,    2,    3,    1,    1,    1,    1,    1,    3,    1,
            3,    1,    1,    1,    1,    2,    1,    3,    1,    3,    3,
            2,    3,    3,    1,    1,    1,    1],
        [   0,    5,    5,    1,    1,    1,    2,    2,    0,    2,    2,
            3,    1,    2,    5,    5,    2,    1,    2,    2,    2,    2,
            2,    4,    3,    5,    1,    0,    1],
        [   2,    2,    1,    3,    3,    3,    2,    3,    3,    2,    3,
            2,    3,    2,    2,    3,    2,    2,    1,    1,    2,    1,
            2,    2,    1,    2,    3,    1,    1],
        [   0,    0,    0,   42,   17,    8,   42,    0,    0,    0,   22,
            0,   22,    0,    0,   42,    0,    0,    0,    0,   11,    0,
            0,    0,    0,    0,   28,   17,   18],
        [   0,    0,    0,   70,  291,   88,  234,    0,    0,    0,  222,
            0,  222,    0,    0,  234,    0,    0,    0,    0,   89,    0,
            0,    0,    0,    0,   40,  291,  131],
        [   0,    0,    0, 2016, 2016, 2006, 2014,    0,    0,    0, 2015,
            0, 2015,    0,    0, 2015,    0,    0,    0,    0, 2015,    0,
            0,    0,    0,    0, 2016, 2016, 2010]]])

>>> Y
array(['NO', 'NO', 'NO', 'YES', 'NO', 'NO', 'YES', 'NO', 'NO', 'NO', 'NO',
       'NO', 'YES', 'NO', 'NO', 'YES', 'NO', 'NO', 'NO', 'NO', 'NO', 'NO',
       'NO', 'NO', 'NO', 'NO', 'NO', 'NO', 'NO'], 
      dtype='|S3')

>>> X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3)

Traceback (การโทรล่าสุดครั้งล่าสุด):

  File "<stdin>", line 1, in <module>
  File "/Library/Python/2.7/site-packages/sklearn/cross_validation.py", line

2039, ใน train_test_split arrays = ไฟล์ที่จัดทำดัชนีได้ (* อาร์เรย์) ไฟล์ "/Library/Python/2.7/site-packages/sklearn/utils/validation.py", บรรทัด 206, ในไฟล์ check_consistent_length (* ผลลัพธ์) ที่จัดทำดัชนีได้ 2.7 / site-packages / sklearn / utils / validation.py ", บรรทัด 181, ในตัวอย่าง check_consistent_length":% r "% [int (l) สำหรับความยาว l])

ValueError: Found input variables with inconsistent numbers of samples: [1, 29]

ในอนาคตโปรดโพสต์เขียนโปรแกรมคำถามเพื่อStackOverflow คำถามและคำตอบเกี่ยวกับวิทยาศาสตร์ข้อมูลไม่ใช่การเขียนโปรแกรม
Ricardo Cruz

คำตอบ:


15

คุณกำลังทำงานเป็นข้อผิดพลาดว่าเป็นเพราะคุณXและYไม่ได้มีความยาวเท่ากัน (ซึ่งเป็นสิ่งที่ต้องใช้)train_test_split คือ X.shape[0] != Y.shape[0]ระบุรหัสปัจจุบันของคุณ:

>>> X.shape
(1, 6, 29)
>>> Y.shape
(29,)

ในการแก้ไขข้อผิดพลาดนี้:

  1. ลบรายการพิเศษจากภายในnp.array()เมื่อกำหนดหรือลบมิติพิเศษหลังจากที่มีคำสั่งดังต่อไปนี้:X X = X.reshape(X.shape[1:])ตอนนี้รูปร่างของXจะเป็น (6, 29)
  2. ย้ายXโดยการทำงานX = X.transpose()เพื่อให้ได้จำนวนที่เท่ากันของกลุ่มตัวอย่างในและX Yตอนนี้รูปร่างของXจะ (29, 6) และรูปร่างของYจะ (29,)

1
น่าอัศจรรย์สำหรับฉัน! ขอบคุณ Tuomastik! ฉันซาบซึ้งกับคำแนะนำจริงๆ :)
josh_gray

2

train_test_split ไม่ได้คาดหวังว่าทั้งคู่XและYจะเป็นรายการที่มีความยาวเท่ากันหรือไม่ X ของคุณมีความยาว 6 และ Y มีความยาว 29. ลองเปลี่ยนเป็นดาต้าดาต้าเฟรม (กับขนาด 29x6) แล้วลองใหม่อีกครั้ง?

รับข้อมูลของคุณดูเหมือนว่าคุณมีคุณสมบัติ 6 ประการ ในกรณีนี้ลองแปลงXเป็น 29 แถวและ 6 คอลัมน์ แล้วผ่าน dataframe train_test_splitว่า คุณสามารถแปลงรายการของคุณเพื่อ dataframe pd.DataFrame.from_recordsใช้


ขอบคุณสำหรับความช่วยเหลือ Sal! คุณพูดถูกฉันต้องแปลงมันให้มีความยาวเท่ากัน X.shape ของฉันคือ (1, 6, 29) และ Y.shape คือ (29,) ฉันเพิ่งมีการก่อร่างพวกเขาและมันทั้งหมดทำงานที่ดีสำหรับฉัน :)
josh_gray
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.