วิธีดำเนินการถดถอยกำลังสองน้อยที่สุดแบบถ่วงน้ำหนักใน python


ข้อสันนิษฐานสำคัญประการหนึ่งของการถดถอยเชิงเส้น คือ ส่วนที่เหลือ จะถูกกระจายด้วยความแปรปรวนเท่ากันในแต่ละระดับของตัวแปรทำนาย สมมติฐานนี้เรียกว่า การรักร่วมเพศ

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

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

บทช่วยสอนนี้ให้ตัวอย่างทีละขั้นตอนของวิธีการถดถอยกำลังสองน้อยที่สุดแบบถ่วงน้ำหนักใน Python

ขั้นตอนที่ 1: สร้างข้อมูล

ขั้นแรก เรามาสร้าง DataFrame ของ pandas ต่อไปนี้ซึ่งมีข้อมูลเกี่ยวกับจำนวนชั่วโมงที่เรียนและคะแนนสอบปลายภาคสำหรับนักเรียน 16 คนในชั้นเรียน:

 import pandas as pd

#createDataFrame
df = pd. DataFrame ({' hours ': [1, 1, 2, 2, 2, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 8],
                   ' score ': [48, 78, 72, 70, 66, 92, 93, 75, 75, 80, 95, 97,
                             90, 96, 99, 99]})

#view first five rows of DataFrame
print ( df.head ())

   hours score
0 1 48
1 1 78
2 2 72
3 2 70
4 2 66

ขั้นตอนที่ 2: ติดตั้งโมเดลการถดถอยเชิงเส้นอย่างง่าย

ต่อไป เราจะใช้ฟังก์ชันในโมดูล statsmodels เพื่อให้พอดีกับโมเดลการถดถอยเชิงเส้นอย่างง่ายโดยใช้ ชั่วโมง เป็นตัวแปรทำนายและ ให้คะแนน เป็นตัวแปรตอบสนอง:

 import statsmodels.api as sm

#define predictor and response variables
y = df[' score ']
X = df[' hours ']

#add constant to predictor variables
X = sm. add_constant (x)

#fit linear regression model
fit = sm. OLS (y,x). fit ()

#view model summary
print ( fit.summary ())

                            OLS Regression Results                            
==================================================== ============================
Dept. Variable: R-squared score: 0.630
Model: OLS Adj. R-squared: 0.603
Method: Least Squares F-statistic: 23.80
Date: Mon, 31 Oct 2022 Prob (F-statistic): 0.000244
Time: 11:19:54 Log-Likelihood: -57.184
No. Observations: 16 AIC: 118.4
Df Residuals: 14 BIC: 119.9
Model: 1                                         
Covariance Type: non-robust                                         
==================================================== ============================
                 coef std err t P>|t| [0.025 0.975]
-------------------------------------------------- ----------------------------
const 60.4669 5.128 11.791 0.000 49.468 71.465
hours 5.5005 1.127 4.879 0.000 3.082 7.919
==================================================== ============================
Omnibus: 0.041 Durbin-Watson: 1.910
Prob(Omnibus): 0.980 Jarque-Bera (JB): 0.268
Skew: -0.010 Prob(JB): 0.875
Kurtosis: 2.366 Cond. No. 10.5

จากสรุปโมเดล เราจะเห็นว่าค่า R-squared ของโมเดลคือ 0.630

ที่เกี่ยวข้อง: ค่า R-squared ที่ดีคืออะไร?

ขั้นตอนที่ 3: ติดตั้งโมเดลกำลังสองน้อยที่สุดแบบถ่วงน้ำหนัก

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

 #define weights to use
wt = 1/smf. ols (' fit.resid.abs() ~ fit.fittedvalues ', data=df). fit (). fitted values **2

#fit weighted least squares regression model
fit_wls = sm. WLS (y, X, weights=wt). fit ()

#view summary of weighted least squares regression model
print ( fit_wls.summary ())

                            WLS Regression Results                            
==================================================== ============================
Dept. Variable: R-squared score: 0.676
Model: WLS Adj. R-squared: 0.653
Method: Least Squares F-statistic: 29.24
Date: Mon, 31 Oct 2022 Prob (F-statistic): 9.24e-05
Time: 11:20:10 Log-Likelihood: -55.074
No. Comments: 16 AIC: 114.1
Df Residuals: 14 BIC: 115.7
Model: 1                                         
Covariance Type: non-robust                                         
==================================================== ============================
                 coef std err t P>|t| [0.025 0.975]
-------------------------------------------------- ----------------------------
const 63.9689 5.159 12.400 0.000 52.905 75.033
hours 4.7091 0.871 5.407 0.000 2.841 6.577
==================================================== ============================
Omnibus: 2,482 Durbin-Watson: 1,786
Prob(Omnibus): 0.289 Jarque-Bera (JB): 1.058
Skew: 0.029 Prob(JB): 0.589
Kurtosis: 1.742 Cond. No. 17.6
==================================================== ============================

จากผลลัพธ์ เราจะเห็นว่าค่า R-squared สำหรับโมเดลกำลังสองน้อยที่สุดแบบถ่วงน้ำหนักนี้เพิ่มขึ้นเป็น 0.676

สิ่งนี้บ่งชี้ว่าแบบจำลองกำลังสองน้อยที่สุดแบบถ่วงน้ำหนักสามารถอธิบายความแปรปรวนของคะแนนสอบได้มากกว่าแบบจำลองการถดถอยเชิงเส้นแบบธรรมดา

ข้อมูลนี้บอกเราว่าแบบจำลองกำลังสองน้อยที่สุดแบบถ่วงน้ำหนักให้ความพอดีกับข้อมูลได้ดีกว่าเมื่อเทียบกับแบบจำลองการถดถอยเชิงเส้นแบบธรรมดา

แหล่งข้อมูลเพิ่มเติม

บทช่วยสอนต่อไปนี้จะอธิบายวิธีทำงานทั่วไปอื่นๆ ใน Python:

วิธีสร้างพล็อตที่เหลือใน Python
วิธีสร้างพล็อต QQ ใน Python
วิธีทดสอบ multicollinearity ใน Python

เพิ่มความคิดเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *