การคาดการณ์ราคาบ้านในสหรัฐฯ

Kar Khad Karn Rakha Ban Ni Shrath



การสร้างบ้านถือเป็นปัจจัยหนึ่งที่ท้าทายในชีวิตของเรา ก่อนการก่อสร้างสามารถประเมินราคาบ้านของคุณโดยพิจารณาจากราคาบ้านหลังก่อนได้ ปัจจัยที่มีผลกระทบสำคัญต่อราคาบ้าน ได้แก่ จำนวนห้องทั้งหมด (เตียง ห้องน้ำ ฯลฯ) และพื้นที่ของที่ดิน โดยเราสามารถประมาณงบประมาณที่จำเป็นในการก่อสร้างบ้านได้

ในคู่มือนี้ เราจะดูวิธีทำนายราคาบ้านในสหรัฐฯ โดยใช้ Machine Learning ผ่าน Python ขั้นแรก เราจะหารือเกี่ยวกับชุดข้อมูลที่เราใช้ จากนั้นจึงประมวลผลข้อมูลล่วงหน้า หลังจากนั้น เราจะแสดงภาพคุณลักษณะที่มีอยู่ในชุดข้อมูล และใช้อัลกอริทึม Machine Learning ที่แตกต่างกันกับชุดข้อมูลการฝึกอบรม (ซีแอตเทิล วอชิงตัน สิงหาคม 2022 – ธันวาคม 2022) สุดท้ายนี้ เราจะจบคู่มือนี้ด้วยการทำนายราคาบ้านบางหลังที่มีอยู่ในชุดข้อมูลทดสอบ ก่อนที่จะดำเนินโครงการนี้ เราต้องเข้าใจคำศัพท์เฉพาะของ Machine Learning ที่ใช้ในโครงการนี้ก่อน







การถดถอย

ใน Machine Learning หากคุณกำลังทำงานกับข้อมูลตัวเลข คุณต้องเข้าใจ Regression การถดถอยเป็นเทคนิคการเรียนรู้แบบมีผู้สอนในการเรียนรู้ของเครื่องซึ่งใช้เพื่อทำความเข้าใจความสัมพันธ์ระหว่างคุณลักษณะอิสระและคุณลักษณะที่ต้องพึ่งพา (ป้ายกำกับคลาส/ เป้าหมาย) เครื่องทำนายราคาบ้านโดยการเรียนรู้แต่ละบันทึกที่มีอยู่ในชุดข้อมูล ดังนั้นจึงเป็นการเรียนรู้แบบมีผู้สอน



ตัวอย่างเช่น ในสถานการณ์ของเรา คุณลักษณะอิสระคือจำนวนเตียง จำนวนห้องน้ำ ขนาดที่ดิน รหัสไปรษณีย์ ฯลฯ จากข้อมูลเหล่านี้ เราสามารถคาดการณ์ราคาบ้านของเราได้ ดังนั้น สิ่งเหล่านี้จึงเป็นคุณลักษณะอิสระที่ไม่ขึ้นอยู่กับสิ่งใดๆ ราคาคือแอตทริบิวต์เป้าหมายหรือป้ายกำกับคลาสซึ่งขึ้นอยู่กับคุณลักษณะเหล่านี้



1. การถดถอยเชิงเส้น

อัลกอริธึมการถดถอยเชิงเส้นแสดงความสัมพันธ์เชิงเส้นระหว่างตัวแปรแอททริบิวต์อิสระ (Y) และแอททริบิวต์อิสระ (X) ในทางคณิตศาสตร์เราสามารถประเมินได้ดังนี้:





และ = aX+ข

ที่นี่ 'a' และ 'b' เป็นค่าสัมประสิทธิ์เชิงเส้น

ใน Python นั้น LinearRegression() มีอยู่ในโมดูล “sklearn.linear_model” เราจะดูวิธีการระบุสิ่งนี้ในขณะที่ดำเนินโครงการ ต่อไปนี้เป็นรุ่นที่มีพารามิเตอร์:



2. แผนผังการตัดสินใจ

โดยพื้นฐานแล้ว แผนผังการตัดสินใจคือการนำเสนอแบบกราฟิกสำหรับการแก้ปัญหาที่เป็นไปได้ทั้งหมดตามเงื่อนไขที่กำหนดโดยใช้โหนด โหนดการตัดสินใจถูกใช้ในการตัดสินใจ และโหนดใบหมายถึงผลลัพธ์ของการตัดสินใจเฉพาะ เราสามารถทำนายราคาบ้านของเราได้ด้วย Decision Tree Regressor

ใน Python DecisionTreeRegressor มีอยู่ในโมดูล “sklearn.tree” เราจะดูวิธีการระบุสิ่งนี้ในขณะที่ดำเนินโครงการ ต่อไปนี้เป็นรุ่นที่มีพารามิเตอร์:

3. ป่าสุ่ม

Random Forest มีฟังก์ชันการทำงานเดียวกันกับแผนผังการตัดสินใจ แต่ต้องใช้ฟอเรสต์ (ชุดของแผนผังการตัดสินใจ) และรวม (ค่าเฉลี่ย) ผลลัพธ์ทั้งหมดของแผนผังการตัดสินใจ ตัวอย่างเช่น ขนาดของฟอเรสต์สุ่มคือ 3 ดังนั้น ภายใน แผนผังการตัดสินใจสามแผนผังจะถูกสร้างขึ้น และผลลัพธ์ของราคาบ้านของแผนผังการตัดสินใจอันแรกคือ 20000 ผลลัพธ์ของราคาบ้านของแผนผังการตัดสินใจลำดับที่สองคือ 20000 และผลลัพธ์ของราคาบ้านของ แผนผังการตัดสินใจสุดท้ายคือ 10,000 16,666.666 คือผลลัพธ์สุดท้าย ((20000+20000+10000)/3)

ใน Python RandomForestRegressor มีอยู่ในโมดูล “sklearn.ensemble” ต่อไปนี้เป็นรุ่นที่มีพารามิเตอร์ เราสามารถระบุจำนวนต้นไม้ในพารามิเตอร์ “n_estimators” โดยค่าเริ่มต้นจะเป็น 100

การนำไปปฏิบัติ

ดูขั้นตอนที่เกี่ยวข้องในการทำนายราคาสภาผู้แทนราษฎรในสหรัฐฯ อย่างรวดเร็ว เราพิจารณาชุดข้อมูลhouses_train (ไฟล์ CSV) ที่มีบันทึกปี 2016 (ใช้เพื่อฝึกโมเดล Machine Learning) จากนั้น เราจะคาดการณ์บันทึกราคาบ้าน (505) ที่มีอยู่ในไฟล์ house_test

1. การโหลดชุดข้อมูล Train และ Test

Pandas เป็นโมดูลที่มีอยู่ใน Python ที่ใช้สำหรับการวิเคราะห์ข้อมูล เราใช้โมดูลนี้เพื่อโหลดชุดข้อมูลลงในสภาพแวดล้อม Python ในที่นี้เราใช้. บริษัท กูเกิล เป็นสภาพแวดล้อมรหัส นี้สามารถใช้ได้ฟรี จำเป็นต้องมีบัญชี Google เท่านั้น

ขั้นแรก เราต้องโหลดไฟล์จากพีซีในเครื่องของเราไปยัง Colab Env ดาวน์โหลดชุดข้อมูลจาก ที่นี่ .

# อัปโหลดไฟล์ house_train.csv และ house_test.csv ไปยัง Google Colab ของคุณ

#ทีละคน.

จาก Google. และคณะ นำเข้า ไฟล์

ไฟล์. ที่อัพโหลด ( )

read_csv() เป็นฟังก์ชันที่ใช้ในการโหลดข้อมูล CSV ลงในตัวแปร ใช้ชื่อไฟล์เป็นพารามิเตอร์

นำเข้า หมีแพนด้า

# โหลดhouses_train.csvลงในตัวแปร train_data

รถไฟ_ข้อมูล = หมีแพนด้า read_csv ( 'houses_train.csv' )

# โหลด house_test.csv ลงในตัวแปร test_data

ทดสอบ_ข้อมูล = หมีแพนด้า read_csv ( 'house_test.csv' )

# เก็บ test_data ไว้ในตัวแปร test_data1

test_data1 = ทดสอบ_ข้อมูล

มาดูจำนวนคอลัมน์และระเบียนที่ไม่ใช่ค่าว่างในแต่ละคอลัมน์กัน Pandas.DataFrame.info() ใช้เพื่อรับข้อมูลนี้

พิมพ์ ( รถไฟ_ข้อมูล ข้อมูล ( ) )

พิมพ์ ( test_data1. ข้อมูล ( ) )

เอาท์พุท:

2. การประมวลผลข้อมูลล่วงหน้า

ในชุดข้อมูลทั้งสอง คอลัมน์ 'lot_size' จะเก็บค่าเป็น sqft และเอเคอร์ (คุณจะพบความแปรปรวนโดยการดูแถวในคอลัมน์ 'lot_size_unit's') แต่รูปแบบควรเป็นตารางฟุต ดังนั้น เราจำเป็นต้องแปลงค่าในคอลัมน์ 'lot_size' จากเอเคอร์เป็นตารางฟุต ในทำนองเดียวกัน จะต้องดำเนินการนี้สำหรับ “test_data1”

DataFrame.loc[] ถูกใช้ที่นี่เพื่อค้นหา “lot_size_units” ด้วย “acre” และคูณค่าที่มีอยู่ใน “lot_size” ด้วย 43560

# แปลงค่า lot_size เอเคอร์เป็นตารางฟุตใน train_data

รถไฟ_ข้อมูล สถานที่ [ ( รถไฟ_ข้อมูล [ 'lot_size_units' ] == 'เอเคอร์' ) , 'lot_size' ] = รถไฟ_ข้อมูล [ 'lot_size' ] * 43560

# แปลงค่า lot_size เอเคอร์เป็นตารางฟุตใน test_data1

test_data1. สถานที่ [ ( test_data1 [ 'lot_size_units' ] == 'เอเคอร์' ) , 'lot_size' ] = test_data1 [ 'lot_size' ] * 43560

พิมพ์ ( รถไฟ_ข้อมูล ศีรษะ ( ) )

พิมพ์ ( test_data1. ศีรษะ ( ) )

เอาท์พุท:

ตอนนี้คุณจะเห็นว่าค่าทั้งหมดในคอลัมน์ 'lot_size' เป็นค่า sqft

คุณเห็นค่าที่ขาดหายไปในคอลัมน์นี้ มาแทนที่ค่า NaN ที่มีอยู่ในคอลัมน์ด้วยค่าเฉลี่ยของคอลัมน์เดียวกันในชุดข้อมูลทั้งสองชุด

DataFrame['column_name'].fillna() ใช้เพื่อเติมค่าที่หายไปด้วยค่าเฉลี่ยโดยใช้ฟังก์ชันmean() DataFrame['column_name'].mean() ถูกส่งเป็นพารามิเตอร์ไปยังฟังก์ชัน finna() มาแสดงค่าเฉลี่ยและดูการนับกันตอนนี้:

# เติมค่าที่หายไปในคอลัมน์ lot_size ด้วย Mean ของค่าที่มีอยู่

รถไฟ_ข้อมูล [ 'lot_size' ] = รถไฟ_ข้อมูล [ 'lot_size' ] . รู้สึก ( รถไฟ_ข้อมูล [ 'lot_size' ] . หมายถึง ( ) )

# ค่าเฉลี่ยการแสดงผล

พิมพ์ ( 'ค่าเฉลี่ยข้อมูลรถไฟ:' , รถไฟ_ข้อมูล [ 'lot_size' ] . หมายถึง ( ) )

พิมพ์ ( เท่านั้น ( รถไฟ_ข้อมูล [ 'lot_size' ] ) )

# เติมค่าที่หายไปในคอลัมน์ lot_size ด้วย Mean ของค่าที่มีอยู่

test_data1 [ 'lot_size' ] = test_data1 [ 'lot_size' ] . รู้สึก ( test_data1 [ 'lot_size' ] . หมายถึง ( ) )

# ค่าเฉลี่ยการแสดงผล

พิมพ์ ( 'ค่าเฉลี่ยของข้อมูลทดสอบ:' , test_data1 [ 'lot_size' ] . หมายถึง ( ) )

พิมพ์ ( เท่านั้น ( test_data1 [ 'lot_size' ] ) )

เอาท์พุท:

ค่าที่หายไปซึ่งอยู่ในชุดข้อมูลรถไฟของคอลัมน์ 'lot_size' จะถูกแทนที่ด้วยค่าเฉลี่ยของ 18789.95194 และค่าที่หายไปซึ่งอยู่ในชุดข้อมูลการทดสอบคอลัมน์ 'lot_size' จะถูกแทนที่ด้วยค่าเฉลี่ยของ 8961.0

3. การทำความสะอาดข้อมูล

ขณะฝึกโมเดล มีคุณลักษณะที่ไม่จำเป็นบางอย่างซึ่งไม่จำเป็นในการทำนายผลลัพธ์ ในกรณีของเรา มีแอตทริบิวต์สามรายการ ได้แก่ 'lot_size_units', 'zip_code' และ 'size_units' ที่จะลบออกจากชุดข้อมูลทั้งสอง pandas.DataFrame.drop() ใช้เพื่อลบคอลัมน์ทั้งสามนี้ออกจากชุดข้อมูลทั้งสอง

รถไฟ_ข้อมูล = รถไฟ_ข้อมูล หยด ( [ 'lot_size_units' , 'รหัสไปรษณีย์' , 'ขนาด_หน่วย' ] , แกน = 1 )

test_data1 = test_data1. หยด ( [ 'lot_size_units' , 'รหัสไปรษณีย์' , 'ขนาด_หน่วย' ] , แกน = 1 )

พิมพ์ ( รถไฟ_ข้อมูล ข้อมูล ( ) )

พิมพ์ ( test_data1. ข้อมูล ( ) )

เอาท์พุท:

ตอนนี้ชุดข้อมูลอยู่ในสภาพดี คอลัมน์ที่ไม่จำเป็นจะถูกลบออกและไม่มีค่าที่หายไป

4. การแสดงข้อมูล

มาสร้างฮิสโตแกรมสำหรับคอลัมน์ของข้อมูล Train กันดีกว่า ฟังก์ชัน pandas.DataFrame.hist() ใช้เพื่อสร้างฮิสโตแกรมสำหรับแอตทริบิวต์ทั้งหมด

รถไฟ_ข้อมูล ประวัติความเป็นมา ( ขนาดรูป = ( 4 , 9 ) )

เอาท์พุท:

ฮิสโตแกรมถูกสร้างขึ้นสำหรับคอลัมน์เตียง ห้องน้ำ ขนาด lot_size และราคาสำหรับข้อมูลรถไฟ

มาสร้างความสัมพันธ์สำหรับทุกสาขาด้วยความเคารพซึ่งกันและกัน โมดูล Plotly.express ใช้เพื่อพล็อตค่าที่สัมพันธ์กัน

นำเข้า พล็อต ด่วน

ถูกต้อง = รถไฟ_ข้อมูล ถูกต้อง ( )

#ลงจุดข้อมูลที่สัมพันธ์กัน

view_fig = พล็อต ด่วน . ฉันแสดง ( ถูกต้อง , text_auto = จริง )

# แสดง

view_fig. แสดง ( )

เอาท์พุท:

  1. เตียงมีความสัมพันธ์กับราคา 0.2935, -0.059 สัมพันธ์กับขนาดล็อต, 0.77 สัมพันธ์กับขนาด และ 0.65 สัมพันธ์กับอ่างอาบน้ำ
  2. ห้องอาบน้ำมีความสัมพันธ์กับราคา 0.3173 สัมพันธ์กับราคา -0.054 สัมพันธ์กับขนาดล็อต 0.667 สัมพันธ์กับห้องอาบน้ำ และ 0.771 สัมพันธ์กับเตียง
  3. ขนาดคือ 0.444 สัมพันธ์กับราคา -0.044 สัมพันธ์กับขนาดล็อต 0.667 สัมพันธ์กับขนาด และ 0.652 สัมพันธ์กับเตียง

5. การเตรียมแบบจำลอง

เราจำเป็นต้องกำหนดราคาเป็นเป้าหมายโดยลบออกจาก train_data ตรวจสอบให้แน่ใจว่าแอตทริบิวต์ที่มีอยู่ในข้อมูลการฝึกและการทดสอบควรเหมือนกันในระยะนี้

เป้า = รถไฟ_ข้อมูล [ 'ราคา' ]

รถไฟ_ข้อมูล = รถไฟ_ข้อมูล หยด ( [ 'ราคา' ] , แกน = 1 )

พิมพ์ ( รถไฟ_ข้อมูล ข้อมูล ( ) )

พิมพ์ ( test_data1. ข้อมูล ( ) )

เอาท์พุท:

ขณะนี้มีคุณลักษณะอิสระสี่ประการ (เตียง ห้องน้ำ ขนาด และขนาดล็อต) และราคาเป็นคุณลักษณะขึ้นอยู่กับคุณลักษณะสี่ประการนี้

6. การฝึกอบรมโมเดล

ขั้นแรก เราใช้อัลกอริทึม RandomForestRegressor นำเข้าจากแพ็คเกจ “sklearn.ensemble” มันเป็นเทคนิคการประกอบ

  1. สร้างแบบจำลองจาก RandomForestRegressor() เราไม่ได้ส่งพารามิเตอร์ใดๆ ไปยังโมเดลนี้ ดังนั้น จำนวนแผนผังการตัดสินใจคือ 100 ตามค่าเริ่มต้น
  2. ใช้เมธอด fit() เพื่อให้พอดีกับโมเดล ต้องใช้พารามิเตอร์สองตัว พารามิเตอร์ตัวแรกคือแอ็ตทริบิวต์ที่ต้องพึ่งพาและพารามิเตอร์ตัวที่สองคือป้ายกำกับคลาส/เป้าหมาย
  3. ใช้เมธอด Score() เพื่อดูความแม่นยำของโมเดล นอกจากนี้ยังใช้พารามิเตอร์เดียวกันซึ่งคล้ายกับเมธอด fit()
จาก ได้เรียนรู้ ทั้งมวล นำเข้า RandomForestRegressor

# กำหนดรุ่น

รุ่น1 = RandomForestRegressor ( )

#เข้าได้ตรงรุ่น

รุ่น1. พอดี ( รถไฟ_ข้อมูล , เป้า )

# ความแม่นยำของโมเดล

พิมพ์ ( รุ่น1. คะแนน ( รถไฟ_ข้อมูล , เป้า ) * 100 )

เอาท์พุท:

86.08400889419033

7. ทดสอบโมเดลและจัดเก็บผลลัพธ์

นี่เป็นขั้นตอนสุดท้ายที่เราจำเป็นต้องทำนายผลลัพธ์และจัดเก็บไว้

  1. วิธีการทำนาย () ใช้ในการทำนายข้อมูลการทดสอบ ใช้กับโมเดลและรับรายการค่า/DataFrame ที่ซ้อนกัน
  2. ใช้เมธอด to_csv() เพื่อจัดเก็บผลลัพธ์ลงในไฟล์ CSV
  3. ดาวน์โหลดไฟล์จากสภาพแวดล้อม Python (Google Colab)
# ทำนาย test_data1 ด้วย model1

ทดสอบ_ข้อมูล [ 'ราคา' ] = รุ่น1. ทำนาย ( test_data1 )

# บันทึก test_data ไปที่ test_results.csv

ทดสอบ_ข้อมูล to_csv ( 'test_results.csv' )

# ดาวน์โหลดไฟล์นี้จาก Colab

ไฟล์. ดาวน์โหลด ( 'test_results.csv' )

เอาท์พุท:

มาแสดง 20 บันทึกจาก 505 บันทึกกัน คุณจะเห็นว่าคอลัมน์ราคาเก็บค่าที่คาดการณ์ไว้สำหรับบ้านแต่ละหลัง

รุ่นอื่นๆ

มาทำนายบ้านโดยใช้ DecisionTreeRegressor คุณสามารถนำเข้าได้จากโมดูล “sklearn.tree”

จาก ได้เรียนรู้ ต้นไม้ นำเข้า DecisionTreeRegressor

# กำหนดรุ่น

รุ่น2 = DecisionTreeRegressor ( )

#เข้าได้ตรงรุ่น

รุ่น2. พอดี ( รถไฟ_ข้อมูล , เป้า )

# ความแม่นยำของโมเดล

พิมพ์ ( รุ่น2. คะแนน ( รถไฟ_ข้อมูล , เป้า ) * 100 )

# ทำนาย test_data1 ด้วย model1

ทดสอบ_ข้อมูล [ 'ราคา' ] = รุ่น2. ทำนาย ( test_data1 )

# บันทึก test_data ไปที่ test_results.csv

ทดสอบ_ข้อมูล to_csv ( 'test_results.csv' )

# ดาวน์โหลดไฟล์นี้จาก Colab

ไฟล์. ดาวน์โหลด ( 'test_results.csv' )

เอาท์พุท:

99.94183165335028

คุณสามารถดูผลลัพธ์ที่คาดการณ์ได้ที่นี่:

เรามาทำนายบ้านโดยใช้ LinearrEgression กัน นำเข้าโมเดลจากโมดูล “sklearn.linear_model”

จาก ได้เรียนรู้ linear_model นำเข้า การถดถอยเชิงเส้น

# กำหนดรุ่น

รุ่น3 = การถดถอยเชิงเส้น ( )

#เข้าได้ตรงรุ่น

รุ่น3. พอดี ( รถไฟ_ข้อมูล , เป้า )

# ทำนาย test_data1 ด้วย model1

ทดสอบ_ข้อมูล [ 'ราคา' ] = รุ่น3. ทำนาย ( test_data1 )

# บันทึก test_data ไปที่ test_results.csv

ทดสอบ_ข้อมูล to_csv ( 'test_results.csv' )

# ดาวน์โหลดไฟล์นี้จาก Colab

ไฟล์. ดาวน์โหลด ( 'test_results.csv' )

คุณสามารถดูผลลัพธ์ที่คาดการณ์ได้ที่นี่:

บทสรุป

ตอนนี้คุณสามารถคาดการณ์ราคาบ้านตามคุณลักษณะต่างๆ เช่น จำนวนห้อง พื้นที่ที่ดินของคุณ ฯลฯ ในคู่มือนี้ เราได้พิจารณาข้อมูลบ้านจริงจากซีแอตเทิล รัฐวอชิงตัน การใช้เทคนิค Regression เช่น Linear Regression, Decision Tree และ Random Forest เราคาดการณ์ราคาบ้าน 505 หลัง ขั้นตอนทั้งหมด (การประมวลผลข้อมูลล่วงหน้า การล้างข้อมูล และการแสดงข้อมูล) ที่ต้องทำก่อนการฝึกโมเดลจะได้รับการอธิบายทีละขั้นตอนพร้อมส่วนย่อยโค้ดและเอาต์พุต