|
|
3 months ago | |
|---|---|---|
| .. | ||
| solution | 4 months ago | |
| README.md | 3 months ago | |
| assignment.md | 4 months ago | |
| notebook.ipynb | 9 months ago | |
README.md
سکائیکیٹ-لرن کا استعمال کرتے ہوئے ریگریشن ماڈل بنائیں: ریگریشن کے چار طریقے
ابتدائی نوٹ
لینیئر ریگریشن اُس وقت استعمال کی جاتی ہے جب ہم عددی قیمت کی پیش گوئی کرنا چاہتے ہیں (مثلاً، گھر کی قیمت، درجہ حرارت، یا فروخت)۔ یہ کام اس طرح کرتا ہے کہ وہ ایک سیدھی لائن تلاش کرتا ہے جو ان پٹ خصوصیات اور آؤٹ پٹ کے درمیان تعلق کی بہترین نمائندگی کرتی ہو۔
اس سبق میں، ہم بنیادی تصور کو سمجھنے پر توجہ دیتے ہیں اس سے پہلے کہ ہم مزید ترقی یافتہ ریگریشن تکنیکوں کو دریافت کریں۔

انفراگرافک از دسنی مدیپالی
سبق سے پہلے کوئز
یہ سبق R میں بھی دستیاب ہے!
تعارف
اب تک آپ نے ریگریشن کیا ہے، اُس کا جائزہ لیا ہے اور اس مثال کے لیے کدو کی قیمتوں کا ڈیٹا استعمال کیا ہے جسے ہم اس سبق میں بار بار استعمال کریں گے۔ آپ نے اسے میٹ پلوٹ لائب کا استعمال کرتے ہوئے بھی دیکھا ہے۔
اب آپ مشین لرننگ کے لیے ریگریشن میں مزید گہرائی سے جا سکتے ہیں۔ جہاں تجزیاتی تصویر کشی (ویژولائزیشن) آپ کو ڈیٹا کو سمجھنے میں مدد دیتی ہے، مشین لرننگ کی اصل طاقت ماڈلز کی تربیت سے آتی ہے۔ ماڈلز تاریخی ڈیٹا پر تربیت دیے جاتے ہیں تاکہ خود بخود ڈیٹا کے باہمی تعلقات کو سمجھ سکیں، اور یہ آپ کو نئے ڈیٹا کے لیے نتائج کی پیش گوئی کرنے کی اجازت دیتے ہیں جو ماڈل نے پہلے نہیں دیکھا۔
اس سبق میں، آپ دو اقسام کی ریگریشن کے بارے میں مزید سیکھیں گے: بنیادی لینیئر ریگریشن اور پولی نومیل ریگریشن، ساتھ ہی ان تکنیکوں کے پیچھے کچھ ریاضی کے اصول بھی۔ یہ ماڈل ہمیں مختلف ان پٹ ڈیٹا کی بنیاد پر کدو کی قیمتیں پیش گوئی کرنے کی اجازت دیں گے۔
🎥 لینیئر ریگریشن کے مختصر ویڈیو جائزے کے لیے اوپر تصویر پر کلک کریں۔
اس نصاب میں، ہم حساب کی کم سے کم معلومات فرض کرتے ہیں اور اسے دوسرے شعبوں سے آنے والے طلباء کے لیے قابل رسائی بنانے کی کوشش کرتے ہیں، لہٰذا نوٹس، 🧮 حوالہ جات، خاکے، اور دیگر تعلیمی اوزار پر غور کریں جو سمجھنے میں مددگار ہوں۔
پیشگی معلومات
اب تک آپ کو کدو کے ڈیٹا کی ساخت کا اندازہ ہو چکا ہوگا جسے ہم دیکھ رہے ہیں۔ آپ اسے اس سبق کی notebook.ipynb فائل میں قبل از وقت لوڈ اور صاف شدہ پا سکتے ہیں۔ اس فائل میں کدو کی قیمت بوشل کے حساب سے ایک نئے ڈیٹا فریم میں ظاہر کی گئی ہے۔ یقینی بنائیں کہ آپ یہ نوٹ بکس Visual Studio Code میں کرنلز پر چلا سکتے ہیں۔
تیاری
یاد دہانی کے طور پر، آپ یہ ڈیٹا اس لیے لوڈ کر رہے ہیں تاکہ اس سے سوالات کریں۔
- کدو خریدنے کا بہترین وقت کب ہے؟
- چھوٹے کدو کے کیس کی کتنی قیمت متوقع ہے؟
- کیا میں انہیں آدھے بوشل کی ٹوکریوں میں خریدوں یا 1 1/9 بوشل کے ڈبے میں؟ آئیے اس ڈیٹا میں مزید کھوج کریں۔
پچھلے سبق میں، آپ نے پانڈاز ڈیٹا فریم بنایا اور اسے اصل ڈیٹا سیٹ کے ایک حصے سے بھر دیا، قیمتوں کو بوشل کے حساب سے معیاری بنایا۔ تاہم، اس طرح آپ کو صرف تقریباً 400 ڈیٹا پوائنٹس ملے اور وہ بھی صرف خزانی مہینوں کے لیے۔
اس سبق کے ساتھ پیش کیے گئے نوٹ بک میں بھی دیکھیں۔ ڈیٹا پہلے سے لوڈ اور ابتدائی اسکیٹرپلاٹ بنایا گیا ہے جو مہینے کا ڈیٹا دکھاتا ہے۔ ہو سکتا ہے ہم اسے مزید صاف کرکے ڈیٹا کی نوعیت کے بارے میں مزید تفصیل حاصل کر سکیں۔
ایک لینیئر ریگریشن لائن
جیسے آپ نے سبق 1 میں سیکھا، لینیئر ریگریشن مشق کا مقصد ایک لائن کے گراف پر اظہار کرنا ہے تاکہ:
- متغیرات کے تعلقات دکھائیں۔ متغیرات کے تعلق کو ظاہر کریں۔
- پیش گوئیاں کریں۔ صحیح پیش گوئیاں کریں کہ نیا ڈیٹا پوائنٹ اس لائن کے ساتھ کس طرح تعلق رکھے گا۔
یہ معمول ہے کہ لیسٹ سکوائرز ریگریشن ایسی لائن کھینچتی ہے۔ "لیسٹ سکوائرز" اصطلاح ہمارے ماڈل کی کل غلطی کو کم کرنے کے عمل کو بیان کرتی ہے۔ ہر ڈیٹا پوائنٹ کی عمودی فاصلہ (جسے بقایا کہا جاتا ہے) اصل پوائنٹ اور ہماری ریگریشن لائن کے درمیان ناپا جاتا ہے۔
ہم ان فاصلات کو دو اہم وجوہات کی بنا پر مربع کرتے ہیں:
-
سمت کی بجائے مقدار: ہم -5 کی غلطی کو +5 کی غلطی کے برابر سمجھنا چاہتے ہیں۔ مربع کرنے سے تمام قدریں مثبت ہو جاتی ہیں۔
-
آؤٹ لائیرز کی سزا: مربع کرنے سے بڑی غلطیوں کو زیادہ وزن ملتا ہے، جس سے لائن دور موجود نقاط کے قریب رہتی ہے۔
پھر ہم تمام مربع شدہ قدروں کو جمع کرتے ہیں۔ ہمارا مقصد وہ خاص لائن تلاش کرنا ہے جہاں یہ مجموعہ سب سے کم (انتہائی کم سے کم قیمت) ہو — اسی لیے اس کا نام "لیسٹ سکوائرز" ہے۔
🧮 مجھے ریاضی دکھائیں
یہ لائن، جسے بہترین فٹ لائن کہا جاتا ہے، ایک مساوات کے ذریعے بیان کی جا سکتی ہے:
Y = a + bX
X'وضاحتی متغیر' ہے۔Y'تابع متغیر' ہے۔ لائن کا ڈھلوانbہے اورay-انٹرسپٹ ہے، جو اس قیمت کی نمائندگی کرتا ہے جبX = 0ہو۔سب سے پہلے، ڈھلوان
bکا حساب لگائیں۔ انفراگرافک از جن لوپردوسرے الفاظ میں، اور ہمارے کدو ڈیٹا کے اصل سوال کی طرف اشارہ کرتے ہوئے: "مہینے کے حساب سے بوشل قیمت کی پیش گوئی کریں"،
Xقیمت کی نمائندگی کرے گا اورYفروخت کے مہینے کی۔Y کی قیمت کا حساب لگائیں۔ اگر آپ تقریباً $4 ادا کر رہے ہیں، تو یہ لازمی طور پر اپریل ہے! انفراگرافک از جن لوپر
لائن کا حساب لگانے والی ریاضی کو ڈھلوان کا مظاہرہ کرنا چاہیے، جو انٹرسپٹ پر بھی منحصر ہوتا ہے، یعنی جب
X = 0ہو توYکہاں ہوتا ہے۔ان قدروں کے حساب کتاب کا طریقہ آپ Math is Fun ویب سائٹ پر دیکھ سکتے ہیں۔ اس کے علاوہ یہ لِیسٹ-سکوائرز کیلکولیٹر ملاحظہ کریں تاکہ سمجھیں کہ اعداد کی قیمتیں لائن پر کیا اثر ڈالتی ہیں۔
تعلق (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میں دستیاب ہے۔ ہم نے پچھلے سبق کی طرح صفائی کے قدم پورے کیے ہیں اورDayOfYearکالم کا حساب مندرجہ ذیل اظہار سے کیا ہے:
day_of_year = pd.to_datetime(pumpkins['Date']).apply(lambda dt: (dt-datetime(dt.year,1,1)).days)
اب جب کہ آپ کو لینیئر ریگریشن کے پیچھے ریاضی کا علم ہے، آئیں ایک ریگریشن ماڈل بنائیں تاکہ دیکھیں کہ کیا ہم پیش گوئی کر سکتے ہیں کہ کس قسم کا پیکج کدو کی بہترین قیمت رکھے گا۔ کوئی جو چھٹی کے کدو کے پیچ کے لیے کدو خرید رہا ہے، وہ یہ معلومات اپنے خریداری کے انتخاب کو بہتر بنانے کے لیے چاہ سکتا ہے۔
تعلق کی تلاش
🎥 تعلق کے مختصر ویڈیو جائزے کے لیے اوپر تصویر پر کلک کریں۔
پچھلے سبق سے آپ نے شاید دیکھا ہوگا کہ مختلف مہینوں کی اوسط قیمت کچھ اس طرح نظر آتی ہے:
یہ ظاہر کرتا ہے کہ کچھ تعلق ہونا چاہیے، اور ہم کوشش کر سکتے ہیں کہ لینیئر ریگریشن ماڈل ٹرین کریں تاکہ تعلق کی پیش گوئی کریں، چاہے وہ Month اور Price کے درمیان ہو، یا DayOfYear اور Price کے درمیان۔ یہ اسکیٹر پلاٹ ہے جو بعد والے تعلق کو دکھاتا ہے:
آئیے corr فنکشن کا استعمال کرکے تعلق دیکھتے ہیں:
print(new_pumpkins['Month'].corr(new_pumpkins['Price']))
print(new_pumpkins['DayOfYear'].corr(new_pumpkins['Price']))
دیکھنے میں آتا ہے کہ تعلق کافی کم ہے، Month کے لیے -0.15 اور DayOfMonth کے لیے -0.17، لیکن ممکن ہے کوئی اور اہم تعلق موجود ہو۔ مختلف کدو کی اقسام کے لیے مختلف قیمتوں کے کلسٹر یعنی گروہ دکھائی دیتے ہیں۔ اس مفروضے کی تصدیق کے لیے، ہر کدو کی قسم کو مختلف رنگ میں پلاٹ کریں۔ scatter پلاٹنگ فنکشن کو ax پیرامیٹر دے کر ہم تمام نقاط کو ایک ہی گراف پر دکھا سکتے ہیں:
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)
ہماری تحقیق ظاہر کرتی ہے کہ مجموعی قیمت پر کدو کی قسم کا اثر فروخت کی تاریخ کے مقابلے میں زیادہ ہے۔ ہم اسے بار گراف سے دیکھ سکتے ہیں:
new_pumpkins.groupby('Variety')['Price'].mean().plot(kind='bar')
ذرا اب ہم صرف ایک کدو کی قسم، 'pie type' پر توجہ دیں اور دیکھیں کہ قیمت پر تاریخ کا کیا اثر ہے:
pie_pumpkins = new_pumpkins[new_pumpkins['Variety']=='PIE TYPE']
pie_pumpkins.plot.scatter('DayOfYear','Price')
اگر ہم اب Price اور DayOfYear کے درمیان تعلق corr فنکشن سے حساب کریں، تو ہمیں تقریباً -0.27 ملے گا — جس کا مطلب ہے کہ پیشین گوئی والا ماڈل تیار کرنا معقول ہے۔
لینیئر ریگریشن ماڈل کی تربیت سے پہلے، یہ ضروری ہے کہ ہمارا ڈیٹا صاف ہو۔ لینیئر ریگریشن خالی قدرات کے ساتھ اچھا کام نہیں کرتا، اس لیے سبھی خالی خانوں کو ہٹانا منطقی ہے:
pie_pumpkins.dropna(inplace=True)
pie_pumpkins.info()
ایک اور طریقہ یہ ہو سکتا ہے کہ خالی قدروں کو متعلقہ کالم کی اوسط قیمت سے بھر دیا جائے۔
سادہ لینیئر ریگریشن
🎥 لینیئر اور پولی نومیل ریگریشن کے مختصر ویڈیو جائزے کے لیے اوپر تصویر پر کلک کریں۔
اپنا لینیئر ریگریشن ماڈل تیار کرنے کے لیے ہم Scikit-learn لائبریری کا استعمال کریں گے۔
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
ہم ان پٹ ویلیوز (خصوصیات) اور متوقع آؤٹ پٹ (لیبل) کو الگ الگ numpy arrays میں تقسیم کرنا شروع کرتے ہیں:
X = pie_pumpkins['DayOfYear'].to_numpy().reshape(-1,1)
y = pie_pumpkins['Price']
نوٹ کریں کہ ہمیں ان پٹ ڈیٹا پر
reshapeکرنا پڑا تاکہ لینیئر ریگریشن پیکیج اسے صحیح طریقے سے سمجھ سکے۔ لینیئر ریگریشن کو 2D-array کی توقع ہوتی ہے، جس میں ہر صف میں ان پٹ خصوصیات کا ویکٹر ہوتا ہے۔ ہمارے معاملے میں چونکہ صرف ایک ان پٹ ہے، ہمیں N×1 کا array بنانا ہوتا ہے، جہاں N ڈیٹا سیٹ کا سائز ہے۔
اس کے بعد، ہمیں تربیتی اور امتحانی ڈیٹا کو تقسیم کرنا ہوگا تاکہ ماڈل کی تربیت کے بعد ہم اسے جانچ سکیں:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
آخر میں، اصل میں لینیئر ریگریشن ماڈل کی تربیت صرف دو لائنوں میں ہوتی ہے۔ ہم LinearRegression آبجیکٹ کی تعریف کرتے ہیں، اور fit میتھڈ کے استعمال سے اسے ہمارے ڈیٹا پر فٹ کرتے ہیں:
lin_reg = LinearRegression()
lin_reg.fit(X_train,y_train)
LinearRegression آبجیکٹ fit کرنے کے بعد تمام ریگریشن کے کو ایفیشئنٹس پر مشتمل ہوتا ہے، جس تک .coef_ پراپرٹی کے ذریعے رسائی حاصل کی جا سکتی ہے۔ ہمارے کیس میں، صرف ایک کو ایفیشئنٹ ہے، جو کہ تقریباً -0.017 ہونا چاہیے۔ اس کا مطلب ہے کہ وقت کے ساتھ قیمتوں میں کچھ کمی آتی ہے، لیکن زیادہ نہیں، تقریباً روزانہ 2 سینٹ کے آس پاس۔ ہم ریگریشن کی Y-محور کے ساتھ انٹرسیکشن پوائنٹ تک lin_reg.intercept_ کے ذریعے بھی رسائی حاصل کر سکتے ہیں - جو ہمارے کیس میں تقریباً 21 ہوگا، جو سال کی شروعات میں قیمت کی نشاندہی کرتا ہے۔
ہم دیکھ سکتے ہیں کہ ہمارا ماڈل کتنا درست ہے، ہم ایک ٹیسٹ ڈیٹا سیٹ پر قیمتوں کی پیش گوئی کر سکتے ہیں، اور پھر دیکھ سکتے ہیں کہ ہماری پیش گوئیاں متوقع قدروں کے کتنی قریب ہیں۔ یہ کام متوسط مربع غلطی (MSE) میٹرک کے ذریعے کیا جا سکتا ہے، جو متوقع اور پیش گوئی شدہ قیمت کے درمیان تمام مربع فرق کا اوسط ہے۔
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 ہے، جو اس طرح حاصل کیا جا سکتا ہے:
score = lin_reg.score(X_train,y_train)
print('Model determination: ', score)
اگر یہ قدر 0 ہو تو اس کا مطلب ہے کہ ماڈل ان پٹ ڈیٹا کو مدنظر نہیں رکھتا، اور بدترین خطی پیش گو کے طور پر کام کرتا ہے، جو کہ بس نتیجے کی اوسط قدر ہوتی ہے۔ اگر قدر 1 ہو تو مطلب ہے کہ ہم تمام متوقع نتائج کو بالکل درست پیش گوئی کر سکتے ہیں۔ ہمارے کیس میں، کو ایفیشئنٹ تقریباً 0.06 ہے، جو کہ کافی کم ہے۔
ہم ریگریشن لائن کے ساتھ ٹیسٹ ڈیٹا کو بھی پلاٹ کر سکتے ہیں تاکہ یہ بہتر طور پر دیکھا جا سکے کہ ہمارا ریگریشن کس طرح کام کر رہا ہے:
plt.scatter(X_test,y_test)
plt.plot(X_test,pred)
پولینومیل ریگریشن
دوسری قسم کی خطی رجریشن پولینومیل ریگریشن ہے۔ کبھی کبھی متغیرات کے درمیان ایک خطی تعلق ہوتا ہے - جتنا بڑا کدو حجم میں، اتنی زیادہ قیمت - لیکن بعض اوقات یہ تعلقات ایک طیارہ یا سیدھی لائن کی صورت میں ظاہر نہیں ہو سکتے۔
✅ یہاں مزید چند مثالیں موجود ہیں جن میں پولینومیل ریگریشن استعمال ہو سکتی ہے۔
تاریخ اور قیمت کے تعلق پر دوبارہ نظر ڈالیں۔ کیا یہ اسکیٹر پلاٹ واقعی ایک سیدھی لائن کے ذریعے تجزیہ کرنا ضروری ہے؟ کیا قیمتیں اتار چڑھاؤ نہیں کر سکتی؟ اس صورت میں، آپ پولینومیل ریگریشن آزما سکتے ہیں۔
✅ پولینومیل ریگریشن ریاضیاتی اظہار ہوتے ہیں جو ایک یا زیادہ متغیرات اور کو ایفیشئنٹس پر مشتمل ہو سکتے ہیں۔
پولینومیل ریگریشن ایک خم دار لائن تخلیق کرتی ہے تاکہ غیر خطی ڈیٹا کے لیے بہتر فٹ ہو سکے۔ ہمارے کیس میں، اگر ہم ان پٹ ڈیٹا میں ایک مربع DayOfYear متغیر شامل کریں، تو ہم اپنے ڈیٹا کو ایک یوریک نما منحنی کے ساتھ فٹ کر سکیں گے، جس کا ایک مخصوص مقام پر سال کے دوران کم سے کم ہوتا ہے۔
Scikit-learn ایک مددگار پائپ لائن API فراہم کرتا ہے تاکہ ڈیٹا پراسیسنگ کے مختلف مراحل کو ملایا جا سکے۔ ایک پائپ لائن اسٹی میٹرز کی ایک زنجیر ہے۔ ہمارے کیس میں، ہم ایک پائپ لائن بنائیں گے جو پہلے پولینومیل خصوصیات ماڈل میں شامل کرے گا، اور پھر ریگریشن کو ٹرین کرے گا:
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) کا استعمال مطلب ہے کہ ہم ان پٹ ڈیٹا سے تمام دوسرے درجے کے پولینومیلز شامل کریں گے۔ ہمارے کیس میں یہ صرف DayOfYear2 ہوگا، لیکن اگر دو ان پٹ متغیرات X اور Y ہوں، تو یہ X2، XY، اور Y2 شامل کرے گا۔ ہم چاہیں تو بلند درجے کے پولینومیلز بھی استعمال کر سکتے ہیں۔
پائپ لائنز کو اصل LinearRegression آبجیکٹ کی طرح استعمال کیا جا سکتا ہے، یعنی ہم پائپ لائن کو fit کر سکتے ہیں، اور پھر پیش گوئیاں حاصل کرنے کے لیے predict استعمال کر سکتے ہیں۔ یہاں گراف ہے جو ٹیسٹ ڈیٹا اور اپروکسی میشن منحنی کو دکھاتا ہے:
پولینومیل ریگریشن کا استعمال کرتے ہوئے، ہم تھوڑی کم MSE اور زیادہ کو ایفیشئنٹ آف ڈیٹرمنیشن حاصل کر سکتے ہیں، لیکن بہت زیادہ فرق نہیں۔ ہمیں دیگر خصوصیات کو بھی مدنظر رکھنا ہوگا!
آپ دیکھ سکتے ہیں کہ سب سے کم کدو کی قیمتیں تقریباً ہالووین کے ارد گرد دیکھی جاتی ہیں۔ آپ اس کی وضاحت کیسے کریں گے؟
🎃 مبارک ہو، آپ نے ایک ایسا ماڈل بنایا ہے جو پای کدو کی قیمت کی پیش گوئی میں مدد کر سکتا ہے۔ آپ شاید یہ عمل تمام قسم کے کدو کے لیے دہرائیں، لیکن یہ تھکا دینے والا ہوگا۔ اب سیکھیں کہ ہم اپنے ماڈل میں کدو کی قسم کو کیسے شامل کریں!
زمرہ جاتی خصوصیات (Categorical Features)
ایک مثالی دنیا میں، ہم چاہتے ہیں کہ ہم مختلف کدو کی اقسام کے لیے قیمتیں ایک ہی ماڈل سے پیش گوئی کر سکیں۔ تاہم، Variety کالم دیگر کالموں جیسے Month سے کچھ مختلف ہے کیونکہ اس میں غیر عددی (non-numeric) اقدار ہوتی ہیں۔ ایسے کالمز کو زمرہ جاتی کہتے ہیں۔
🎥 اوپر دی گئی تصویر پر کلک کریں تاکہ زمرہ جاتی خصوصیات کے استعمال کا مختصر ویڈیو جائزہ دیکھا جا سکے۔
یہاں آپ دیکھ سکتے ہیں کہ اوسط قیمت کس طرح قسم پر منحصر ہے:
قسم کو مدنظر رکھنے کے لیے، ہمیں پہلے اسے عددی صورت میں تبدیل کرنا یا انکوڈ کرنا ہوگا۔ اس کے لیے چند طریقے ہیں:
- سادہ عددی انکوڈنگ میں مختلف اقسام کی ایک جدول بنائی جاتی ہے، اور پھر قسم کے نام کی جگہ اس جدول میں اس کا انڈیکس لے لیتا ہے۔ یہ خطی ریگریشن کے لیے بہترین خیال نہیں ہے، کیونکہ خطی ریگریشن انڈیکس کی اصل عددی قدر لیتا ہے اور کسی کو ایفیشئنٹ سے ضرب دے کر نتیجہ میں شامل کر دیتا ہے۔ ہمارے کیس میں انڈیکس نمبر اور قیمت کے درمیان تعلق واضح طور پر غیر خطی ہے، چاہے ہم انڈیکس کو کسی مخصوص ترتیب میں رکھیں۔
- ون ہاٹ انکوڈنگ
Varietyکالم کو 4 مختلف کالموں میں تبدیل کر دے گی، ہر قسم کے لیے ایک۔ ہر کالم میں1ہوگا اگر متعلقہ قطار مخصوص قسم کی ہو، ورنہ0ہوگا۔ اس کا مطلب ہے کہ خطی ریگریشن میں چار کو ایفیشئنٹس ہوں گے، ہر کدو کی قسم کے لیے ایک، جو اس خاص قسم کی "نکڑ قیمت" (یا اضافی قیمت) کے لیے ذمہ دار ہوگا۔
ذیل میں کوڈ دکھاتا ہے کہ ہم قسم کو ون ہاٹ انکوڈ کیسے کر سکتے ہیں:
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 کرنا ہوگا:
X = pd.get_dummies(new_pumpkins['Variety'])
y = new_pumpkins['Price']
باقی کوڈ وہی ہے جو ہم نے پہلے خطی ریگریشن تربیت کے لیے استعمال کیا تھا۔ اگر آپ آزمائیں، تو دیکھیں گے کہ متوسط مربع غلطی تقریباً برابر ہے، لیکن ہمیں کو ایفیشئنٹ آف ڈیٹرمنیشن زیادہ ملتا ہے (~77%)۔ مزید درست پیش گوئی کے لیے، ہم مزید زمرہ جاتی خصوصیات اور عددی خصوصیات جیسے Month یا DayOfYear کو مدنظر لے سکتے ہیں۔ بڑی خصوصیات کے ایک مجموعے کو حاصل کرنے کے لیے ہم join استعمال کر سکتے ہیں:
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 ملتا ہے!
سب کچھ ملانا
بہترین ماڈل بنانے کے لیے، ہم مشترکہ (ون ہاٹ انکوڈ کی گئی زمرہ جاتی + عددی) ڈیٹا کو پولینومیل ریگریشن کے ساتھ استعمال کر سکتے ہیں۔ آپ کی سہولت کے لیے مکمل کوڈ یہ ہے:
# تربیتی ڈیٹا مرتب کریں
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% تک بہتر بنایا۔ ریگریشن کے آخری حصے میں آپ لاجسٹک ریگریشن کے بارے میں جانیں گے تاکہ زمرہ جات کی تعیین کی جا سکے۔
🚀چیلنج
اس نوٹ بک میں مختلف متغیرات کو آزما کر دیکھیں کہ کوریلیشن ماڈل کی درستگی کے ساتھ کیسے متوازی ہے۔
لیکچر کے بعد کا کوئز
جائزہ اور خود مطالعہ
اس سبق میں ہم نے خطی ریگریشن کے بارے میں سیکھا۔ دیگر اہم اقسام کی ریگریشن بھی موجود ہیں۔ Stepwise، Ridge، Lasso اور Elasticnet تکنیکوں کے بارے میں پڑھیں۔ مزید سیکھنے کے لیے ایک اچھا کورس Stanford Statistical Learning course ہے۔
اسائنمنٹ
ڈسکلیمر: اس دستاویز کا ترجمہ AI ترجمہ سروس Co-op Translator کے ذریعے کیا گیا ہے۔ اگرچہ ہم درستگی کی کوشش کرتے ہیں، براہ کرم آگاہ رہیں کہ خودکار تراجم میں غلطیاں یا غلط فہمیاں ہو سکتی ہیں۔ اصل دستاویز اپنی مادری زبان میں مستند ذریعہ سمجھا جائے گا۔ اہم معلومات کے لیے پیشہ ور انسانی ترجمہ کی سفارش کی جاتی ہے۔ اس ترجمہ کے استعمال سے پیدا ہونے والے کسی بھی غلط فہمی یا غلط تعبیر کی ذمہ داری ہم پر نہیں ہوگی۔





