|
|
# سکائیکیٹ-لرن کا استعمال کرتے ہوئے ریگریشن ماڈل بنائیں: ریگریشن کے چار طریقے
|
|
|
|
|
|
## ابتدائی نوٹ
|
|
|
|
|
|
لینیئر ریگریشن اُس وقت استعمال کی جاتی ہے جب ہم **عددی قیمت** کی پیش گوئی کرنا چاہتے ہیں (مثلاً، گھر کی قیمت، درجہ حرارت، یا فروخت)۔
|
|
|
یہ کام اس طرح کرتا ہے کہ وہ ایک سیدھی لائن تلاش کرتا ہے جو ان پٹ خصوصیات اور آؤٹ پٹ کے درمیان تعلق کی بہترین نمائندگی کرتی ہو۔
|
|
|
|
|
|
اس سبق میں، ہم بنیادی تصور کو سمجھنے پر توجہ دیتے ہیں اس سے پہلے کہ ہم مزید ترقی یافتہ ریگریشن تکنیکوں کو دریافت کریں۔
|
|
|

|
|
|
> انفراگرافک از [دسنی مدیپالی](https://twitter.com/dasani_decoded)
|
|
|
|
|
|
## [سبق سے پہلے کوئز](https://ff-quizzes.netlify.app/en/ml/)
|
|
|
|
|
|
> ### [یہ سبق R میں بھی دستیاب ہے!](../../../../2-Regression/3-Linear/solution/R/lesson_3.html)
|
|
|
|
|
|
### تعارف
|
|
|
|
|
|
اب تک آپ نے ریگریشن کیا ہے، اُس کا جائزہ لیا ہے اور اس مثال کے لیے کدو کی قیمتوں کا ڈیٹا استعمال کیا ہے جسے ہم اس سبق میں بار بار استعمال کریں گے۔ آپ نے اسے میٹ پلوٹ لائب کا استعمال کرتے ہوئے بھی دیکھا ہے۔
|
|
|
|
|
|
اب آپ مشین لرننگ کے لیے ریگریشن میں مزید گہرائی سے جا سکتے ہیں۔ جہاں تجزیاتی تصویر کشی (ویژولائزیشن) آپ کو ڈیٹا کو سمجھنے میں مدد دیتی ہے، مشین لرننگ کی اصل طاقت _ماڈلز کی تربیت_ سے آتی ہے۔ ماڈلز تاریخی ڈیٹا پر تربیت دیے جاتے ہیں تاکہ خود بخود ڈیٹا کے باہمی تعلقات کو سمجھ سکیں، اور یہ آپ کو نئے ڈیٹا کے لیے نتائج کی پیش گوئی کرنے کی اجازت دیتے ہیں جو ماڈل نے پہلے نہیں دیکھا۔
|
|
|
|
|
|
اس سبق میں، آپ دو اقسام کی ریگریشن کے بارے میں مزید سیکھیں گے: _بنیادی لینیئر ریگریشن_ اور _پولی نومیل ریگریشن_، ساتھ ہی ان تکنیکوں کے پیچھے کچھ ریاضی کے اصول بھی۔ یہ ماڈل ہمیں مختلف ان پٹ ڈیٹا کی بنیاد پر کدو کی قیمتیں پیش گوئی کرنے کی اجازت دیں گے۔
|
|
|
|
|
|
[](https://youtu.be/CRxFT8oTDMg "ML for beginners - Understanding Linear Regression")
|
|
|
|
|
|
> 🎥 لینیئر ریگریشن کے مختصر ویڈیو جائزے کے لیے اوپر تصویر پر کلک کریں۔
|
|
|
|
|
|
> اس نصاب میں، ہم حساب کی کم سے کم معلومات فرض کرتے ہیں اور اسے دوسرے شعبوں سے آنے والے طلباء کے لیے قابل رسائی بنانے کی کوشش کرتے ہیں، لہٰذا نوٹس، 🧮 حوالہ جات، خاکے، اور دیگر تعلیمی اوزار پر غور کریں جو سمجھنے میں مددگار ہوں۔
|
|
|
|
|
|
### پیشگی معلومات
|
|
|
|
|
|
اب تک آپ کو کدو کے ڈیٹا کی ساخت کا اندازہ ہو چکا ہوگا جسے ہم دیکھ رہے ہیں۔ آپ اسے اس سبق کی _notebook.ipynb_ فائل میں قبل از وقت لوڈ اور صاف شدہ پا سکتے ہیں۔ اس فائل میں کدو کی قیمت بوشل کے حساب سے ایک نئے ڈیٹا فریم میں ظاہر کی گئی ہے۔ یقینی بنائیں کہ آپ یہ نوٹ بکس Visual Studio Code میں کرنلز پر چلا سکتے ہیں۔
|
|
|
|
|
|
### تیاری
|
|
|
|
|
|
یاد دہانی کے طور پر، آپ یہ ڈیٹا اس لیے لوڈ کر رہے ہیں تاکہ اس سے سوالات کریں۔
|
|
|
|
|
|
- کدو خریدنے کا بہترین وقت کب ہے؟
|
|
|
- چھوٹے کدو کے کیس کی کتنی قیمت متوقع ہے؟
|
|
|
- کیا میں انہیں آدھے بوشل کی ٹوکریوں میں خریدوں یا 1 1/9 بوشل کے ڈبے میں؟
|
|
|
آئیے اس ڈیٹا میں مزید کھوج کریں۔
|
|
|
|
|
|
پچھلے سبق میں، آپ نے پانڈاز ڈیٹا فریم بنایا اور اسے اصل ڈیٹا سیٹ کے ایک حصے سے بھر دیا، قیمتوں کو بوشل کے حساب سے معیاری بنایا۔ تاہم، اس طرح آپ کو صرف تقریباً 400 ڈیٹا پوائنٹس ملے اور وہ بھی صرف خزانی مہینوں کے لیے۔
|
|
|
|
|
|
اس سبق کے ساتھ پیش کیے گئے نوٹ بک میں بھی دیکھیں۔ ڈیٹا پہلے سے لوڈ اور ابتدائی اسکیٹرپلاٹ بنایا گیا ہے جو مہینے کا ڈیٹا دکھاتا ہے۔ ہو سکتا ہے ہم اسے مزید صاف کرکے ڈیٹا کی نوعیت کے بارے میں مزید تفصیل حاصل کر سکیں۔
|
|
|
|
|
|
## ایک لینیئر ریگریشن لائن
|
|
|
|
|
|
جیسے آپ نے سبق 1 میں سیکھا، لینیئر ریگریشن مشق کا مقصد ایک لائن کے گراف پر اظہار کرنا ہے تاکہ:
|
|
|
|
|
|
- **متغیرات کے تعلقات دکھائیں۔** متغیرات کے تعلق کو ظاہر کریں۔
|
|
|
- **پیش گوئیاں کریں۔** صحیح پیش گوئیاں کریں کہ نیا ڈیٹا پوائنٹ اس لائن کے ساتھ کس طرح تعلق رکھے گا۔
|
|
|
|
|
|
یہ معمول ہے کہ **لیسٹ سکوائرز ریگریشن** ایسی لائن کھینچتی ہے۔ "لیسٹ سکوائرز" اصطلاح ہمارے ماڈل کی کل غلطی کو کم کرنے کے عمل کو بیان کرتی ہے۔ ہر ڈیٹا پوائنٹ کی عمودی فاصلہ (جسے بقایا کہا جاتا ہے) اصل پوائنٹ اور ہماری ریگریشن لائن کے درمیان ناپا جاتا ہے۔
|
|
|
|
|
|
ہم ان فاصلات کو دو اہم وجوہات کی بنا پر مربع کرتے ہیں:
|
|
|
|
|
|
1. **سمت کی بجائے مقدار:** ہم -5 کی غلطی کو +5 کی غلطی کے برابر سمجھنا چاہتے ہیں۔ مربع کرنے سے تمام قدریں مثبت ہو جاتی ہیں۔
|
|
|
|
|
|
2. **آؤٹ لائیرز کی سزا:** مربع کرنے سے بڑی غلطیوں کو زیادہ وزن ملتا ہے، جس سے لائن دور موجود نقاط کے قریب رہتی ہے۔
|
|
|
|
|
|
پھر ہم تمام مربع شدہ قدروں کو جمع کرتے ہیں۔ ہمارا مقصد وہ خاص لائن تلاش کرنا ہے جہاں یہ مجموعہ سب سے کم (انتہائی کم سے کم قیمت) ہو — اسی لیے اس کا نام "لیسٹ سکوائرز" ہے۔
|
|
|
|
|
|
> **🧮 مجھے ریاضی دکھائیں**
|
|
|
>
|
|
|
> یہ لائن، جسے _بہترین فٹ لائن_ کہا جاتا ہے، [ایک مساوات](https://en.wikipedia.org/wiki/Simple_linear_regression) کے ذریعے بیان کی جا سکتی ہے:
|
|
|
>
|
|
|
> ```
|
|
|
> Y = a + bX
|
|
|
> ```
|
|
|
>
|
|
|
> `X` 'وضاحتی متغیر' ہے۔ `Y` 'تابع متغیر' ہے۔ لائن کا ڈھلوان `b` ہے اور `a` y-انٹرسپٹ ہے، جو اس قیمت کی نمائندگی کرتا ہے جب `X = 0` ہو۔
|
|
|
>
|
|
|
>
|
|
|
>
|
|
|
> سب سے پہلے، ڈھلوان `b` کا حساب لگائیں۔ انفراگرافک از [جن لوپر](https://twitter.com/jenlooper)
|
|
|
>
|
|
|
> دوسرے الفاظ میں، اور ہمارے کدو ڈیٹا کے اصل سوال کی طرف اشارہ کرتے ہوئے: "مہینے کے حساب سے بوشل قیمت کی پیش گوئی کریں"، `X` قیمت کی نمائندگی کرے گا اور `Y` فروخت کے مہینے کی۔
|
|
|
>
|
|
|
>
|
|
|
>
|
|
|
> Y کی قیمت کا حساب لگائیں۔ اگر آپ تقریباً $4 ادا کر رہے ہیں، تو یہ لازمی طور پر اپریل ہے! انفراگرافک از [جن لوپر](https://twitter.com/jenlooper)
|
|
|
>
|
|
|
> لائن کا حساب لگانے والی ریاضی کو ڈھلوان کا مظاہرہ کرنا چاہیے، جو انٹرسپٹ پر بھی منحصر ہوتا ہے، یعنی جب `X = 0` ہو تو `Y` کہاں ہوتا ہے۔
|
|
|
>
|
|
|
> ان قدروں کے حساب کتاب کا طریقہ آپ [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html) ویب سائٹ پر دیکھ سکتے ہیں۔ اس کے علاوہ [یہ لِیسٹ-سکوائرز کیلکولیٹر](https://www.mathsisfun.com/data/least-squares-calculator.html) ملاحظہ کریں تاکہ سمجھیں کہ اعداد کی قیمتیں لائن پر کیا اثر ڈالتی ہیں۔
|
|
|
|
|
|
## تعلق (Correlation)
|
|
|
|
|
|
ایک اور اصطلاح جسے سمجھنا ضروری ہے وہ ہے X اور Y متغیرات کے درمیان **Correlation Coefficient**۔ اس کو اسکیٹرپلاٹ کی مدد سے جلدی سے دیکھا جا سکتا ہے۔ اسکیٹرپلاٹ جس میں ڈیٹا پوائنٹس یکساں لائن پر پھیلے ہوں، اس میں تعلق زیادہ ہوتا ہے، لیکن جہاں ڈیٹا پوائنٹس X اور Y میں منتشر ہوں، وہاں تعلق کم ہوتا ہے۔
|
|
|
|
|
|
ایک اچھا لینیئر ریگریشن ماڈل ہوگا، جس کا تعلق کا کوفیشینٹ زیادہ ہو (0 کی بجائے 1 کے قریب)، اور لیسٹ سکوائرز ریگریشن طریقے سے لائن آف ریگریشن کی تشکیل کی گئی ہو۔
|
|
|
|
|
|
✅ اس سبق کی نوٹ بک چلائیں اور مہینے کے مقابلے قیمت کے اسکیٹرپلاٹ کو دیکھیں۔ کیا آپ کے بصری تجزیے کے مطابق کدو کی فروخت کے لیے مہینے سے قیمت کا تعلق زیادہ ہے یا کم؟ کیا یہ بدلتا ہے اگر آپ `Month` کے بجائے زیادہ باریک پیمانے جیسے *سال کا دن* (یعنی سال کے آغاز سے گزرے دن) استعمال کریں؟
|
|
|
|
|
|
ذیل میں کوڈ میں، ہم فرض کریں گے کہ ہم نے ڈیٹا صاف کر لیا ہے اور ہمیں ایک ڈیٹا فریم مل گیا ہے جس کا نام `new_pumpkins` ہے، جو درج ذیل جیسا ہے:
|
|
|
|
|
|
ID | Month | DayOfYear | Variety | City | Package | Low Price | High Price | Price
|
|
|
---|-------|-----------|---------|------|---------|-----------|------------|-------
|
|
|
70 | 9 | 267 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 15.0 | 15.0 | 13.636364
|
|
|
71 | 9 | 267 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 18.0 | 18.0 | 16.363636
|
|
|
72 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 18.0 | 18.0 | 16.363636
|
|
|
73 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 17.0 | 17.0 | 15.454545
|
|
|
74 | 10 | 281 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 15.0 | 15.0 | 13.636364
|
|
|
|
|
|
> ڈیٹا صاف کرنے کا کوڈ [`notebook.ipynb`](notebook.ipynb) میں دستیاب ہے۔ ہم نے پچھلے سبق کی طرح صفائی کے قدم پورے کیے ہیں اور `DayOfYear` کالم کا حساب مندرجہ ذیل اظہار سے کیا ہے:
|
|
|
|
|
|
```python
|
|
|
day_of_year = pd.to_datetime(pumpkins['Date']).apply(lambda dt: (dt-datetime(dt.year,1,1)).days)
|
|
|
```
|
|
|
|
|
|
|
|
|
اب جب کہ آپ کو لینیئر ریگریشن کے پیچھے ریاضی کا علم ہے، آئیں ایک ریگریشن ماڈل بنائیں تاکہ دیکھیں کہ کیا ہم پیش گوئی کر سکتے ہیں کہ کس قسم کا پیکج کدو کی بہترین قیمت رکھے گا۔ کوئی جو چھٹی کے کدو کے پیچ کے لیے کدو خرید رہا ہے، وہ یہ معلومات اپنے خریداری کے انتخاب کو بہتر بنانے کے لیے چاہ سکتا ہے۔
|
|
|
|
|
|
## تعلق کی تلاش
|
|
|
|
|
|
[](https://youtu.be/uoRq-lW2eQo "ML for beginners - Looking for Correlation: The Key to Linear Regression")
|
|
|
|
|
|
> 🎥 تعلق کے مختصر ویڈیو جائزے کے لیے اوپر تصویر پر کلک کریں۔
|
|
|
|
|
|
پچھلے سبق سے آپ نے شاید دیکھا ہوگا کہ مختلف مہینوں کی اوسط قیمت کچھ اس طرح نظر آتی ہے:
|
|
|
|
|
|
<img alt="Average price by month" src="../../../../translated_images/ur/barchart.a833ea9194346d76.webp" width="50%"/>
|
|
|
|
|
|
یہ ظاہر کرتا ہے کہ کچھ تعلق ہونا چاہیے، اور ہم کوشش کر سکتے ہیں کہ لینیئر ریگریشن ماڈل ٹرین کریں تاکہ تعلق کی پیش گوئی کریں، چاہے وہ `Month` اور `Price` کے درمیان ہو، یا `DayOfYear` اور `Price` کے درمیان۔ یہ اسکیٹر پلاٹ ہے جو بعد والے تعلق کو دکھاتا ہے:
|
|
|
|
|
|
<img alt="Scatter plot of Price vs. Day of Year" src="../../../../translated_images/ur/scatter-dayofyear.bc171c189c9fd553.webp" width="50%" />
|
|
|
|
|
|
آئیے `corr` فنکشن کا استعمال کرکے تعلق دیکھتے ہیں:
|
|
|
|
|
|
```python
|
|
|
print(new_pumpkins['Month'].corr(new_pumpkins['Price']))
|
|
|
print(new_pumpkins['DayOfYear'].corr(new_pumpkins['Price']))
|
|
|
```
|
|
|
|
|
|
|
|
|
دیکھنے میں آتا ہے کہ تعلق کافی کم ہے، `Month` کے لیے -0.15 اور `DayOfMonth` کے لیے -0.17، لیکن ممکن ہے کوئی اور اہم تعلق موجود ہو۔ مختلف کدو کی اقسام کے لیے مختلف قیمتوں کے کلسٹر یعنی گروہ دکھائی دیتے ہیں۔ اس مفروضے کی تصدیق کے لیے، ہر کدو کی قسم کو مختلف رنگ میں پلاٹ کریں۔ `scatter` پلاٹنگ فنکشن کو `ax` پیرامیٹر دے کر ہم تمام نقاط کو ایک ہی گراف پر دکھا سکتے ہیں:
|
|
|
|
|
|
```python
|
|
|
ax=None
|
|
|
colors = ['red','blue','green','yellow']
|
|
|
for i,var in enumerate(new_pumpkins['Variety'].unique()):
|
|
|
df = new_pumpkins[new_pumpkins['Variety']==var]
|
|
|
ax = df.plot.scatter('DayOfYear','Price',ax=ax,c=colors[i],label=var)
|
|
|
```
|
|
|
|
|
|
|
|
|
<img alt="Scatter plot of Price vs. Day of Year" src="../../../../translated_images/ur/scatter-dayofyear-color.65790faefbb9d54f.webp" width="50%" />
|
|
|
|
|
|
ہماری تحقیق ظاہر کرتی ہے کہ مجموعی قیمت پر کدو کی قسم کا اثر فروخت کی تاریخ کے مقابلے میں زیادہ ہے۔ ہم اسے بار گراف سے دیکھ سکتے ہیں:
|
|
|
|
|
|
```python
|
|
|
new_pumpkins.groupby('Variety')['Price'].mean().plot(kind='bar')
|
|
|
```
|
|
|
|
|
|
|
|
|
<img alt="Bar graph of price vs variety" src="../../../../translated_images/ur/price-by-variety.744a2f9925d9bcb4.webp" width="50%" />
|
|
|
|
|
|
ذرا اب ہم صرف ایک کدو کی قسم، 'pie type' پر توجہ دیں اور دیکھیں کہ قیمت پر تاریخ کا کیا اثر ہے:
|
|
|
|
|
|
```python
|
|
|
pie_pumpkins = new_pumpkins[new_pumpkins['Variety']=='PIE TYPE']
|
|
|
pie_pumpkins.plot.scatter('DayOfYear','Price')
|
|
|
```
|
|
|
|
|
|
|
|
|
<img alt="Scatter plot of Price vs. Day of Year" src="../../../../translated_images/ur/pie-pumpkins-scatter.d14f9804a53f927e.webp" width="50%" />
|
|
|
|
|
|
اگر ہم اب `Price` اور `DayOfYear` کے درمیان تعلق `corr` فنکشن سے حساب کریں، تو ہمیں تقریباً `-0.27` ملے گا — جس کا مطلب ہے کہ پیشین گوئی والا ماڈل تیار کرنا معقول ہے۔
|
|
|
|
|
|
> لینیئر ریگریشن ماڈل کی تربیت سے پہلے، یہ ضروری ہے کہ ہمارا ڈیٹا صاف ہو۔ لینیئر ریگریشن خالی قدرات کے ساتھ اچھا کام نہیں کرتا، اس لیے سبھی خالی خانوں کو ہٹانا منطقی ہے:
|
|
|
|
|
|
```python
|
|
|
pie_pumpkins.dropna(inplace=True)
|
|
|
pie_pumpkins.info()
|
|
|
```
|
|
|
|
|
|
|
|
|
ایک اور طریقہ یہ ہو سکتا ہے کہ خالی قدروں کو متعلقہ کالم کی اوسط قیمت سے بھر دیا جائے۔
|
|
|
|
|
|
## سادہ لینیئر ریگریشن
|
|
|
|
|
|
[](https://youtu.be/e4c_UP2fSjg "ML for beginners - Linear and Polynomial Regression using Scikit-learn")
|
|
|
|
|
|
> 🎥 لینیئر اور پولی نومیل ریگریشن کے مختصر ویڈیو جائزے کے لیے اوپر تصویر پر کلک کریں۔
|
|
|
|
|
|
اپنا لینیئر ریگریشن ماڈل تیار کرنے کے لیے ہم **Scikit-learn** لائبریری کا استعمال کریں گے۔
|
|
|
|
|
|
```python
|
|
|
from sklearn.linear_model import LinearRegression
|
|
|
from sklearn.metrics import mean_squared_error
|
|
|
from sklearn.model_selection import train_test_split
|
|
|
```
|
|
|
|
|
|
|
|
|
ہم ان پٹ ویلیوز (خصوصیات) اور متوقع آؤٹ پٹ (لیبل) کو الگ الگ numpy arrays میں تقسیم کرنا شروع کرتے ہیں:
|
|
|
|
|
|
```python
|
|
|
X = pie_pumpkins['DayOfYear'].to_numpy().reshape(-1,1)
|
|
|
y = pie_pumpkins['Price']
|
|
|
```
|
|
|
|
|
|
|
|
|
> نوٹ کریں کہ ہمیں ان پٹ ڈیٹا پر `reshape` کرنا پڑا تاکہ لینیئر ریگریشن پیکیج اسے صحیح طریقے سے سمجھ سکے۔ لینیئر ریگریشن کو 2D-array کی توقع ہوتی ہے، جس میں ہر صف میں ان پٹ خصوصیات کا ویکٹر ہوتا ہے۔ ہمارے معاملے میں چونکہ صرف ایک ان پٹ ہے، ہمیں N×1 کا array بنانا ہوتا ہے، جہاں N ڈیٹا سیٹ کا سائز ہے۔
|
|
|
|
|
|
اس کے بعد، ہمیں تربیتی اور امتحانی ڈیٹا کو تقسیم کرنا ہوگا تاکہ ماڈل کی تربیت کے بعد ہم اسے جانچ سکیں:
|
|
|
|
|
|
```python
|
|
|
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
|
|
|
```
|
|
|
|
|
|
|
|
|
آخر میں، اصل میں لینیئر ریگریشن ماڈل کی تربیت صرف دو لائنوں میں ہوتی ہے۔ ہم `LinearRegression` آبجیکٹ کی تعریف کرتے ہیں، اور `fit` میتھڈ کے استعمال سے اسے ہمارے ڈیٹا پر فٹ کرتے ہیں:
|
|
|
|
|
|
```python
|
|
|
lin_reg = LinearRegression()
|
|
|
lin_reg.fit(X_train,y_train)
|
|
|
```
|
|
|
|
|
|
`LinearRegression` آبجیکٹ `fit` کرنے کے بعد تمام ریگریشن کے کو ایفیشئنٹس پر مشتمل ہوتا ہے، جس تک `.coef_` پراپرٹی کے ذریعے رسائی حاصل کی جا سکتی ہے۔ ہمارے کیس میں، صرف ایک کو ایفیشئنٹ ہے، جو کہ تقریباً `-0.017` ہونا چاہیے۔ اس کا مطلب ہے کہ وقت کے ساتھ قیمتوں میں کچھ کمی آتی ہے، لیکن زیادہ نہیں، تقریباً روزانہ 2 سینٹ کے آس پاس۔ ہم ریگریشن کی Y-محور کے ساتھ انٹرسیکشن پوائنٹ تک `lin_reg.intercept_` کے ذریعے بھی رسائی حاصل کر سکتے ہیں - جو ہمارے کیس میں تقریباً `21` ہوگا، جو سال کی شروعات میں قیمت کی نشاندہی کرتا ہے۔
|
|
|
|
|
|
ہم دیکھ سکتے ہیں کہ ہمارا ماڈل کتنا درست ہے، ہم ایک ٹیسٹ ڈیٹا سیٹ پر قیمتوں کی پیش گوئی کر سکتے ہیں، اور پھر دیکھ سکتے ہیں کہ ہماری پیش گوئیاں متوقع قدروں کے کتنی قریب ہیں۔ یہ کام متوسط مربع غلطی (MSE) میٹرک کے ذریعے کیا جا سکتا ہے، جو متوقع اور پیش گوئی شدہ قیمت کے درمیان تمام مربع فرق کا اوسط ہے۔
|
|
|
|
|
|
```python
|
|
|
pred = lin_reg.predict(X_test)
|
|
|
|
|
|
mse = np.sqrt(mean_squared_error(y_test,pred))
|
|
|
print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)')
|
|
|
```
|
|
|
|
|
|
ہماری غلطی تقریباً 2 پوائنٹس کے آس پاس ہے، جو کہ ~17% ہے۔ زیادہ اچھا نہیں۔ ماڈل کے معیار کا ایک اور اشارہ **coefficient of determination** ہے، جو اس طرح حاصل کیا جا سکتا ہے:
|
|
|
|
|
|
```python
|
|
|
score = lin_reg.score(X_train,y_train)
|
|
|
print('Model determination: ', score)
|
|
|
```
|
|
|
|
|
|
اگر یہ قدر 0 ہو تو اس کا مطلب ہے کہ ماڈل ان پٹ ڈیٹا کو مدنظر نہیں رکھتا، اور *بدترین خطی پیش گو* کے طور پر کام کرتا ہے، جو کہ بس نتیجے کی اوسط قدر ہوتی ہے۔ اگر قدر 1 ہو تو مطلب ہے کہ ہم تمام متوقع نتائج کو بالکل درست پیش گوئی کر سکتے ہیں۔ ہمارے کیس میں، کو ایفیشئنٹ تقریباً 0.06 ہے، جو کہ کافی کم ہے۔
|
|
|
|
|
|
ہم ریگریشن لائن کے ساتھ ٹیسٹ ڈیٹا کو بھی پلاٹ کر سکتے ہیں تاکہ یہ بہتر طور پر دیکھا جا سکے کہ ہمارا ریگریشن کس طرح کام کر رہا ہے:
|
|
|
|
|
|
```python
|
|
|
plt.scatter(X_test,y_test)
|
|
|
plt.plot(X_test,pred)
|
|
|
```
|
|
|
|
|
|
<img alt="Linear regression" src="../../../../translated_images/ur/linear-results.f7c3552c85b0ed1c.webp" width="50%" />
|
|
|
|
|
|
## پولینومیل ریگریشن
|
|
|
|
|
|
دوسری قسم کی خطی رجریشن پولینومیل ریگریشن ہے۔ کبھی کبھی متغیرات کے درمیان ایک خطی تعلق ہوتا ہے - جتنا بڑا کدو حجم میں، اتنی زیادہ قیمت - لیکن بعض اوقات یہ تعلقات ایک طیارہ یا سیدھی لائن کی صورت میں ظاہر نہیں ہو سکتے۔
|
|
|
|
|
|
✅ یہاں [مزید چند مثالیں](https://online.stat.psu.edu/stat501/lesson/9/9.8) موجود ہیں جن میں پولینومیل ریگریشن استعمال ہو سکتی ہے۔
|
|
|
|
|
|
تاریخ اور قیمت کے تعلق پر دوبارہ نظر ڈالیں۔ کیا یہ اسکیٹر پلاٹ واقعی ایک سیدھی لائن کے ذریعے تجزیہ کرنا ضروری ہے؟ کیا قیمتیں اتار چڑھاؤ نہیں کر سکتی؟ اس صورت میں، آپ پولینومیل ریگریشن آزما سکتے ہیں۔
|
|
|
|
|
|
✅ پولینومیل ریگریشن ریاضیاتی اظہار ہوتے ہیں جو ایک یا زیادہ متغیرات اور کو ایفیشئنٹس پر مشتمل ہو سکتے ہیں۔
|
|
|
|
|
|
پولینومیل ریگریشن ایک خم دار لائن تخلیق کرتی ہے تاکہ غیر خطی ڈیٹا کے لیے بہتر فٹ ہو سکے۔ ہمارے کیس میں، اگر ہم ان پٹ ڈیٹا میں ایک مربع `DayOfYear` متغیر شامل کریں، تو ہم اپنے ڈیٹا کو ایک یوریک نما منحنی کے ساتھ فٹ کر سکیں گے، جس کا ایک مخصوص مقام پر سال کے دوران کم سے کم ہوتا ہے۔
|
|
|
|
|
|
Scikit-learn ایک مددگار [پائپ لائن API](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.make_pipeline.html?highlight=pipeline#sklearn.pipeline.make_pipeline) فراہم کرتا ہے تاکہ ڈیٹا پراسیسنگ کے مختلف مراحل کو ملایا جا سکے۔ ایک **پائپ لائن** **اسٹی میٹرز** کی ایک زنجیر ہے۔ ہمارے کیس میں، ہم ایک پائپ لائن بنائیں گے جو پہلے پولینومیل خصوصیات ماڈل میں شامل کرے گا، اور پھر ریگریشن کو ٹرین کرے گا:
|
|
|
|
|
|
```python
|
|
|
from sklearn.preprocessing import PolynomialFeatures
|
|
|
from sklearn.pipeline import make_pipeline
|
|
|
|
|
|
pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())
|
|
|
|
|
|
pipeline.fit(X_train,y_train)
|
|
|
```
|
|
|
|
|
|
`PolynomialFeatures(2)` کا استعمال مطلب ہے کہ ہم ان پٹ ڈیٹا سے تمام دوسرے درجے کے پولینومیلز شامل کریں گے۔ ہمارے کیس میں یہ صرف `DayOfYear`<sup>2</sup> ہوگا، لیکن اگر دو ان پٹ متغیرات X اور Y ہوں، تو یہ X<sup>2</sup>، XY، اور Y<sup>2</sup> شامل کرے گا۔ ہم چاہیں تو بلند درجے کے پولینومیلز بھی استعمال کر سکتے ہیں۔
|
|
|
|
|
|
پائپ لائنز کو اصل `LinearRegression` آبجیکٹ کی طرح استعمال کیا جا سکتا ہے، یعنی ہم پائپ لائن کو `fit` کر سکتے ہیں، اور پھر پیش گوئیاں حاصل کرنے کے لیے `predict` استعمال کر سکتے ہیں۔ یہاں گراف ہے جو ٹیسٹ ڈیٹا اور اپروکسی میشن منحنی کو دکھاتا ہے:
|
|
|
|
|
|
<img alt="Polynomial regression" src="../../../../translated_images/ur/poly-results.ee587348f0f1f60b.webp" width="50%" />
|
|
|
|
|
|
پولینومیل ریگریشن کا استعمال کرتے ہوئے، ہم تھوڑی کم MSE اور زیادہ کو ایفیشئنٹ آف ڈیٹرمنیشن حاصل کر سکتے ہیں، لیکن بہت زیادہ فرق نہیں۔ ہمیں دیگر خصوصیات کو بھی مدنظر رکھنا ہوگا!
|
|
|
|
|
|
> آپ دیکھ سکتے ہیں کہ سب سے کم کدو کی قیمتیں تقریباً ہالووین کے ارد گرد دیکھی جاتی ہیں۔ آپ اس کی وضاحت کیسے کریں گے؟
|
|
|
|
|
|
🎃 مبارک ہو، آپ نے ایک ایسا ماڈل بنایا ہے جو پای کدو کی قیمت کی پیش گوئی میں مدد کر سکتا ہے۔ آپ شاید یہ عمل تمام قسم کے کدو کے لیے دہرائیں، لیکن یہ تھکا دینے والا ہوگا۔ اب سیکھیں کہ ہم اپنے ماڈل میں کدو کی قسم کو کیسے شامل کریں!
|
|
|
|
|
|
## زمرہ جاتی خصوصیات (Categorical Features)
|
|
|
|
|
|
ایک مثالی دنیا میں، ہم چاہتے ہیں کہ ہم مختلف کدو کی اقسام کے لیے قیمتیں ایک ہی ماڈل سے پیش گوئی کر سکیں۔ تاہم، `Variety` کالم دیگر کالموں جیسے `Month` سے کچھ مختلف ہے کیونکہ اس میں غیر عددی (non-numeric) اقدار ہوتی ہیں۔ ایسے کالمز کو **زمرہ جاتی** کہتے ہیں۔
|
|
|
|
|
|
[](https://youtu.be/DYGliioIAE0 "ML for beginners - Categorical Feature Predictions with Linear Regression")
|
|
|
|
|
|
> 🎥 اوپر دی گئی تصویر پر کلک کریں تاکہ زمرہ جاتی خصوصیات کے استعمال کا مختصر ویڈیو جائزہ دیکھا جا سکے۔
|
|
|
|
|
|
یہاں آپ دیکھ سکتے ہیں کہ اوسط قیمت کس طرح قسم پر منحصر ہے:
|
|
|
|
|
|
<img alt="Average price by variety" src="../../../../translated_images/ur/price-by-variety.744a2f9925d9bcb4.webp" width="50%" />
|
|
|
|
|
|
قسم کو مدنظر رکھنے کے لیے، ہمیں پہلے اسے عددی صورت میں تبدیل کرنا یا **انکوڈ** کرنا ہوگا۔ اس کے لیے چند طریقے ہیں:
|
|
|
|
|
|
* سادہ **عددی انکوڈنگ** میں مختلف اقسام کی ایک جدول بنائی جاتی ہے، اور پھر قسم کے نام کی جگہ اس جدول میں اس کا انڈیکس لے لیتا ہے۔ یہ خطی ریگریشن کے لیے بہترین خیال نہیں ہے، کیونکہ خطی ریگریشن انڈیکس کی اصل عددی قدر لیتا ہے اور کسی کو ایفیشئنٹ سے ضرب دے کر نتیجہ میں شامل کر دیتا ہے۔ ہمارے کیس میں انڈیکس نمبر اور قیمت کے درمیان تعلق واضح طور پر غیر خطی ہے، چاہے ہم انڈیکس کو کسی مخصوص ترتیب میں رکھیں۔
|
|
|
* **ون ہاٹ انکوڈنگ** `Variety` کالم کو 4 مختلف کالموں میں تبدیل کر دے گی، ہر قسم کے لیے ایک۔ ہر کالم میں `1` ہوگا اگر متعلقہ قطار مخصوص قسم کی ہو، ورنہ `0` ہوگا۔ اس کا مطلب ہے کہ خطی ریگریشن میں چار کو ایفیشئنٹس ہوں گے، ہر کدو کی قسم کے لیے ایک، جو اس خاص قسم کی "نکڑ قیمت" (یا اضافی قیمت) کے لیے ذمہ دار ہوگا۔
|
|
|
|
|
|
ذیل میں کوڈ دکھاتا ہے کہ ہم قسم کو ون ہاٹ انکوڈ کیسے کر سکتے ہیں:
|
|
|
|
|
|
```python
|
|
|
pd.get_dummies(new_pumpkins['Variety'])
|
|
|
```
|
|
|
|
|
|
ID | FAIRYTALE | MINIATURE | MIXED HEIRLOOM VARIETIES | PIE TYPE
|
|
|
----|-----------|-----------|--------------------------|----------
|
|
|
70 | 0 | 0 | 0 | 1
|
|
|
71 | 0 | 0 | 0 | 1
|
|
|
... | ... | ... | ... | ...
|
|
|
1738 | 0 | 1 | 0 | 0
|
|
|
1739 | 0 | 1 | 0 | 0
|
|
|
1740 | 0 | 1 | 0 | 0
|
|
|
1741 | 0 | 1 | 0 | 0
|
|
|
1742 | 0 | 1 | 0 | 0
|
|
|
|
|
|
ون ہاٹ انکوڈ شدہ قسم کو ان پٹ کے طور پر استعمال کرتے ہوئے خطی ریگریشن کو ٹرین کرنے کے لیے، ہمیں صرف `X` اور `y` ڈیٹا درست طریقے سے initialize کرنا ہوگا:
|
|
|
|
|
|
```python
|
|
|
X = pd.get_dummies(new_pumpkins['Variety'])
|
|
|
y = new_pumpkins['Price']
|
|
|
```
|
|
|
|
|
|
باقی کوڈ وہی ہے جو ہم نے پہلے خطی ریگریشن تربیت کے لیے استعمال کیا تھا۔ اگر آپ آزمائیں، تو دیکھیں گے کہ متوسط مربع غلطی تقریباً برابر ہے، لیکن ہمیں کو ایفیشئنٹ آف ڈیٹرمنیشن زیادہ ملتا ہے (~77%)۔ مزید درست پیش گوئی کے لیے، ہم مزید زمرہ جاتی خصوصیات اور عددی خصوصیات جیسے `Month` یا `DayOfYear` کو مدنظر لے سکتے ہیں۔ بڑی خصوصیات کے ایک مجموعے کو حاصل کرنے کے لیے ہم `join` استعمال کر سکتے ہیں:
|
|
|
|
|
|
```python
|
|
|
X = pd.get_dummies(new_pumpkins['Variety']) \
|
|
|
.join(new_pumpkins['Month']) \
|
|
|
.join(pd.get_dummies(new_pumpkins['City'])) \
|
|
|
.join(pd.get_dummies(new_pumpkins['Package']))
|
|
|
y = new_pumpkins['Price']
|
|
|
```
|
|
|
|
|
|
یہاں ہم `City` اور `Package` کی قسم کو بھی مدنظر لیتے ہیں، جس سے ہمیں MSE 2.84 (10%) اور کو ایفیشئنٹ آف ڈیٹرمنیشن 0.94 ملتا ہے!
|
|
|
|
|
|
## سب کچھ ملانا
|
|
|
|
|
|
بہترین ماڈل بنانے کے لیے، ہم مشترکہ (ون ہاٹ انکوڈ کی گئی زمرہ جاتی + عددی) ڈیٹا کو پولینومیل ریگریشن کے ساتھ استعمال کر سکتے ہیں۔ آپ کی سہولت کے لیے مکمل کوڈ یہ ہے:
|
|
|
|
|
|
```python
|
|
|
# تربیتی ڈیٹا مرتب کریں
|
|
|
X = pd.get_dummies(new_pumpkins['Variety']) \
|
|
|
.join(new_pumpkins['Month']) \
|
|
|
.join(pd.get_dummies(new_pumpkins['City'])) \
|
|
|
.join(pd.get_dummies(new_pumpkins['Package']))
|
|
|
y = new_pumpkins['Price']
|
|
|
|
|
|
# تربیت اور ٹیسٹ کے لیے تقسیم کریں
|
|
|
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
|
|
|
|
|
|
# پائپ لائن ترتیب دیں اور تربیت دیں
|
|
|
pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())
|
|
|
pipeline.fit(X_train,y_train)
|
|
|
|
|
|
# ٹیسٹ ڈیٹا کے لیے نتائج کی پیشن گوئی کریں
|
|
|
pred = pipeline.predict(X_test)
|
|
|
|
|
|
# MSE اور تعین کریں حساب لگائیں
|
|
|
mse = np.sqrt(mean_squared_error(y_test,pred))
|
|
|
print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)')
|
|
|
|
|
|
score = pipeline.score(X_train,y_train)
|
|
|
print('Model determination: ', score)
|
|
|
```
|
|
|
|
|
|
یہ تقریباً 97% تک بہترین کو ایفیشئنٹ آف ڈیٹرمنیشن اور MSE=2.23 (~8% پیش گوئی غلطی) دے گا۔
|
|
|
|
|
|
| ماڈل | MSE | کو ایفیشئنٹ آف ڈیٹرمنیشن |
|
|
|
|-------|-----|---------------|
|
|
|
| `DayOfYear` خطی | 2.77 (17.2%) | 0.07 |
|
|
|
| `DayOfYear` پولینومیل | 2.73 (17.0%) | 0.08 |
|
|
|
| `Variety` خطی | 5.24 (19.7%) | 0.77 |
|
|
|
| تمام خصوصیات خطی | 2.84 (10.5%) | 0.94 |
|
|
|
| تمام خصوصیات پولینومیل | 2.23 (8.25%) | 0.97 |
|
|
|
|
|
|
🏆 عمدہ! آپ نے ایک ہی سبق میں چار ریگریشن ماڈلز بنائے، اور ماڈل کا معیار 97% تک بہتر بنایا۔ ریگریشن کے آخری حصے میں آپ لاجسٹک ریگریشن کے بارے میں جانیں گے تاکہ زمرہ جات کی تعیین کی جا سکے۔
|
|
|
|
|
|
---
|
|
|
## 🚀چیلنج
|
|
|
|
|
|
اس نوٹ بک میں مختلف متغیرات کو آزما کر دیکھیں کہ کوریلیشن ماڈل کی درستگی کے ساتھ کیسے متوازی ہے۔
|
|
|
|
|
|
## [لیکچر کے بعد کا کوئز](https://ff-quizzes.netlify.app/en/ml/)
|
|
|
|
|
|
## جائزہ اور خود مطالعہ
|
|
|
|
|
|
اس سبق میں ہم نے خطی ریگریشن کے بارے میں سیکھا۔ دیگر اہم اقسام کی ریگریشن بھی موجود ہیں۔ Stepwise، Ridge، Lasso اور Elasticnet تکنیکوں کے بارے میں پڑھیں۔ مزید سیکھنے کے لیے ایک اچھا کورس [Stanford Statistical Learning course](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning) ہے۔
|
|
|
|
|
|
## اسائنمنٹ
|
|
|
|
|
|
[ایک ماڈل بنائیں](assignment.md)
|
|
|
|
|
|
---
|
|
|
|
|
|
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
|
|
**ڈسکلیمر**:
|
|
|
اس دستاویز کا ترجمہ AI ترجمہ سروس [Co-op Translator](https://github.com/Azure/co-op-translator) کے ذریعے کیا گیا ہے۔ اگرچہ ہم درستگی کی کوشش کرتے ہیں، براہ کرم آگاہ رہیں کہ خودکار تراجم میں غلطیاں یا غلط فہمیاں ہو سکتی ہیں۔ اصل دستاویز اپنی مادری زبان میں مستند ذریعہ سمجھا جائے گا۔ اہم معلومات کے لیے پیشہ ور انسانی ترجمہ کی سفارش کی جاتی ہے۔ اس ترجمہ کے استعمال سے پیدا ہونے والے کسی بھی غلط فہمی یا غلط تعبیر کی ذمہ داری ہم پر نہیں ہوگی۔
|
|
|
<!-- CO-OP TRANSLATOR DISCLAIMER END --> |