sklearn: พบอาร์เรย์ที่มีจำนวนตัวอย่างไม่สอดคล้องกันเมื่อเรียก LinearRegression.fit ()


102

แค่พยายามทำการถดถอยเชิงเส้นอย่างง่าย แต่ฉันงงงันกับข้อผิดพลาดนี้สำหรับ:

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

ซึ่งผลิต:

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

การเลือกเหล่านี้ต้องมีขนาดเท่ากันและควรเป็นอาร์เรย์จำนวนนับดังนั้นสิ่งที่ฉันขาดหายไป?

คำตอบ:


116

ดูเหมือนว่า sklearn ต้องการรูปร่างข้อมูลของ (หมายเลขแถวหมายเลขคอลัมน์) หากรูปร่างข้อมูลของคุณเป็น (หมายเลขแถว) เหมือน(999, )จะไม่ทำงาน เมื่อใช้numpy.reshape()คุณควรเปลี่ยนรูปร่างของอาร์เรย์เป็น(999, 1)เช่นใช้

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

ในกรณีของฉันมันใช้งานได้


6
รูปร่างข้อมูลของฉันคือ (10L,) ฉันจะแปลงเป็น (10L, 1) ได้อย่างไร เมื่อฉันใช้ data = data.reshape (len (data), 1) รูปร่างผลลัพธ์คือ (10L, 1L) ไม่ใช่ (10L, 1)
user3841581

@ user3841581 โปรดดูที่โพสต์นี้
George Liu

1
@Boern ขอบคุณสำหรับความคิดเห็น ฉันยังค้นพบว่า X_train ควรมีขนาด (N, 1) แต่ y_train ควรมีขนาด (N,) ไม่ใช่ (N, 1) มิฉะนั้นจะไม่ทำงานอย่างน้อยก็ไม่ใช่สำหรับฉัน
CrossEntropy

data.reshape (... ) อาจแสดงคำเตือนการลดราคาหากข้อมูลเป็นวัตถุ Series ใช้ data.values.reshape (... )
NightFurry

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

24

ดูเหมือนว่าคุณกำลังใช้แพนด้าดาต้าเฟรม (จากชื่อ df2)

คุณสามารถทำสิ่งต่อไปนี้ได้:

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

หมายเหตุ: ฉันได้ลบ "ค่า" ออกแล้วเนื่องจากการแปลงชุดหมีแพนด้าเป็น numpy.ndarray และ numpy.ndarray ไม่มีแอตทริบิวต์ to_frame ()


11

เห็นในหลักสูตร Udacity deep learning foundation:

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

2
ขอบคุณ! นี่เป็นวิธีที่ง่ายและเข้าใจง่ายที่สุด!
Juan

ที่จริงแล้วพารามิเตอร์ Y คาดว่าจะเป็นรูปร่าง (length,) ขอบคุณ!
Michael_Zhang

5

ฉันคิดว่าอาร์กิวเมนต์ "X" ของ regr.fit ต้องเป็นเมทริกซ์ดังนั้นสิ่งต่อไปนี้ควรใช้งานได้

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

4

ฉันพบข้อผิดพลาดนี้เนื่องจากฉันแปลงข้อมูลเป็นnp.arrayไฟล์. ฉันแก้ไขปัญหาโดยการแปลงข้อมูลของฉันเป็นnp.matrixแทนแล้วทำการทรานสโพส

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

แก้ไข: regr.fit(np.transpose(np.matrix(x_list)), np.transpose(np.matrix(y_list)))


2
expects X(feature matrix)

ลองใส่คุณสมบัติของคุณในทูเพิลแบบนี้:

คุณสมบัติ = ['TV', 'Radio', 'Newspaper']
X = data [คุณสมบัติ]

1

ฉันประสบปัญหาที่คล้ายกัน ปัญหาในกรณีของฉันคือจำนวนแถวใน X ไม่เท่ากับจำนวนแถวใน y

กล่าวคือจำนวนรายการในคอลัมน์คุณลักษณะไม่เท่ากับจำนวนรายการในตัวแปรเป้าหมายเนื่องจากฉันได้ทิ้งแถวบางแถวจากคอลัมน์ freature


0

ในการวิเคราะห์อาร์เรย์สองอาร์เรย์ (array1 และ array2) จำเป็นต้องเป็นไปตามข้อกำหนดสองข้อต่อไปนี้:

1) ต้องเป็น numpy.ndarray

ตรวจสอบกับ

type(array1)
# and
type(array2)

หากไม่เป็นเช่นนั้นอย่างน้อยหนึ่งในนั้นก็ดำเนินการ

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

2) ขนาดต้องเป็นดังนี้:

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

N คือจำนวนรายการที่อยู่ในอาร์เรย์ เพื่อให้อาร์เรย์ 1 มีจำนวนแกนที่เหมาะสมให้ดำเนินการ:

array1 = array1[:, numpy.newaxis]

0

ดังที่ได้กล่าวไว้ข้างต้นอาร์กิวเมนต์ X ต้องเป็นเมทริกซ์หรืออาร์เรย์ตัวเลขที่มีมิติที่ทราบ ดังนั้นคุณอาจใช้สิ่งนี้:

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

ดังนั้นดาต้าเฟรมของคุณจะถูกแปลงเป็นอาร์เรย์ที่มีมิติข้อมูลที่ทราบและคุณไม่จำเป็นต้องจัดรูปแบบใหม่



-1

ระหว่างแยกทดสอบรถไฟคุณอาจทำผิดพลาด

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

รหัสด้านบนถูกต้อง

คุณอาจทำเช่นด้านล่างซึ่งผิด

x_train,y_train,x_test,y_test=sklearn.model_selection.train_test_split(X,Y,test_size)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.