رگرسیون خطی در پایتون — کدها و برنامهها (بخش دوم)
در دیگر نوشتارهای مجله فرادرس، مفهوم رگرسیون خطی و همچنین نحوه محاسبات آن را خواندهاید. در این نوشتار قرار است با کدهای پایتون برای رگرسیون خطی، تکنیک رگرسیون خطی را در حالت ساده و چندگانه در این زبان برنامهنویسی و کتابخانههای آن اجرا کنیم. این آموزش در دو بخش که در زیر ذکر شدهاند، ارائه میشود:
- بخش اول: در این قسمت، مباحث اولیه و اساسی مربوط به رگرسیون خطی آورده شده و فرمولهای مرتبط نیز ارائه میشوند.
- بخش دوم: کدها و برنامههایی که برای مدلسازی رگرسیون خطی ساده و چندگانه در پایتون لازم است در این قسمت ارائه میشوند.
برای آشنایی بیشتر با مفاهیم اولیه در رگرسیون خطی، نوشتارهای رگرسیون خطی — مفهوم و محاسبات به زبان ساده، رگرسیون خطی چندگانه (Multiple Linear Regression) — به زبان ساده را بخوانید. همچنین خواندن مطلب هم خطی در مدل رگرسیونی — به زبان ساده نیز خالی از لطف نیست.
کدهای پایتون برای رگرسیون خطی
به منظور پیادهسازی «رگرسیون خطی ساده» (Simple Linear Regression) و «رگرسیون چندگانه» (Multiple Regression) و بررسی فرضیات آن به یک مجموعه داده احتیاج داریم که در قسمت اول این نوشتار، به بررسی آن میپردازیم.
در مجموعه دادهای که مربوط به 1030 مشاهده از مقاوت فشاری کامل (Complete Compressive Strength) یک ترکیب از مواد اولیه مختلف است، هشت متغیر توصیفی مطابق با فهرست زیر قرار دارد.
- سیمان (Cement)، برحسب کیلوگرم در مخلوط یک متر مکعب.
- سربار کوره بلند (Blast Furnace Slag)، برحسب کیلوگرم در مخلوط یک متر مکعب.
- خاکستر (Fly Ash)، برحسب کیلوگرم در مخلوط یک متر مکعب.
- آب (Water)، برحسب کیلوگرم در مخلوط یک متر مکعب.
- پلاستیزایر (Superplasticizer)، برحسب کیلوگرم در مخلوط یک متر مکعب.
- ماسه درشت دانه (Coarse Aggregate)، برحسب کیلوگرم در مخلوط یک متر مکعب.
- ماسه ریز دانه (Fine Aggregate)، برحسب کیلوگرم در مخلوط یک متر مکعب.
- طول عمر (Age) برحسب روز که در محدوده ۱ تا ۳۶۵ قرار دارد.
این مجموعه دادهها را میتوانید با نام Concrete_Data.csv از اینجا با قالب فشرده دریافت کنید. در تصویر زیر نمونهای از دادههای این فایل را در اکسل مشاهده میکنید.
کدهای پایتون برای اجرای رگرسیون خطی
برای انجام تحلیل رگرسیونی روی مجموعه داده Concrete_Data.csv به کتابخانههای numpy, pandas, matplotlib احتیاج داریم. بارگذاری و فراخوانی این کتابخانهها در کد زیر صورت گرفته است.
1import numpy as np
2import pandas as pd
3import matplotlib.pyplot as plt
4
5data = pd.read_csv("Concrete_Data.csv")
6
7
8x = data.iloc[:,0:8]
9y = data.iloc[:,8:]
فرض بر این است که فایل داده، در محل پیشفرض (Working Directory) پایتون قرار دارد. در غیر اینصورت باید مسیر دسترسی به این فایل را نیز در تابع pd.read_csv مشخص کنید. به این ترتیب متغیرهای توصیفی (مستقل) در متغیر x و مقادیر متغیر وابسته در y ثبت میشوند.
تفکیک دادهها به دو بخش آموزشی و آزمایشی
در این قسمت، مشاهدات را به دو گروه آموزشی (Training Set) و آزمایشی (Test Set) تقسیم میکنیم. این کار توسط کتابخانه sklearn صورت میگیرد.
1from sklearn.cross_validation import train_test_split
2x_train,x_test,y_train,y_test = train_test_split(x,y,test_size = 0.2,random_state = 100)
همانطور که مشخص است ۸۰٪ از دادهها برای بخش آموزش و ۲۰٪ برای آزمایش در نظر گرفته شدهاند.
رگرسیون خطی با کتابخانه sklearn
به کمک کتابخانه sklearn و کلاس LinearRegression، محاسبات مربوط به مدل رگرسیونی در متغیر lm ثبت میشود. نتیجه مقادیر برازش شده توسط مدل نیز برای دادههای آموزشی محاسبه میشود.
1from sklearn.linear_model import LinearRegression
2lm = LinearRegression()
3lm = lm.fit(x_train,y_train) #lm.fit(input,output)
خروجی با فراخوانی ـlm.coef به صورت زیر ظاهر میشود.
1lm.coef_
2array([[ 0.12415357, 0.10366839, 0.093371 , -0.13429401, 0.28804259,
3 0.02065756, 0.02563037, 0.11461733]])
همانطور که مشخص است، هر یک از این مقادیر به ترتیب، ضرایب متغیرهای توصیفی X1 تا X8 هستند. به منظور ثبت این متغیرها در یک چارچوب داده (DataFrame) از دستور زیر کمک میگیرم.
1coefficients = pd.concat([pd.DataFrame(x_train.columns),pd.DataFrame(np.transpose(lm.coef_))], axis = 1)
نتیجه به صورت زیرخواهد بود.
10 Cement 0.124154
21 Blast 0.103668
32 Fly Ash 0.093371
43 Water -0.134294
54 Superplasticizer 0.288043
65 CA 0.020658
76 FA 0.025630
87 Age 0.114617
برای نمایش مقدار عرض از مبدا یا میانگین کل نیز از کد زیر استفاده میکنیم.
1lm.intercept_
2array([-34.273527])
به این ترتیب مدل رگرسیونی چندگانه مطابق با خروجیهای ایجاد شده، شکل میگیرد. بر این اساس میتوان مقادیر پیشبینی شده را هم نمایش داد و باقیمانده یا خطاها را هم محاسبه کرد.
1y_pred = lm.predict(x_test)
2y_error = y_test - y_pred
برای محاسبه ضریب تعیین یا $$R^2$$ نیز که ابزاری برای سنجش کارایی مدل است، از دستورات زیر استفاده میکنیم.
1from sklearn.metrics import r2_score
2r2_score(y_test,y_pred)
این طور به نظر میرسد که مقدار $$R^2$$ مناسب است و مدل به خوبی شکل گرفته است زیرا مقدار ضریب تعیین بزرگتر از ۰٫۶ است.
10.62252008774048395
رگرسیون خطی با کتابخانه statmodels
در این قسمت با استفاده از کلاس OLS، مدل رگرسیون خطی چندگانه را روی دادههای y_train و x_train برازش میدهیم.
1import statsmodels.api as sma
2X_train = sma.add_constant(x_train) ## let's add an intercept (beta_0) to our model
3X_test = sma.add_constant(x_test)
4import statsmodels.formula.api as sm
5lm2 = sm.OLS(y_train,X_train).fit()
نکته: متاسفانه در مدلی که توسط sm.OLS تولید میشود، عرض از مبدا یا مقدار میانگین کل در مدل بطور خودکار وجود ندارد و باید این گزینه را توسط sm.add_constant درخواست کنیم.
خلاصه مدل حاصل توسط دستور summary به دست میآید. خروجی را در ادامه میبینید.
1lm2.summary()
2"""
3 OLS Regression Results
4==============================================================================
5Dep. Variable: CMS R-squared: 0.613
6Model: OLS Adj. R-squared: 0.609
7Method: Least Squares F-statistic: 161.0
8Date: Wed, 03 Jan 2018 Prob (F-statistic): 4.37e-162
9Time: 21:29:10 Log-Likelihood: -3090.4
10No. Observations: 824 AIC: 6199.
11Df Residuals: 815 BIC: 6241.
12Df Model: 8
13Covariance Type: nonrobust
14====================================================================================
15 coef std err t P>|t| [0.025 0.975]
16------------------------------------------------------------------------------------
17const -34.2735 29.931 -1.145 0.253 -93.025 24.478
18Cement 0.1242 0.010 13.054 0.000 0.105 0.143
19Blast 0.1037 0.011 9.229 0.000 0.082 0.126
20Fly Ash 0.0934 0.014 6.687 0.000 0.066 0.121
21Water -0.1343 0.046 -2.947 0.003 -0.224 -0.045
22Superplasticizer 0.2880 0.102 2.810 0.005 0.087 0.489
23CA 0.0207 0.011 1.966 0.050 2.79e-05 0.041
24FA 0.0256 0.012 2.131 0.033 0.002 0.049
25Age 0.1146 0.006 19.064 0.000 0.103 0.126
26==============================================================================
27Omnibus: 3.757 Durbin-Watson: 2.033
28Prob(Omnibus): 0.153 Jarque-Bera (JB): 3.762
29Skew: -0.165 Prob(JB): 0.152
30Kurtosis: 2.974 Cond. No. 1.07e+05
31==============================================================================
32Warnings:
33[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
34[2] The condition number is large, 1.07e+05. This might indicate that there are
35strong multicollinearity or other numerical problems.
36"""
همانطور که مشاهده میکنید، خروجی ایجاد شده توسط دستور summary، بسیار مفصل است و مباحث مربوط به وجود همخطی و نرمال بودن باقیماندهها، توسط آزمونهای «دوربین واتسون» (Durbin-Warson) و «جارک برا» (Jarque-Bera) صورت گرفته است که مشخص است فرض نرمال بودن با توجه به بزرگ بودن مقدار احتمال $$(Prob(JB)= 0.152)$$ رد نمیشود.
مشخص است که نتایج حاصل از دستور summary در اینجا با نتایج حاصل از مدلی که توسط lm از کتابخانه sklearn تولید شده، اندکی متفاوت است که ناشی از خطای محاسباتی است. زیرا مقادیر پیشبینی در هر دو مدل یکسان است.
در قسمتی از خروجی، یک جدول تحلیل واریانس (ANOVA) را مشاهده میکنید که به ضرایب و همچنین مقدار احتمال برای معنیداری هر یک از ضرایب مدل رگرسیونی پرداخته است. به غیر از عرض از مبدا (Constant) که دارای مقدار احتمال بزرگتر از ۵٪ است، بقیه متغیرها میتوانند در مدل حضور داشته باشند. از طرفی بزرگ بودن مقدار F-statistic و همینطور کوچک بودن مقدار احتمال (Prob F-statistic) نشان از مناسب بودن مدل است.
در انتها نیز به منظور برآورد مقادیر متغیر وابسته از کد زیر کمک میگیریم.
1y_pred2 = lm2.predict(X_test)
نکته: مقادیر برآورد شده در y_pred2 و y_pred برابر هستند ولی با استفاده از دو روش متفاوت بدست آمدهاند.
ارزیابی صحت مدل رگرسیون خطی با پایتون
همانطور که در قسمت اول این نوشتار خواندید، ارزیابی مناسب بودن مدل میتواند توسط ضریب تعیین صورت گیرد. در این قسمت با استفاده از $$R^2$$ و $$R_{Adj.}^2$$ مدل را ارزیابی میکنیم.
در ادامه بدون هیچ تابعی و به کمک فرمولهایی که در بخش اول این نوشتارها مشاهده کردهاید، این شاخصها را محاسبه میکنیم.
1import numpy as np
2y_test = pd.to_numeric(y_test.CMS, errors='coerce')
3RSS = np.sum((y_pred2 - y_test)**2)
4y_mean = np.mean(y_test)
5TSS = np.sum((y_test - y_mean)**2)
6R2 = 1 - RSS/TSS
7R2
8
9n=X_test.shape[0]
10p=X_test.shape[1] - 1
11
12adj_rsquared = 1 - (1 - R2) * ((n - 1)/(n-p-1))
13adj_rsquared
نتیجه اجرا برای مدل تولید شده توسط statsmodels به صورت زیر است:
$$\large R^2 = 0.6225 , \;\;\;\; R^2_{Adj.} = 0.60719$$
از آنجایی که ضریب تعیین و حتی ضریب تعیین تعدیل شده برای مدل بزرگتر از ۰٫۶ است، مدل مناسب به نظر میرسد.
شناسایی دادههای دورافتاده (Outlier)
یکی از شرایط اجرای مدل رگرسیونی، نداشتن دادههای پرت در میان مجموعه داده است. بنابراین باید دادهها را از جهت نداشتن چنین مشاهداتی مورد بررسی قرار دهیم. برای انجام این کار، ابتدا مقادیر استاندارد شده باقیماندهها (Studentize Residuals) را محاسبه میکنیم. این کار به کمک تابع get_influence صورت میگیرد و نتیجه در متغیر resid_student ثبت میشود.
1influence = lm2.get_influence()
2resid_student = influence.resid_studentized_external
با ترکیب مجموعه آموزشی و باقیماندهها، جدولی به صورت زیر خواهیم داشت.
1 Cement Blast Fly Ash Water Superplasticizer CA FA Age \
20 540.0 0.0 0.0 162.0 2.5 1040.0 676.0 28.0
31 540.0 0.0 0.0 162.0 2.5 1055.0 676.0 28.0
42 332.5 142.5 0.0 228.0 0.0 932.0 594.0 270.0
53 332.5 142.5 0.0 228.0 0.0 932.0 594.0 365.0
64 198.6 132.4 0.0 192.0 0.0 978.4 825.5 360.0
7 Studentized Residuals
80 1.559672
91 -0.917354
102 1.057443
113 0.637504
124 -1.170290
این خروجی توسط دستور زیر حاصل شده است که در آن مقادیر و بقایماندهها را برای ۵ مشاهده اول در جدول بالا میبینید.
1resid = pd.concat([x_train,pd.Series(resid_student,name = "Studentized Residuals")],axis = 1)
2resid.head()
نکته: برآورد باقیمانده استاندارد شده (Studentize Residuals)، برحسب واریانس برآورده شده برای متغیر وابسته و یک ضریب اصلاح است. که به صورت زیر محاسبه میشود:
$$\large {\displaystyle t_{i}={{\widehat {\varepsilon \,}}_{i} \over {\widehat {\sigma }}{\sqrt {1-h_{ii}\ }}}}$$
که $$h_{ii}$$ عناصر قطر اصلی ماتریس$$X(X^TX)^{-1}X^T$$ هستند. اگر مقدار باقیمانده استاندارد شده (Studentize Residuals) بزرگتر از ۳ یا کوچکتر از ۳- باشد، آن مشاهده را مقدار دور افتاده در نظر میگیریم. در نتیجه به نظر میرسد که مشاهده شماره 649، مقدار دورافتاده است.
1 Cement Blast Fly Ash Water Superplasticizer CA FA Age \
2649 166.8 250.2 0.0 203.5 0.0 975.6 692.6 3.0
3 Studentized Residuals
4649 3.161183
خروجی بالا به کمک دستور زیر بدست آمده است. توجه داشته باشید که شماره مشاهده مورد نظر در متغیر ind ذخیره شده است.
1resid.loc[np.absolute(resid["Studentized Residuals"]) > 3,:]
2ind = resid.loc[np.absolute(resid["Studentized Residuals"]) > 3,:].index
3ind
4Int64Index([649], dtype='int64')
به منظور خارج کردن این مشاهده در مدل رگرسیونی از دستورات زیر استفاده میکنیم. تابع drop به این منظور در کد زیر گنجانده شده است.
1y_train.drop(ind,axis = 0,inplace = True)
2x_train.drop(ind,axis = 0,inplace = True) #Interept column is not there
3X_train.drop(ind,axis = 0,inplace = True) #Intercept column is there
شناسایی همخطی چندگانه و اصلاح آن
در ادامه شاخص VIF یا همان عامل یا «فاکتور تورم واریانس» (Variance Inflation Factor) را بدست میآوریم تا مشخص کنیم که آیا مدل دچار مشکل همخطی است یا خیر. در حقیقیت میخواهیم بدانیم چه ترکیبی از متغیرها توصیفی با یکدیگر وابستگی خطی دارند.
1from statsmodels.stats.outliers_influence import variance_inflation_factor
2[variance_inflation_factor(x_train.values, j) for j in range(x_train.shape[1])]
مقادیر حاصل از محاسبه VIF برای هر یک از متغیرها در ادامه دیده میشود.
1[15.477582601956859,
2 3.2696650121931814,
3 4.1293255012993439,
4 82.210084751631086,
5 5.21853674386234,
6 85.866945489015535,
7 71.816336942930675,
8 1.6861600968467656]
معمولا اگر متغیری دارای VIF بزرگتر از ۵ باشد، آن را از مدل خارج میکنیم. بنابراین کدهای زیر به منظور شناسایی این امر و خارج کردن چنین متغیری از مدل به کار گرفته میشوند. در اینجا thresh، ملاک خروج متغیر از مدل است که همان مقدار ۵ را دارد.
1def calculate_vif(x):
2 thresh = 5.0
3 output = pd.DataFrame()
4 k = x.shape[1]
5 vif = [variance_inflation_factor(x.values, j) for j in range(x.shape[1])]
6 for i in range(1,k):
7 print("Iteration no.")
8 print(i)
9 print(vif)
10 a = np.argmax(vif)
11 print("Max VIF is for variable no.:")
12 print(a)
13 if vif[a] <= thresh :
14 break
15 if i == 1 :
16 output = x.drop(x.columns[a], axis = 1)
17 vif = [variance_inflation_factor(output.values, j) for j in range(output.shape[1])]
18 elif i > 1 :
19 output = output.drop(output.columns[a],axis = 1)
20 vif = [variance_inflation_factor(output.values, j) for j in range(output.shape[1])]
21 return(output)
به این ترتیب متغیرهای چهارم (Water)، ششم و هفتم یعنی ماسه درشت (Coarse Aggregate) و ریز دانه (Fine Aggregate) از متغیرهای مدل خارج میشوند.
1train_out.head()
با این کار، مجموعه دادهها به صورت زیر در خواهند آمد.
1 Cement Blast Fly Ash Superplasticizer Age
2337 275.1 0.0 121.4 9.9 56
3384 516.0 0.0 0.0 8.2 28
4805 393.0 0.0 0.0 0.0 90
5682 183.9 122.6 0.0 0.0 28
6329 246.8 0.0 125.1 12.0 3
نکته: شمارههایی که در ستون اول این جدول مشاهده میکنید، شماره ردیف مشاهدات مربوط به مجموعه آموزشی هستند.
خارج کردن این متغیرها توسط کد زیر صورت گرفته است.
1x_test.head()
2x_test.drop(["Water","CA","FA"],axis = 1,inplace = True)
3x_test.head()
در ادامه لیستی از مقادیر مجموعه آزمایشی با خروج متغیرهایی که باعث همخطی شده بودند، دیده میشود.
1 Cement Blast Fly Ash Superplasticizer Age
2173 318.8 212.5 0.0 14.3 91
3134 362.6 189.0 0.0 11.6 28
4822 322.0 0.0 0.0 0.0 28
5264 212.0 0.0 124.8 7.8 3
6479 446.0 24.0 79.0 11.6 7
حال به بررسی مدل رگرسیونی پس از خارج کردن این مقادیر میپردازیم.
1import statsmodels.api as sma
2import statsmodels.formula.api as sm
3train_out = sma.add_constant(train_out) ## let's add an intercept (beta_0) to our model
4x_test.drop(["Water","CA","FA"],axis = 1,inplace = True)
5X_test = sma.add_constant(x_test)
6lm2 = sm.OLS(y_train,train_out).fit()
7lm2.summary()
همانطور که مشاهده میکنید تعداد اعضای مجموعه آموزشی از ۸۲۴ مشاهده به ۸۲۳ مشاهده رسیده زیرا یکی از اعضا که نقطه دورافتاده بود، از دادهها خارج شده است. همچنین درجه آزادی مدل (Df Model) که برابر با تعداد متغیرهای توصیفی است از ۸ به ۵ رسیده است که حاصل خارج کردن متغیرهایی است که مشکل همخطی داشتند.
1"""
2 OLS Regression Results
3==============================================================================
4Dep. Variable: CMS R-squared: 0.570
5Model: OLS Adj. R-squared: 0.567
6Method: Least Squares F-statistic: 216.3
7Date: Wed, 10 Jan 2018 Prob (F-statistic): 6.88e-147
8Time: 15:14:59 Log-Likelihood: -3128.8
9No. Observations: 823 AIC: 6270.
10Df Residuals: 817 BIC: 6298.
11Df Model: 5
12Covariance Type: nonrobust
13====================================================================================
14 coef std err t P>|t| [0.025 0.975]
15------------------------------------------------------------------------------------
16const -11.1119 1.915 -5.803 0.000 -14.871 -7.353
17Cement 0.1031 0.005 20.941 0.000 0.093 0.113
18Blast 0.0721 0.006 12.622 0.000 0.061 0.083
19Fly Ash 0.0614 0.009 6.749 0.000 0.044 0.079
20Superplasticizer 0.7519 0.077 9.739 0.000 0.600 0.903
21Age 0.1021 0.006 16.582 0.000 0.090 0.114
22==============================================================================
23Omnibus: 0.870 Durbin-Watson: 2.090
24Prob(Omnibus): 0.647 Jarque-Bera (JB): 0.945
25Skew: 0.039 Prob(JB): 0.623
26Kurtosis: 2.853 Cond. No. 1.59e+03
27==============================================================================
همانطور که مشاهده میکنید، مقدار ضریب R-squared و Adj. R-squared نسبت به حالتی که همه متغیرها وجود داشتند کاهش داشته ولی این کاهش برای Adj. R-squared کمتر است. همین اختلاف زیاد بین دو شاخص در دو حالت گواهی دیگر بر وجود مشکل همخطی است.
بررسی نرمال بودن باقیماندهها
آمارههای دوربین واستون (Durbin-Watson) با مقدار ۲٫۰۹۰ و همچنین آزمون جارک برا (Jarque-Bera) با مقدار ۰٫۹۴۵ کوچک هستند و فرض نرمال بودن باقیماندهها را تایید میکنند.
نکته: برای آزمون نرمال بودن باقیماندهها میتوانید از آزمون «شاپیرو ویلک» (Shapiro-Wilk's test) نیز استفاده کنید. کد مربوط به اجرای این آزمون در ادامه آورده شده است.
1from scipy import stats
2stats.shapiro(lm2.resid)
همانطور که مشاهده میکنید، آماره شاپیرو کوچک و مقدار احتمال آن که برابر با 0٫626988 است، بزرگتر از 0٫05 است در نتیجه فرض صفر که نرمال بودن باقیماندهها است رد نخواهد شد.
1(0.9983407258987427, 0.6269884705543518)
آزمون همواریانسی (Homoscedasticity)
آزمون گلدفلد کوانت (Goldfeld-Quandt Test)، آخرین گام برای ارزیابی نتایج مدل رگرسیونی است. فرض صفر این آزمون، ثابت بودن واریانس و وجود همواریانسی است. این امر به این معنی است که واریانس متغیر وابسته تحت تاثیر متغیرهای توصیفی نبوده و در نتیجه ثابت خواهد بود.
1import statsmodels.stats.api as sms
2from statsmodels.compat import lzip
3name = ['F statistic', 'p-value']
4test = sms.het_goldfeldquandt(lm2.resid, lm2.model.exog)
5lzip(name, test)
نتبجه اجرای این دستورات، نشانگر آن است که مقدار آماره F کوچک (0٫9903) و مقدار احتمال (p value=0٫539) است در نتیجه فرض همواریانسی برای این مدل رد نمیشود. در اینجا هم باز هم صحت مدل مورد ارزیابی قرار میگیرد.
1[('F statistic', 0.9903), ('p-value', 0.539)]
خلاصه و جمعبندی
رگرسیون یک تکنیک آماری است که در یادگیری ماشین و دادهکاوی به کار میرود. به همین علت کسانی که در علم داده مشغول فعالیت هستند، لازم است که بر این روش آماری مسلط شوند. در این نوشتار با جنبههای مختلف رگرسیون خطی در پایتون و نحوه پیادهسازی آن آشنا شدیم و از کتابخانههای مختلف آن برای حل مسائل رگرسیون خطی ساده و چندگانه کمک گرفتیم. در این بین نحوه ارزیابی صحت مدل نیز ارائه شده و مورد بحث قرار گرفت.
اگر مطلب بالا برای شما مفید بوده است، آموزشهایی که در ادامه آمدهاند نیز به شما پیشنهاد میشوند:
- مجموعه آموزش های آمار و احتمالات
- آموزش همبستگی و رگرسیون خطی در SPSS
- مجموعه آموزشهای داده کاوی و یادگیری ماشین
- رگرسیون کمترین زاویه (LAR Regression) — به زبان ساده
- رگرسیون خطی — مفهوم و محاسبات به زبان ساده
- تحلیل واریانس (Anova) — مفاهیم و کاربردها
^^
module ‘statsmodels.formula.api’ has no attribute ‘OLS’ هر کاری میکنم قبول نمیکند تا نمودار ols بدهد برای بار دوم چرا ؟ من یک هفته هست که گیر کردم سز این مسیله
import statsmodels.api as sma
import statsmodels.formula.api as sm
train_out = sma.add_constant(train_out) ## let’s add an intercept (beta_0) to our model
x_test.drop([“Water”,”CA”,”FA”],axis = 1,inplace = True)
X_test = sma.add_constant(x_test)
lm2 = sm.OLS(y_train,train_out).fit()
lm2.summary()
سلام چزا درقسمت train_out = sma.add_constant(train_out) وارد میکنم اخطار name ‘train_out’ is not defined میده؟
مثل همیشه دکتر ری بد خوب بود.
در قسمت تفکیک داده ها، می بایست cross_validation با ساب ماژول model_selection جایگزین شود زیرا cross_validation منسوخ شده است!
مرسی عالی بود
بسیار عالی و مفید بود