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


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

আমার মনে হয় আপনি প্রায় কি করতে পারেন আপনি ঠিক কী চিন্তা আদর্শ হবে, ব্যবহার statsmodels প্যাকেজ যার মধ্যে একটি ছিল pandas'এর আগে ঐচ্ছিক নির্ভরতা pandasসংস্করণ 0.20.0' (এটা কিছু বিষয় জন্য ব্যবহৃত হয় 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

@ ডিএসএম অজগর থেকে খুব নতুন। আপনার একই কোডটি চালনার চেষ্টা করেছেন এবং উভয় মুদ্রণ বার্তায় ত্রুটি পেয়েছে: মুদ্রণ ফলাফল.স্মামারী () nt সিনট্যাক্স এরর: অবৈধ সিনট্যাক্স >>> মুদ্রণ ফলাফল.পার্মাস ফাইল "<stdin>", লাইন 1 মুদ্রণ রেজাল্ট.পার্মাস ^ সিনট্যাক্স এরর: এতে বন্ধনী অনুপস্থিত 'প্রিন্ট' এ কল করুন ... সম্ভবত আমি প্যাকেজগুলি লোড করেছি ভুল ?? যখন আমি "মুদ্রণ" রাখি না তখন এটি কাজ করে। ধন্যবাদ।
a.powell

2
@ a.powell ওপির কোডটি পাইথন ২ এর জন্য is কেবলমাত্র আমি মনে করি যে পরিবর্তনটি আপনার করা দরকার তা হ'ল প্রিন্ট করার জন্য যুক্তিগুলিকে গোল করা: print(result.params)এবংprint(result.summary())
পল মুর

: আমি যদি এই কটাক্ষপাত আছে এবং তোমাকে ধন্যবাদ পারে কৃতজ্ঞ হবে stackoverflow.com/questions/44923808/...
Desta Haileselassie Hagos

এই formula()পদ্ধতির ব্যবহারের প্রয়াস প্রকারের ত্রুটিটি প্রকারের প্রকারে ছুঁড়ে ফেলেছে টাইপ-এরর: __init __ () 1 টি প্রয়োজনীয় অবস্থানগত আর্গুমেন্ট: 'এন্ডোগ' হারিয়েছে, তাই আমি অনুমান করি যে এটি অবচিত ated এছাড়াও, olsএখনOLS
পিট

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
নোট করুন যে এটি ভবিষ্যতের পান্ডাস সংস্করণে অবচয় করা হতে চলেছে!
denfromufa

4
কেন করছেন? আমি দৃivid়ভাবে আশা করি এই ফাংশনটি বেঁচে থাকবে! এটি সত্যিই দরকারী এবং দ্রুত!
ফ্যাকফি

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
জাভাদবা

2
নিবন্ধন করুন এটি ইস্যু করার কারণে হতে পারে missing intercepts। সমতুল্য Rপ্যাকেজের ডিজাইনার গড়ের জন্য সামঞ্জস্যতা সরিয়ে সামঞ্জস্য করে: stats.stackexchange.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 ) ), কারণ স্ক্লার্ন একটি উল্লম্ব ভেক্টর প্রত্যাশা করেছিল, যেখানে নিম্পি অ্যারেগুলি একবার আপনি একটি অ্যারে ছড়িয়ে দিলে অনুভূমিক ভেক্টরদের মতো কাজ করুন, যা বেশিরভাগ সময় দুর্দান্ত।
cjohnson318

এই রুটের সহগের পরীক্ষা করার কোনও সহজ উপায় নেই, তবে
মাইকেলচিরিকো

2
পান্ডাস ডেটাফ্রেমে সরাসরি স্কাইকিট-লার্ন খাওয়ার কোনও উপায় নেই?
ফেমেটো ট্রেডার

অন্যান্য স্ক্লারন মডিউলগুলির জন্য (সিদ্ধান্ত গাছ ইত্যাদি), আমি df ['কলনেম'] মান ব্যবহার করেছি, তবে এটি এর জন্য কার্যকর হয়নি।
szeitlin

1
আপনি .valuesবৈশিষ্ট্যটিও ব্যবহার করতে পারেন । অর্থাৎ reg.fit(df[['B', 'C']].values, df['A'].values),।
3novak

6

স্ট্যাটাসমডেলস কান একটি প্যান্ডাস ডেটাফ্রেমে সরাসরি কলাম রেফারেন্স সহ একটি ওএলএস মডেল তৈরি করে ।

স্বল্প ও মধুর:

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