کتابخانه patsy در پایتون
patsy یک کتابخانهٔ قدرتمند برای تبدیل فرمولهای آماری (formula language) به ماتریسهای طراحی (design matrices) در پایتون است. این ابزار بهویژه برای کسانی که با مدلهای رگرسیونی و بستههایی مثل statsmodels کار میکنند، مفید است؛ زیرا امکان نوشتن مدلها به شکل متعارف آماری (مثلاً y ~ x1 + x2:x3) و تولید ماتریسهای X و y را فراهم میکند.
ویژگیها و کاربردهای اصلی
- نحو فرمولنویسی شبیه R برای توضیح مدلها.
- کدنویسی خودکار متغیرهای دستهای (categorical) و انتخاب روشهای contrast.
- توابع کمکی در فرمول مانند تبدیلها (log, I()), splineها (bs, cr) و تعاملها.
- قابلیت ساخت مجدد ماتریس طراحی برای دادههای جدید با design_info.
- یکپارچگی ساده با pandas و statsmodels.
نحو فرمولنویسی در patsy
در patsy از رشتهٔ فرمولی مانند “y ~ x1 + x2 + x1:x2” استفاده میشود. علامتها معانی مشخصی دارند:
- + اضافه کردن متغیر
- :
- تعامل صریح بین متغیرها
- * ترکیب و تعامل (مثالاً a*b = a + b + a:b)
- I() برای جلوگیری از تفسیر نمادها (مثلاً I(x**2))
مثال عملی: تولید ماتریس طراحی و رگرسیون با statsmodels
import pandas as pd
import numpy as np
from patsy import dmatrices
import statsmodels.api as sm
data = pd.DataFrame({
'y': np.random.randn(100),
'x1': np.random.randn(100),
'x2': np.random.choice(['A','B','C'], 100)
})
y, X = dmatrices('y ~ x1 + C(x2)', data, return_type='dataframe')
model = sm.OLS(y, X).fit()
print(model.summary())در این کد، dmatrices با فرمول ‘y ~ x1 + C(x2)’ ماتریس پاسخ y و ماتریس طراحی X را تولید میکند. تابع C(x2) نشاندهندهٔ متغیر دستهای است که بهصورت خودکار رمزگذاری میشود. سپس از statsmodels برای برازش رگرسیون OLS استفاده شده است.
مدیریت متغیرهای دستهای و انواع contrast
patsy به طور پیشفرض از کدگذاری نوع Treatment (Reference) برای متغیرهای دستهای استفاده میکند. میتوانید نوع contrast را با استفاده از C(var, Sum) یا C(var, Treatment(reference=…)) تغییر دهید.
| نوع contrast | توضیح |
|---|---|
| Treatment | کلاسه مرجع/پایه (پیشفرض) |
| Sum | مجموع بردارهای ستونها صفر میشود (useful for ANOVA) |
| Helmert | مقایسه سطح با میانگین سطوح بعدی |
مثال:
y, X = dmatrices('y ~ C(group, Sum)', data)در اینجا از contrast از نوع Sum استفاده شده است که برای برخی تحلیلهای ANOVA مطلوب است.
توابع پایه، تبدیلها و splineها
patsy توابعی مثل bs() (B-splines) و cr() (cubic regression splines) را پشتیبانی میکند. این امکان برای فیت کردن روابط غیرخطی بین متغیرها مفید است.
y, X = dmatrices('y ~ bs(age, df=4) + np.log(income)', data)در این مثال bs(age, df=4) یک سری از توابع پایهٔ spline تولید میکند و np.log(income) لگاریتم درآمد را به عنوان یک تبدیل عددی وارد مدل میکند. توابع numpy معمولاً در فرمول قابل استفادهاند چون patsy نامها را از فضای اجرا میخواند.
استفاده مجدد و اعمال مدل روی دادههای جدید
یکی از قابلیتهای مهم patsy نگه داشتن metadata دربارهٔ ماتریس طراحی (design_info) است. با استفاده از آن میتوان همان نگاشت فرمول به ماتریس را روی دادهٔ جدید اعمال کرد—این ویژگی در پیشبینی و ساخت پایپلاینها ضروری است.
# پس از ساخت X اولیه
from patsy import build_design_matrices
design_info = X.design_info
new_data = pd.DataFrame({'x1': [0.1, 0.2], 'x2': ['A','C']})
X_new = build_design_matrices([design_info], new_data)[0]
کد بالا design_info را از ماتریس X اولیه میگیرد و برای دادهٔ جدید X_new مطابق همان فرمول میسازد. این روش تضمین میکند که encoding دستهای و ترتیب ستونها یکسان باقی بماند.
مدیریت مقادیر گمشده و نکات عملی
- پیشفرض patsy این است که ردیفهایی که NA در متغیرهای مورد نیاز دارند را حذف میکند؛ برای کنترل بیشتر میتوان NA_action یا پاکسازی دستی در pandas را بهکار برد.
- توجه به ترتیب ستونها مهم است؛ design_info ترتیب و نام ستونها را نگه میدارد.
- برای توابع سفارشی میتوان آنها را در فضای نامی (namespace) قابل دسترسی برای patsy قرار داد تا در فرمولها قابلاستفاده باشند (مثلاً تعریف def myfunc(x): … و سپس استفاده از myfunc(x) در فرمول).
نکات پیشرفته و توصیههای کارشناسی
- برای کار با دیتاستهای بزرگ، تبدیل دادهها با pandas قبل از فراخوانی patsy و حذف ستونهای غیرضروری کارآمدتر است.
- اگر میخواهید pipeline تکرارپذیر بسازید، design_info را ذخیره کنید و آن را در محیط تولید برای تبدیل دادهها به کار ببرید.
- برای مدلهای پیچیده با تعاملهای چندگانه، از I() برای جلوگیری از تفسیر نادرست نمادها استفاده کنید (مثلاً I(x**2)).
- هنگام استفاده از splineها، همواره مقدار df و knotها را مستند کنید تا تکرارپذیری مدل حفظ شود.
مثال پیشرفته: تعامل با کدگذاری سفارشی و پیشبینی
import numpy as np
from patsy import dmatrices, build_design_matrices
import statsmodels.api as sm
# دادهٔ نمونه
data = pd.DataFrame({
'y': np.random.randn(200),
'age': np.random.uniform(20,70,200),
'sex': np.random.choice(['M','F'], 200),
'income': np.random.lognormal(10,1,200)
})
# مدل با spline و تعامل جنس
y, X = dmatrices('y ~ bs(age, df=5) * C(sex) + np.log(income)', data, return_type='dataframe')
res = sm.OLS(y, X).fit()
# اعمال روی دادهٔ جدید
design_info = X.design_info
new_data = pd.DataFrame({'age':[30,50], 'sex':['F','M'], 'income':[50000, 70000]})
X_new = build_design_matrices([design_info], new_data)[0]
preds = res.predict(X_new)این مثال نشان میدهد چگونه spline و تعامل با جنس بههم وصل شدهاند و سپس همان design_info برای تولید ماتریس جدید و پیشبینی استفاده شده است.
جمعبندی
patsy ابزار ساده و در عین حال بسیار منعطفی برای کسانی است که میخواهند مدلهای آماری را با نگارش فرمول مانند R در پایتون بسازند. توانایی مدیریت متغیرهای دستهای، تولید spline، ذخیرهٔ design_info و یکپارچگی با pandas و statsmodels آن را برای تحلیلهای رگرسیونی و ساخت pipelineهای پیشبینی مناسب میسازد. با رعایت نکات مربوط به مقادیر گمشده، نوع contrast و نگهداری متادیتا میتوانید مدلهایی قابل تکرار و قابل نگهداری ایجاد کنید.
آیا این مطلب برای شما مفید بود ؟




