পাইথনে একাধিক লিনিয়ার রিগ্রেশন


129

আমি এমন এক পাইথন লাইব্রেরি খুঁজে পাই না যা একাধিক রিগ্রেশন করে। আমি যে জিনিসগুলি পাই তা কেবলমাত্র সাধারণ প্রতিরোধকেই করতে পারে। বেশ কয়েকটি স্বতন্ত্র ভেরিয়েবলের (x1, x2, x3, ইত্যাদি) বিপরীতে আমার নির্ভরশীল পরিবর্তনশীল (y) পুনরায় চাপতে হবে।

উদাহরণস্বরূপ, এই ডেটা সহ:

print 'y        x1      x2       x3       x4      x5     x6       x7'
for t in texts:
    print "{:>7.1f}{:>10.2f}{:>9.2f}{:>9.2f}{:>10.2f}{:>7.2f}{:>7.2f}{:>9.2f}" /
   .format(t.y,t.x1,t.x2,t.x3,t.x4,t.x5,t.x6,t.x7)

(উপরের জন্য আউটপুট :)

      y        x1       x2       x3        x4     x5     x6       x7
   -6.0     -4.95    -5.87    -0.76     14.73   4.02   0.20     0.45
   -5.0     -4.55    -4.52    -0.71     13.74   4.47   0.16     0.50
  -10.0    -10.96   -11.64    -0.98     15.49   4.18   0.19     0.53
   -5.0     -1.08    -3.36     0.75     24.72   4.96   0.16     0.60
   -8.0     -6.52    -7.45    -0.86     16.59   4.29   0.10     0.48
   -3.0     -0.81    -2.36    -0.50     22.44   4.81   0.15     0.53
   -6.0     -7.01    -7.33    -0.33     13.93   4.32   0.21     0.50
   -8.0     -4.46    -7.65    -0.94     11.40   4.43   0.16     0.49
   -8.0    -11.54   -10.03    -1.03     18.18   4.28   0.21     0.55

লিনিয়ার রিগ্রেশন সূত্র পেতে কীভাবে আমি অজগরগুলিতে এগুলি প্রতিরোধ করব:

Y = a1x1 + a2x2 + a3x3 + a4x4 + a5x5 + a6x6 + + a7x7 + c


বিশেষজ্ঞ নয়, তবে যদি ভেরিয়েবলগুলি স্বতন্ত্র থাকে, তবে আপনি কি প্রতিটিটির বিরুদ্ধে কেবল সাধারণ রিগ্রেশন চালাতে পারবেন না এবং ফলাফলের যোগফলটি যোগ করতে পারবেন?
হিউ বোথওয়েল

8
@ হুগবথওয়েল আপনি ধরে নিতে পারবেন না যে ভেরিয়েবলগুলি স্বাধীন। আসলে, আপনি যদি ধরে নিচ্ছেন যে ভেরিয়েবলগুলি স্বতন্ত্র, আপনি সম্ভবত আপনার ডেটা ভুলভাবে মডেলিং করতে পারেন। অন্য কথায়, প্রতিক্রিয়াগুলি Yএকে অপরের সাথে সম্পর্কিত হতে পারে, তবে স্বাধীনতা ধরে নেওয়া ডেটাসেটকে সঠিকভাবে মডেল করে না।
hlin117

@ হুবুথওয়েল দুঃখিত, যদি এটি একটি ডাম প্রশ্ন, তবে কাঁচা বৈশিষ্ট্যটি ভেরিয়েবল x_i স্বতন্ত্র বা না থাকায় কেন ব্যাপার? এটি কীভাবে ভবিষ্যদ্বাণীকে প্রভাবিত করে (= মডেল)?
চার্লি পার্কার

উত্তর:


100

sklearn.linear_model.LinearRegression এটা করবো:

from sklearn import linear_model
clf = linear_model.LinearRegression()
clf.fit([[getattr(t, 'x%d' % i) for i in range(1, 8)] for t in texts],
        [t.y for t in texts])

তারপরে clf.coef_রিগ্রেশন সহগ রয়েছে।

sklearn.linear_model রিগ্রেশনটিতে বিভিন্ন ধরণের নিয়মিতকরণ করতে একই রকম ইন্টারফেস রয়েছে।


2
এটি নির্দিষ্ট ইনপুটগুলির সাথে ত্রুটি প্রদান করে । অন্য কোন সমাধান উপলব্ধ?
জাচ

@ ডৌগল sklearn.linear_model.LinearRegression এছাড়াও ভারী মাল্টিভারিয়েট রিগ্রেশন জন্য ব্যবহার করা যেতে পারে ?
ব্যবহারকারী 961627

1
ধ্রুবক শর্তে ফিট করতে: সিএলএফ = লিনিয়ার_মডেল।লাইনার রিগ্রেশন (ফিট_ইন্টারসেপ্ট = সত্য)
ইমরান

2
অনুসরণ করুন, আপনি কীভাবে sklearn.linear_model.LinearRegression ব্যবহার করে আত্মবিশ্বাসের স্তরটি পাবেন তা জানেন? ধন্যবাদ।
হুয়ানিয়ান জাং

1
@ হুয়ানিয়ানজং আত্মবিশ্বাসের স্তর বলতে কী বোঝ? আপনি যদি সংকল্পের সহগ চান, scoreপদ্ধতিটি এটি করবে; sklearn.metricsকিছু অন্যান্য মডেল মূল্যায়ন মানদণ্ড আছে। আপনি যদি আকাওয়ালের উত্তরের মতো জিনিসটি চান তবে স্ট্যাটাস মডেলগুলির আরও কিছু আর-জাতীয় ডায়াগনস্টিকস রয়েছে।
ডুগল

60

এখানে আমি তৈরি করেছি এমন একটি ছোট্ট কাজ। আমি এটি আর এর সাথে চেক করেছি এবং এটি সঠিকভাবে কাজ করে।

import numpy as np
import statsmodels.api as sm

y = [1,2,3,4,3,4,5,4,5,5,4,5,4,5,4,5,6,5,4,5,4,3,4]

x = [
     [4,2,3,4,5,4,5,6,7,4,8,9,8,8,6,6,5,5,5,5,5,5,5],
     [4,1,2,3,4,5,6,7,5,8,7,8,7,8,7,8,7,7,7,7,7,6,5],
     [4,1,2,5,6,7,8,9,7,8,7,8,7,7,7,7,7,7,6,6,4,4,4]
     ]

def reg_m(y, x):
    ones = np.ones(len(x[0]))
    X = sm.add_constant(np.column_stack((x[0], ones)))
    for ele in x[1:]:
        X = sm.add_constant(np.column_stack((ele, X)))
    results = sm.OLS(y, X).fit()
    return results

ফলাফল:

print reg_m(y, x).summary()

আউটপুট:

                            OLS Regression Results                            
==============================================================================
Dep. Variable:                      y   R-squared:                       0.535
Model:                            OLS   Adj. R-squared:                  0.461
Method:                 Least Squares   F-statistic:                     7.281
Date:                Tue, 19 Feb 2013   Prob (F-statistic):            0.00191
Time:                        21:51:28   Log-Likelihood:                -26.025
No. Observations:                  23   AIC:                             60.05
Df Residuals:                      19   BIC:                             64.59
Df Model:                           3                                         
==============================================================================
                 coef    std err          t      P>|t|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
x1             0.2424      0.139      1.739      0.098        -0.049     0.534
x2             0.2360      0.149      1.587      0.129        -0.075     0.547
x3            -0.0618      0.145     -0.427      0.674        -0.365     0.241
const          1.5704      0.633      2.481      0.023         0.245     2.895

==============================================================================
Omnibus:                        6.904   Durbin-Watson:                   1.905
Prob(Omnibus):                  0.032   Jarque-Bera (JB):                4.708
Skew:                          -0.849   Prob(JB):                       0.0950
Kurtosis:                       4.426   Cond. No.                         38.6

pandas এই উত্তর হিসাবে ওএলএস চালানোর জন্য একটি সুবিধাজনক উপায় সরবরাহ করে:

পান্ডাস ডেটা ফ্রেমের সাহায্যে একটি ওএলএস রিগ্রেশন চালান


18
reg_mফাংশন অকারণে জটিল। x = np.array(x).T, x = sm.add_constant(x)এবং results = sm.OLS(endog=y, exog=x).fit()যথেষ্ট।
সিডি 98

1
এটি একটি দুর্দান্ত সরঞ্জাম। কেবল একটি প্রশ্ন জিজ্ঞাসা করুন: এই ক্ষেত্রে টিটির মান 95.5% আত্মবিশ্বাসের ব্যবধানের বাইরে, সুতরাং এর অর্থ এই ফিটিংটি মোটেও সঠিক নয়, বা আপনি কীভাবে এটি ব্যাখ্যা করবেন?
হুয়ানিয়ান জাং

2
কেবলমাত্র লক্ষ্য করেছেন যে আপনার x1, ​​x2, x3 আপনার মূল ভবিষ্যদ্বাণী তালিকার বিপরীত ক্রমে রয়েছে, অর্থাৎ, x = [x3, x2, x1]?
সোফিয়াডডব

@ সোফিয়াডাব্লু আপনি x = x[::-1]সঠিক ক্রম পেতে ফাংশন সংজ্ঞায় কেবল যুক্ত করতে পারেন
আশ্রিথ

@ হুয়ানিয়ানজ্যাং "টি মান" হ'ল গুণমানটি শূন্য থেকে দূরে কত মানিক বিচ্যুতি হয়, যখন ৯৫% সিআই প্রায় হয় coef +- 2 * std err(প্রকৃতপক্ষে স্টুডেন্ট-টি বিতরণ বাকী অংশে স্বাধীনতার ডিগ্রি দ্বারা প্যারামিটারাইজড)। অর্থাত্ বৃহত্তর পরম টি মানগুলি সিআই থেকে আরও শূন্য থেকে বোঝায়, তবে তাদের সরাসরি তুলনা করা উচিত নয়। স্পষ্টতা কিছুটা দেরিতে, তবে আশা করি এটি
স্যাম ম্যাসন

47

কেবল পরিষ্কার করার জন্য, আপনি যে উদাহরণটি দিয়েছেন সেটি হ'ল একাধিক লিনিয়ার রিগ্রেশন, মাল্টিভারিয়েট লিনিয়ার রিগ্রেশন নয় । পার্থক্য :

একটি একক স্কেলার প্রেডিকটর ভেরিয়েবল এক্স এবং একটি একক স্কেলারের প্রতিক্রিয়া ভেরিয়েবল y এর খুব সহজ কেসটি সাধারণ লিনিয়ার রিগ্রেশন হিসাবে পরিচিত। একাধিক এবং / বা ভেক্টর-মূল্যবান প্রেডিক্টর ভেরিয়েবলগুলির প্রসার (মূলধন এক্স দ্বারা চিহ্নিত) একাধিক লিনিয়ার রিগ্রেশন হিসাবে পরিচিত, এটি মাল্টিভেরিয়েবল লিনিয়ার রিগ্রেশন নামেও পরিচিত। প্রায় সমস্ত রিয়েল-ওয়ার্ল্ড রিগ্রেশন মডেলগুলি একাধিক পূর্বাভাসককে জড়িত করে এবং লিনিয়ার রিগ্রেশন-এর প্রাথমিক বিবরণগুলি একাধিক রিগ্রেশন মডেলের ক্ষেত্রে প্রায়শই অঙ্কিত হয়। তবে দ্রষ্টব্য, এই ক্ষেত্রে প্রতিক্রিয়া ভেরিয়েবল y এখনও একটি স্কেলার। আরও একটি শব্দ মাল্টিভারিয়েট লিনিয়ার রিগ্রেশন এমনটি বোঝায় যেগুলি y একটি ভেক্টর, অর্থাৎ, সাধারণ লিনিয়ার রিগ্রেশন এর সমান।

সংক্ষেপে:

  • একাধিক লিনিয়ার রিগ্রেশন: প্রতিক্রিয়া y একটি স্কেলার।
  • মাল্টিভারিয়েট লিনিয়ার রিগ্রেশন: প্রতিক্রিয়া y একটি ভেক্টর।

(অন্য উত্স ।)


5
এটি দরকারী তথ্য হতে পারে, তবে আমি জানি না এটি কীভাবে প্রশ্নের উত্তর দেয়।
আকাওয়াল

7
@ আকভাল সঠিক পরিভাষা ব্যবহার করে উত্তর খুঁজে পাওয়ার প্রথম পদক্ষেপ।
ফ্রাঙ্ক ডারননকোর্ট

1
@ ফ্র্যাঙ্কডেরননকোর্ট তবে ওপির ওয়াই মান ভেক্টর?
সর্বদা জিজ্ঞাসাবাদ

@ ফ্র্যাঙ্কডেরননকোর্ট: "সঠিক পরিভাষা ব্যবহার করা উত্তর খুঁজে পাওয়ার প্রথম পদক্ষেপ" । দুর্দান্ত, সুতরাং আমরা উভয়ই একমত হতে পারি: এটি এবং নিজে থেকেই, এটি আসলে কোনও উত্তর নয়। অন্যান্য সংস্থান অনুসন্ধান না করে ব্যবহারকারীদের সরাসরি উত্তর থেকে তাদের সমস্যা সমাধান করতে সক্ষম হওয়া উচিত
ম্যাক

28

আপনি numpy.linalg.lstsq ব্যবহার করতে পারেন :

import numpy as np
y = np.array([-6,-5,-10,-5,-8,-3,-6,-8,-8])
X = np.array([[-4.95,-4.55,-10.96,-1.08,-6.52,-0.81,-7.01,-4.46,-11.54],[-5.87,-4.52,-11.64,-3.36,-7.45,-2.36,-7.33,-7.65,-10.03],[-0.76,-0.71,-0.98,0.75,-0.86,-0.50,-0.33,-0.94,-1.03],[14.73,13.74,15.49,24.72,16.59,22.44,13.93,11.40,18.18],[4.02,4.47,4.18,4.96,4.29,4.81,4.32,4.43,4.28],[0.20,0.16,0.19,0.16,0.10,0.15,0.21,0.16,0.21],[0.45,0.50,0.53,0.60,0.48,0.53,0.50,0.49,0.55]])
X = X.T # transpose so input vectors are along the rows
X = np.c_[X, np.ones(X.shape[0])] # add bias term
beta_hat = np.linalg.lstsq(X,y)[0]
print beta_hat

ফলাফল:

[ -0.49104607   0.83271938   0.0860167    0.1326091    6.85681762  22.98163883 -41.08437805 -19.08085066]

আপনি এর সাথে আনুমানিক আউটপুটটি দেখতে পারেন:

print np.dot(X,beta_hat)

ফলাফল:

[ -5.97751163,  -5.06465759, -10.16873217,  -4.96959788,  -7.96356915,  -3.06176313,  -6.01818435,  -7.90878145,  -7.86720264]

প্রিন্ট এনপি.ডট (এক্স, বিটা_হ্যাট) ... এবং মোড_উইলস = এসএমএলএলএস (ওয়াই, এক্স, ওয়েটস = ওয়েট) রেজ = মোড_উইলসফিট () প্রেডিওয়াই = রেস.প্রেডিক্ট () সব কিছুর মধ্যে পার্থক্য কী তা আমি জানতে পারি? ওয়াই ফলাফলটি ফিরিয়ে দিন
dd90p

13

ব্যবহার scipy.optimize.curve_fit। এবং শুধুমাত্র লিনিয়ার ফিটের জন্য নয়।

from scipy.optimize import curve_fit
import scipy

def fn(x, a, b, c):
    return a + b*x[0] + c*x[1]

# y(x0,x1) data:
#    x0=0 1 2
# ___________
# x1=0 |0 1 2
# x1=1 |1 2 3
# x1=2 |2 3 4

x = scipy.array([[0,1,2,0,1,2,0,1,2,],[0,0,0,1,1,1,2,2,2]])
y = scipy.array([0,1,2,1,2,3,2,3,4])
popt, pcov = curve_fit(fn, x, y)
print popt

8

একবার আপনি আপনার ডেটা একটি পান্ডাস ডেটা ফ্রেমে ( df) রূপান্তর করে ফেললে ,

import statsmodels.formula.api as smf
lm = smf.ols(formula='y ~ x1 + x2 + x3 + x4 + x5 + x6 + x7', data=df).fit()
print(lm.params)

ইন্টারসেপ্ট শব্দটি ডিফল্টরূপে অন্তর্ভুক্ত থাকে।

আরও উদাহরণের জন্য এই নোটবুকটি দেখুন ।


এই নোটবুক দুর্দান্ত। এটি দেখায় যে কীভাবে কেবলমাত্র 3 টি লাইনের কোড এবং সাইকিট শিখুন ব্যবহার করে একাধিক স্বতন্ত্র ভেরিয়েবল (x1, x2, x3 ...) রিগ্রস করা যায়।
jxn

নোটবুকের জন্য @ ক্যানারি_ইন_টি_ডাটা_মিন ধন্যবাদ আমি একাধিক বৈশিষ্ট্যযুক্ত লিনিয়ার রিগ্রেশন কীভাবে প্লট করতে পারি? আমি নোটবুকে খুঁজে পাইনি। কোন পয়েন্টার প্রশংসা করা হবে। - ধন্যবাদ
জয় প্রকাশ

এটি কি এতে বাধা যুক্ত করে কারণ আমাদের smf.add_intercep () কে ওলগুলি () এর পরামিতি হিসাবে পাস করে ইন্টারসেপ্ট যোগ করতে হবে
ব্লুয়েড্রয়েড

4

আমি মনে করি এটি এই কাজটি শেষ করার সবচেয়ে সহজ উপায়:

from random import random
from pandas import DataFrame
from statsmodels.api import OLS
lr = lambda : [random() for i in range(100)]
x = DataFrame({'x1': lr(), 'x2':lr(), 'x3':lr()})
x['b'] = 1
y = x.x1 + x.x2 * 2 + x.x3 * 3 + 4

print x.head()

         x1        x2        x3  b
0  0.433681  0.946723  0.103422  1
1  0.400423  0.527179  0.131674  1
2  0.992441  0.900678  0.360140  1
3  0.413757  0.099319  0.825181  1
4  0.796491  0.862593  0.193554  1

print y.head()

0    6.637392
1    5.849802
2    7.874218
3    7.087938
4    7.102337
dtype: float64

model = OLS(y, x)
result = model.fit()
print result.summary()

                            OLS Regression Results                            
==============================================================================
Dep. Variable:                      y   R-squared:                       1.000
Model:                            OLS   Adj. R-squared:                  1.000
Method:                 Least Squares   F-statistic:                 5.859e+30
Date:                Wed, 09 Dec 2015   Prob (F-statistic):               0.00
Time:                        15:17:32   Log-Likelihood:                 3224.9
No. Observations:                 100   AIC:                            -6442.
Df Residuals:                      96   BIC:                            -6431.
Df Model:                           3                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
x1             1.0000   8.98e-16   1.11e+15      0.000         1.000     1.000
x2             2.0000   8.28e-16   2.41e+15      0.000         2.000     2.000
x3             3.0000   8.34e-16    3.6e+15      0.000         3.000     3.000
b              4.0000   8.51e-16    4.7e+15      0.000         4.000     4.000
==============================================================================
Omnibus:                        7.675   Durbin-Watson:                   1.614
Prob(Omnibus):                  0.022   Jarque-Bera (JB):                3.118
Skew:                           0.045   Prob(JB):                        0.210
Kurtosis:                       2.140   Cond. No.                         6.89
==============================================================================

4

উপরোক্ত রেফারেন্স অনুযায়ী একাধিক লিনিয়ার রিগ্রেশন স্কেলার্ন লাইব্রেরি ব্যবহার করে পরিচালনা করা যায়। আমি পাইথন 3.6 এর অ্যানাকোন্ডা ইনস্টল ব্যবহার করছি।

আপনার মডেলটি নিম্নলিখিত হিসাবে তৈরি করুন:

from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(X, y)

# display coefficients
print(regressor.coef_)

3

আপনি numpy.linalg.lstsq ব্যবহার করতে পারেন


6
মাল্টিভারিয়েট রিগ্রেশন এর সহগ পেতে আপনি কীভাবে এটি ব্যবহার করতে পারেন? আমি কেবল দেখি কীভাবে একটি সাধারণ রিগ্রেশন করা যায় ... এবং সহগ কীভাবে পাওয়া যায় তা দেখি না ..
জ্যাচ

1

আপনি নীচের ফাংশনটি ব্যবহার করতে এবং এটি একটি ডেটা ফ্রেম পাস করতে পারেন:

def linear(x, y=None, show=True):
    """
    @param x: pd.DataFrame
    @param y: pd.DataFrame or pd.Series or None
              if None, then use last column of x as y
    @param show: if show regression summary
    """
    import statsmodels.api as sm

    xy = sm.add_constant(x if y is None else pd.concat([x, y], axis=1))
    res = sm.OLS(xy.ix[:, -1], xy.ix[:, :-1], missing='drop').fit()

    if show: print res.summary()
    return res

1

সাইকিট-লার পাইথনের একটি মেশিন লার্নিং লাইব্রেরি যা আপনার জন্য এই কাজটি করতে পারে। আপনার স্ক্রিপ্টে কেবল sklearn.linear_model মডিউল আমদানি করুন।

পাইথনে স্কলার ব্যবহার করে একাধিক লিনিয়ার রিগ্রেশন এর কোড টেমপ্লেট সন্ধান করুন:

import numpy as np
import matplotlib.pyplot as plt #to plot visualizations
import pandas as pd

# Importing the dataset
df = pd.read_csv(<Your-dataset-path>)
# Assigning feature and target variables
X = df.iloc[:,:-1]
y = df.iloc[:,-1]

# Use label encoders, if you have any categorical variable
from sklearn.preprocessing import LabelEncoder
labelencoder = LabelEncoder()
X['<column-name>'] = labelencoder.fit_transform(X['<column-name>'])

from sklearn.preprocessing import OneHotEncoder
onehotencoder = OneHotEncoder(categorical_features = ['<index-value>'])
X = onehotencoder.fit_transform(X).toarray()

# Avoiding the dummy variable trap
X = X[:,1:] # Usually done by the algorithm itself

#Spliting the data into test and train set
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X,y, random_state = 0, test_size = 0.2)

# Fitting the model
from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(X_train, y_train)

# Predicting the test set results
y_pred = regressor.predict(X_test)

এটাই. আপনি এই কোডটি কোনও ডেটাসেটে একাধিক লিনিয়ার রিগ্রেশন প্রয়োগের জন্য একটি টেম্পলেট হিসাবে ব্যবহার করতে পারেন। উদাহরণ সহ আরও ভাল বোঝার জন্য, দেখুন: একটি উদাহরণ সহ লিনিয়ার রিগ্রেশন


0

এখানে একটি বিকল্প এবং মৌলিক পদ্ধতি:

from patsy import dmatrices
import statsmodels.api as sm

y,x = dmatrices("y_data ~ x_1 + x_2 ", data = my_data)
### y_data is the name of the dependent variable in your data ### 
model_fit = sm.OLS(y,x)
results = model_fit.fit()
print(results.summary())

বদলে sm.OLSআপনার কাছে ব্যবহার করতে পারেন sm.Logitবা sm.Probitএবং ইত্যাদি

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.