पंडों डेटा फ़्रेम के साथ एक ओएलएस प्रतिगमन चलाएँ


111

मेरे पास एक pandasडेटा फ्रेम है और मैं कॉलम बी और सी के मूल्यों से कॉलम ए के मूल्यों की भविष्यवाणी करने में सक्षम होना चाहूंगा। यहां एक खिलौना उदाहरण दिया गया है:

import pandas as pd
df = pd.DataFrame({"A": [10,20,30,40,50], 
                   "B": [20, 30, 10, 40, 50], 
                   "C": [32, 234, 23, 23, 42523]})

आदर्श रूप में, मेरे पास कुछ ऐसा होगा ols(A ~ B + C, data = df)लेकिन जब मैं एल्गोरिथ्म पुस्तकालयों से उदाहरणों को देखता हूं तो scikit-learnयह कॉलम के बजाय पंक्तियों की सूची के साथ मॉडल को डेटा खिलाने के लिए प्रकट होता है। इससे मुझे सूची के अंदर डेटा को पुन: स्वरूपित करने की आवश्यकता होगी, जो पहली जगह में पांडा के उपयोग के उद्देश्य को पराजित करता है। एक पांडा डेटा फ्रेम में डेटा पर एक ओएलएस प्रतिगमन (या अधिक सामान्यतः किसी भी मशीन लर्निंग एल्गोरिदम) को चलाने के लिए सबसे पायथोनिक तरीका क्या है?

जवाबों:


152

मुझे लगता है कि आप लगभग वही कर सकते हैं जो आपने सोचा था कि आदर्शमॉडल पैकेज का उपयोग करके आदर्श संस्करण 0.20.0 pandasसे पहले pandas' वैकल्पिक निर्भरता' में से एक था (यह कुछ चीजों के लिए उपयोग किया गया था pandas.stats।)

>>> import pandas as pd
>>> import statsmodels.formula.api as sm
>>> df = pd.DataFrame({"A": [10,20,30,40,50], "B": [20, 30, 10, 40, 50], "C": [32, 234, 23, 23, 42523]})
>>> result = sm.ols(formula="A ~ B + C", data=df).fit()
>>> print(result.params)
Intercept    14.952480
B             0.401182
C             0.000352
dtype: float64
>>> print(result.summary())
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                      A   R-squared:                       0.579
Model:                            OLS   Adj. R-squared:                  0.158
Method:                 Least Squares   F-statistic:                     1.375
Date:                Thu, 14 Nov 2013   Prob (F-statistic):              0.421
Time:                        20:04:30   Log-Likelihood:                -18.178
No. Observations:                   5   AIC:                             42.36
Df Residuals:                       2   BIC:                             41.19
Df Model:                           2                                         
==============================================================================
                 coef    std err          t      P>|t|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
Intercept     14.9525     17.764      0.842      0.489       -61.481    91.386
B              0.4012      0.650      0.617      0.600        -2.394     3.197
C              0.0004      0.001      0.650      0.583        -0.002     0.003
==============================================================================
Omnibus:                          nan   Durbin-Watson:                   1.061
Prob(Omnibus):                    nan   Jarque-Bera (JB):                0.498
Skew:                          -0.123   Prob(JB):                        0.780
Kurtosis:                       1.474   Cond. No.                     5.21e+04
==============================================================================

Warnings:
[1] The condition number is large, 5.21e+04. This might indicate that there are
strong multicollinearity or other numerical problems.

2
ध्यान दें कि सही कीवर्ड है formula, मैंने गलती से टाइप formulasकिया और अजीब सी त्रुटि मिली:TypeError: from_formula() takes at least 3 arguments (2 given)
denfromufa

@DSM अजगर के लिए बहुत नया है। अपने समान कोड को चलाने की कोशिश की और दोनों प्रिंट संदेशों पर त्रुटियां हुईं: प्रिंट result.summary () ^ SyntaxError: अमान्य सिंटैक्स >>> प्रिंट result.parmas फ़ाइल "<stdin>", पंक्ति 1 प्रिंट परिणाम .armas ^ SyntaxError: गुम कोष्ठक में 'प्रिंट' को कॉल करें ... शायद मैंने पैकेज गलत लोड किए हैं ?? यह तब काम करता है जब मैं "प्रिंट" नहीं करता। धन्यवाद।
a.powell

2
@ a.powell ओप्स कोड पायथन 2 के लिए है। एकमात्र बदलाव जो मुझे लगता है कि आपको बनाने की ज़रूरत है, कोष्ठक को मुद्रित करने के लिए तर्कों को गोल करना होगा: print(result.params)औरprint(result.summary())
पॉल मूर

मैं सराहना करूँगा यदि आप इस पर एक नज़र डाल सकते हैं और धन्यवाद: stackoverflow.com/questions/44923808/…
Desta Haileselassie Hagos

इस formula()दृष्टिकोण का उपयोग करने का प्रयास टाइप त्रुटि को टाइप करता है टाइपर: __init __ () में 1 आवश्यक स्थिति तर्क गायब है: 'एंडॉग', इसलिए मुझे लगता है कि यह पदावनत है। भी, olsअब हैOLS
3

68

नोट: 0.20.0 के साथ pandas.stats हटा दिया गया है


इसके साथ ऐसा करना संभव है pandas.stats.ols:

>>> from pandas.stats.api import ols
>>> df = pd.DataFrame({"A": [10,20,30,40,50], "B": [20, 30, 10, 40, 50], "C": [32, 234, 23, 23, 42523]})
>>> res = ols(y=df['A'], x=df[['B','C']])
>>> res
-------------------------Summary of Regression Analysis-------------------------

Formula: Y ~ <B> + <C> + <intercept>

Number of Observations:         5
Number of Degrees of Freedom:   3

R-squared:         0.5789
Adj R-squared:     0.1577

Rmse:             14.5108

F-stat (2, 2):     1.3746, p-value:     0.4211

Degrees of Freedom: model 2, resid 2

-----------------------Summary of Estimated Coefficients------------------------
      Variable       Coef    Std Err     t-stat    p-value    CI 2.5%   CI 97.5%
--------------------------------------------------------------------------------
             B     0.4012     0.6497       0.62     0.5999    -0.8723     1.6746
             C     0.0004     0.0005       0.65     0.5826    -0.0007     0.0014
     intercept    14.9525    17.7643       0.84     0.4886   -19.8655    49.7705
---------------------------------End of Summary---------------------------------

ध्यान दें कि आपको statsmodelsपैकेज स्थापित करने की आवश्यकता है , यह pandas.stats.olsफ़ंक्शन द्वारा आंतरिक रूप से उपयोग किया जाता है।


13
ध्यान दें कि यह भविष्य के पांडा के संस्करण में पदावनत होने जा रहा है!
डेन्फ्रोमोफा

4
क्यों कर रहे हैं? मुझे विशद रूप से उम्मीद है कि यह समारोह जीवित रहेगा! यह वास्तव में उपयोगी और त्वरित है!
17

2
The pandas.stats.ols module is deprecated and will be removed in a future version. We refer to external packages like statsmodels, see some examples here: http://www.statsmodels.org/stable/regression.html
जावदबा २५'१ at को ०:४

2
@ डस्टाहेलसैलेसीहागोस। यह जारी करने के कारण हो सकता है missing intercepts। समतुल्य Rपैकेज का डिज़ाइनर माध्य के लिए समायोजन को हटाकर समायोजित करता है: आँकड़े.स्टैकएक्सचेंज . com / a / 36068 / 64552 । । अन्य सुझाव: you can use sm.add_constant to add an intercept to the exog arrayऔर एक reg = ols("y ~ x", data=dict(y=y,x=x)).fit()
ताना का

2
यह एक दुखद दिन था जब वे हटा दिया pandas.stats💔
3kstc

31

मुझे नहीं पता कि यह नया है sklearnया नहीं pandas, लेकिन मैं डेटा फ़्रेम को सीधे डेटा फ्रेम में sklearnकनवर्ट किए बिना एक योग्य सरणी या किसी अन्य डेटा प्रकार में परिवर्तित करने में सक्षम हूं ।

from sklearn import linear_model

reg = linear_model.LinearRegression()
reg.fit(df[['B', 'C']], df['A'])

>>> reg.coef_
array([  4.01182386e-01,   3.51587361e-04])

2
ओपी से छोटा डायवर्सन - लेकिन मुझे .values.reshape(-1, 1)डेटाफ्रेम कॉलम में संलग्न करने के बाद यह विशेष उत्तर बहुत मददगार लगा । उदाहरण के लिए: x_data = df['x_data'].values.reshape(-1, 1)और x_data(और इसी तरह बनाई गई y_data) एनपी सरणियों को .fit()विधि में पास करना।
S3DEV

16

इससे मुझे सूची के अंदर डेटा को पुन: स्वरूपित करने की आवश्यकता होगी, जो पहली जगह में पांडा के उपयोग के उद्देश्य को पराजित करता है।

यह नहीं है, बस एक NumPy सरणी में कनवर्ट करें:

>>> data = np.asarray(df)

इसमें निरंतर समय लगता है क्योंकि यह आपके डेटा पर एक दृश्य बनाता है । फिर इसे खिलाने के लिए सीखें:

>>> from sklearn.linear_model import LinearRegression
>>> lr = LinearRegression()
>>> X, y = data[:, 1:], data[:, 0]
>>> lr.fit(X, y)
LinearRegression(copy_X=True, fit_intercept=True, normalize=False)
>>> lr.coef_
array([  4.01182386e-01,   3.51587361e-04])
>>> lr.intercept_
14.952479503953672

3
मुझे करना था np.matrix( np.asarray( df ) ), क्योंकि स्केलेर ने एक ऊर्ध्वाधर वेक्टर की उम्मीद की थी, जबकि खस्ता सरणियां, एक बार जब आप उन्हें एक सरणी से काटते हैं, तो क्षैतिज vecotrs की तरह कार्य करते हैं, जो कि अधिकांश समय महान होता है।
cjohnson318

इस मार्ग के साथ गुणांक के परीक्षण करने का कोई सरल तरीका नहीं है, हालांकि
माइकलचिरिको

2
क्या पंडित डेटाफ्रेम के साथ सीधे स्किकिट-लर्न खिलाने का कोई तरीका नहीं है?
फेम्टो ट्रेडर

अन्य स्केलेर मॉड्यूल (निर्णय पेड़, आदि) के लिए, मैंने df ['colname'] का उपयोग किया है। मान, लेकिन इसके लिए काम नहीं किया।
स्वेज़लीन

1
आप .valuesविशेषता का उपयोग भी कर सकते हैं । यानी, reg.fit(df[['B', 'C']].values, df['A'].values)
3novak

6

Statsmodels kan एक OLS मॉडल का निर्माण स्तंभ संदर्भों के साथ सीधे एक पांडा डेटाफ़्रेम में करता है।

छोटा एवं सुन्दर:

model = sm.OLS(df[y], df[x]).fit()


कोड विवरण और प्रतिगमन सारांश:

# imports
import pandas as pd
import statsmodels.api as sm
import numpy as np

# data
np.random.seed(123)
df = pd.DataFrame(np.random.randint(0,100,size=(100, 3)), columns=list('ABC'))

# assign dependent and independent / explanatory variables
variables = list(df.columns)
y = 'A'
x = [var for var in variables if var not in y ]

# Ordinary least squares regression
model_Simple = sm.OLS(df[y], df[x]).fit()

# Add a constant term like so:
model = sm.OLS(df[y], sm.add_constant(df[x])).fit()

model.summary()

आउटपुट:

                            OLS Regression Results                            
==============================================================================
Dep. Variable:                      A   R-squared:                       0.019
Model:                            OLS   Adj. R-squared:                 -0.001
Method:                 Least Squares   F-statistic:                    0.9409
Date:                Thu, 14 Feb 2019   Prob (F-statistic):              0.394
Time:                        08:35:04   Log-Likelihood:                -484.49
No. Observations:                 100   AIC:                             975.0
Df Residuals:                      97   BIC:                             982.8
Df Model:                           2                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const         43.4801      8.809      4.936      0.000      25.996      60.964
B              0.1241      0.105      1.188      0.238      -0.083       0.332
C             -0.0752      0.110     -0.681      0.497      -0.294       0.144
==============================================================================
Omnibus:                       50.990   Durbin-Watson:                   2.013
Prob(Omnibus):                  0.000   Jarque-Bera (JB):                6.905
Skew:                           0.032   Prob(JB):                       0.0317
Kurtosis:                       1.714   Cond. No.                         231.
==============================================================================

आर-स्क्वेर, गुणांक और पी-वैल्यू को सीधे कैसे प्राप्त करें:

# commands:
model.params
model.pvalues
model.rsquared

# demo:
In[1]: 
model.params
Out[1]:
const    43.480106
B         0.124130
C        -0.075156
dtype: float64

In[2]: 
model.pvalues
Out[2]: 
const    0.000003
B        0.237924
C        0.497400
dtype: float64

Out[3]:
model.rsquared
Out[2]:
0.0190
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.