|
2 weeks ago | |
---|---|---|
.. | ||
solution | 3 weeks ago | |
README.md | 2 weeks ago | |
assignment.md | 3 weeks ago | |
notebook.ipynb | 3 weeks ago |
README.md
سکائٹ لرن کے ذریعے ریگریشن ماڈل بنائیں: ریگریشن کے چار طریقے
انفوگرافک از دسانی مادیپالی
لیکچر سے پہلے کا کوئز
یہ سبق R میں دستیاب ہے!
تعارف
اب تک آپ نے ریگریشن کے بارے میں جانا ہے، جس میں کدو کی قیمتوں کے ڈیٹا سیٹ سے نمونہ ڈیٹا استعمال کیا گیا ہے، جو ہم اس سبق میں استعمال کریں گے۔ آپ نے اسے میٹپلاٹ لِب کے ذریعے بصری طور پر بھی دیکھا ہے۔
اب آپ مشین لرننگ کے لیے ریگریشن کو مزید گہرائی سے سمجھنے کے لیے تیار ہیں۔ جبکہ بصری تجزیہ ڈیٹا کو سمجھنے میں مدد دیتا ہے، مشین لرننگ کی اصل طاقت ماڈلز کی تربیت میں ہے۔ ماڈلز تاریخی ڈیٹا پر تربیت یافتہ ہوتے ہیں تاکہ ڈیٹا کی وابستگی کو خودکار طور پر سمجھ سکیں، اور یہ آپ کو نئے ڈیٹا کے نتائج کی پیش گوئی کرنے کی اجازت دیتے ہیں، جو ماڈل نے پہلے نہیں دیکھا ہوتا۔
اس سبق میں، آپ ریگریشن کی دو اقسام کے بارے میں مزید جانیں گے: بنیادی لینیئر ریگریشن اور پولینومیل ریگریشن، اور ان تکنیکوں کے پیچھے کچھ ریاضی۔ یہ ماڈلز ہمیں مختلف ان پٹ ڈیٹا کے مطابق کدو کی قیمتوں کی پیش گوئی کرنے کی اجازت دیں گے۔
🎥 اوپر دی گئی تصویر پر کلک کریں تاکہ لینیئر ریگریشن کا مختصر ویڈیو جائزہ دیکھ سکیں۔
اس نصاب میں، ہم ریاضی کے کم سے کم علم کو فرض کرتے ہیں اور طلباء کے لیے اسے قابل رسائی بنانے کی کوشش کرتے ہیں، جو دیگر شعبوں سے آتے ہیں۔ نوٹس، 🧮 کال آؤٹس، ڈایاگرامز، اور دیگر سیکھنے کے اوزار پر نظر رکھیں تاکہ سمجھنے میں مدد ملے۔
پیشگی شرط
اب تک آپ کو کدو کے ڈیٹا کی ساخت سے واقف ہونا چاہیے، جسے ہم جانچ رہے ہیں۔ آپ اسے اس سبق کے notebook.ipynb فائل میں پہلے سے لوڈ اور صاف شدہ حالت میں دیکھ سکتے ہیں۔ اس فائل میں، کدو کی قیمت فی بوشل ایک نئے ڈیٹا فریم میں دکھائی گئی ہے۔ یقینی بنائیں کہ آپ ان نوٹ بکس کو ویژول اسٹوڈیو کوڈ کے کرنلز میں چلا سکتے ہیں۔
تیاری
یاد دہانی کے طور پر، آپ یہ ڈیٹا اس لیے لوڈ کر رہے ہیں تاکہ اس سے سوالات پوچھ سکیں۔
- کدو خریدنے کا بہترین وقت کب ہے؟
- چھوٹے کدو کے کیس کی قیمت کیا ہو سکتی ہے؟
- کیا مجھے انہیں آدھے بوشل کے ٹوکریوں میں خریدنا چاہیے یا 1 1/9 بوشل کے ڈبے میں؟ آئیے اس ڈیٹا میں مزید کھوج کریں۔
پچھلے سبق میں، آپ نے ایک پانڈاز ڈیٹا فریم بنایا اور اسے اصل ڈیٹا سیٹ کے ایک حصے سے بھرا، قیمتوں کو بوشل کے مطابق معیاری بنایا۔ ایسا کرنے سے، تاہم، آپ صرف تقریباً 400 ڈیٹا پوائنٹس جمع کر سکے اور وہ بھی صرف خزاں کے مہینوں کے لیے۔
اس سبق کے ساتھ آنے والے نوٹ بک میں پہلے سے لوڈ شدہ ڈیٹا پر ایک نظر ڈالیں۔ ڈیٹا پہلے سے لوڈ شدہ ہے اور ایک ابتدائی اسکیٹر پلاٹ چارٹ کیا گیا ہے تاکہ مہینے کے ڈیٹا کو دکھایا جا سکے۔ شاید ہم ڈیٹا کی نوعیت کے بارے میں مزید تفصیل حاصل کر سکیں اگر اسے مزید صاف کریں۔
ایک لینیئر ریگریشن لائن
جیسا کہ آپ نے سبق 1 میں سیکھا، لینیئر ریگریشن کی مشق کا مقصد ایک لائن کو پلاٹ کرنا ہے تاکہ:
- متغیرات کے تعلقات دکھائیں۔ متغیرات کے درمیان تعلق دکھائیں
- پیش گوئیاں کریں۔ یہ پیش گوئی کریں کہ ایک نیا ڈیٹا پوائنٹ اس لائن کے تعلق میں کہاں آئے گا۔
یہ عام طور پر لیسٹ-اسکوائرز ریگریشن کے ذریعے اس قسم کی لائن کھینچنے کے لیے کیا جاتا ہے۔ 'لیسٹ-اسکوائرز' کا مطلب ہے کہ ریگریشن لائن کے ارد گرد کے تمام ڈیٹا پوائنٹس کو مربع کیا جاتا ہے اور پھر جمع کیا جاتا ہے۔ مثالی طور پر، وہ حتمی مجموعہ جتنا چھوٹا ہو، اتنا ہی بہتر ہے، کیونکہ ہم غلطیوں کی کم تعداد چاہتے ہیں، یا لیسٹ-اسکوائرز
۔
ہم ایسا اس لیے کرتے ہیں کیونکہ ہم ایک ایسی لائن کا ماڈل بنانا چاہتے ہیں جس کا تمام ڈیٹا پوائنٹس سے کم سے کم مجموعی فاصلہ ہو۔ ہم ان شرائط کو مربع بھی کرتے ہیں کیونکہ ہم اس کی شدت کے بارے میں فکر مند ہیں، نہ کہ اس کی سمت کے بارے میں۔
🧮 مجھے ریاضی دکھائیں
اس لائن، جسے بہترین فٹ کی لائن کہا جاتا ہے، کو ایک مساوات کے ذریعے ظاہر کیا جا سکتا ہے:
Y = a + bX
X
'وضاحتی متغیر' ہے۔Y
'منحصر متغیر' ہے۔ لائن کی ڈھلوانb
ہے اورa
y-انٹرسپٹ ہے، جو اس وقتY
کی قدر کو ظاہر کرتا ہے جبX = 0
ہو۔پہلے، ڈھلوان
b
کا حساب لگائیں۔ انفوگرافک از جین لوپردوسرے الفاظ میں، اور ہمارے کدو کے ڈیٹا کے اصل سوال کا حوالہ دیتے ہوئے: "مہینے کے لحاظ سے کدو کی قیمت فی بوشل کی پیش گوئی کریں"،
X
قیمت کو ظاہر کرے گا اورY
فروخت کے مہینے کو۔
Y
کی قدر کا حساب لگائیں۔ اگر آپ تقریباً $4 ادا کر رہے ہیں، تو یہ اپریل ہونا چاہیے! انفوگرافک از جین لوپرلائن کا حساب لگانے والی ریاضی کو لائن کی ڈھلوان ظاہر کرنی چاہیے، جو انٹرسپٹ پر بھی منحصر ہے، یا جہاں
Y
واقع ہے جبX = 0
۔آپ ان اقدار کے حساب کے طریقے کو Math is Fun ویب سائٹ پر دیکھ سکتے ہیں۔ Least-squares calculator پر بھی جائیں تاکہ دیکھ سکیں کہ نمبروں کی اقدار لائن پر کیسے اثر ڈالتی ہیں۔
تعلق
ایک اور اصطلاح کو سمجھنا ضروری ہے، وہ ہے تعلق کا گتانک دیے گئے X اور Y متغیرات کے درمیان۔ اسکیٹر پلاٹ کا استعمال کرتے ہوئے، آپ اس گتانک کو جلدی سے بصری طور پر دیکھ سکتے ہیں۔ ایک پلاٹ جس میں ڈیٹا پوائنٹس ایک صاف لائن میں بکھرے ہوئے ہوں، اس کا تعلق زیادہ ہوتا ہے، لیکن ایک پلاٹ جس میں ڈیٹا پوائنٹس X اور Y کے درمیان ہر جگہ بکھرے ہوئے ہوں، اس کا تعلق کم ہوتا ہے۔
ایک اچھا لینیئر ریگریشن ماڈل وہ ہوگا جس کا تعلق کا گتانک زیادہ ہو (1 کے قریب ہو، 0 کے مقابلے میں) لیسٹ-اسکوائرز ریگریشن طریقہ کے ساتھ ریگریشن لائن کے ذریعے۔
✅ اس سبق کے ساتھ آنے والے نوٹ بک کو چلائیں اور مہینے سے قیمت کے اسکیٹر پلاٹ کو دیکھیں۔ کیا کدو کی فروخت کے لیے مہینے سے قیمت کا ڈیٹا آپ کے بصری تجزیے کے مطابق زیادہ یا کم تعلق رکھتا ہے؟ کیا یہ تبدیل ہوتا ہے اگر آپ مہینے کے بجائے زیادہ باریک پیمائش استعمال کریں، جیسے سال کا دن (یعنی سال کے آغاز سے دنوں کی تعداد)؟
نیچے دیے گئے کوڈ میں، ہم فرض کریں گے کہ ہم نے ڈیٹا صاف کر لیا ہے، اور ایک ڈیٹا فریم حاصل کیا ہے جسے 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_pumpkins = new_pumpkins[new_pumpkins['Variety']=='PIE TYPE']
pie_pumpkins.plot.scatter('DayOfYear','Price')

اگر ہم اب corr
فنکشن کا استعمال کرتے ہوئے Price
اور DayOfYear
کے درمیان تعلق کا حساب لگائیں، تو ہمیں کچھ -0.27
جیسا ملے گا - جس کا مطلب ہے کہ پیش گوئی کرنے والے ماڈل کی تربیت کرنا معنی رکھتا ہے۔
لینیئر ریگریشن ماڈل کی تربیت سے پہلے، یہ یقینی بنانا ضروری ہے کہ ہمارا ڈیٹا صاف ہے۔ لینیئر ریگریشن خالی اقدار کے ساتھ اچھا کام نہیں کرتا، اس لیے خالی سیلز کو ختم کرنا سمجھ میں آتا ہے:
pie_pumpkins.dropna(inplace=True)
pie_pumpkins.info()
ایک اور طریقہ یہ ہوگا کہ ان خالی اقدار کو متعلقہ کالم سے اوسط اقدار کے ساتھ پُر کریں۔
سادہ لینیئر ریگریشن
🎥 اوپر دی گئی تصویر پر کلک کریں تاکہ لینیئر اور پولینومیل ریگریشن کا مختصر ویڈیو جائزہ دیکھ سکیں۔
اپنے لینیئر ریگریشن ماڈل کی تربیت کے لیے، ہم سکائٹ لرن لائبریری استعمال کریں گے۔
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 کو ان پٹ کے طور پر توقع کرتا ہے، جہاں 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-axis کے ساتھ انٹرسیکشن پوائنٹ تک بھی رسائی حاصل کر سکتے ہیں lin_reg.intercept_
کا استعمال کرتے ہوئے - یہ ہمارے معاملے میں تقریباً 21
ہوگا، جو سال کے آغاز میں قیمت کو ظاہر کرتا ہے۔
یہ دیکھنے کے لیے کہ ہمارا ماڈل کتنا درست ہے، ہم ٹیسٹ ڈیٹا سیٹ پر قیمتوں کی پیش گوئی کر سکتے ہیں، اور پھر یہ پیمائش کر سکتے ہیں کہ ہماری پیش گوئیاں متوقع اقدار کے کتنی قریب ہیں۔ یہ mean square error (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 کا مطلب ہے کہ ہم تمام متوقع نتائج کو مکمل طور پر پیش گوئی کر سکتے ہیں۔ ہمارے معاملے میں، coefficient تقریباً 0.06 ہے، جو کہ کافی کم ہے۔
ہم ٹیسٹ ڈیٹا کو ریگریشن لائن کے ساتھ بھی پلاٹ کر سکتے ہیں تاکہ بہتر طور پر دیکھ سکیں کہ ہمارے معاملے میں ریگریشن کیسے کام کرتا ہے:
plt.scatter(X_test,y_test)
plt.plot(X_test,pred)

پولینومیل ریگریشن
لکیری ریگریشن کی ایک اور قسم پولینومیل ریگریشن ہے۔ کبھی کبھار متغیرات کے درمیان لکیری تعلق ہوتا ہے - جیسے کدو کا حجم جتنا بڑا ہوگا، قیمت اتنی زیادہ ہوگی - لیکن کبھی کبھار ان تعلقات کو ایک سیدھی لائن یا سطح کے طور پر پلاٹ نہیں کیا جا سکتا۔
✅ یہاں کچھ مزید مثالیں ہیں جو پولینومیل ریگریشن استعمال کر سکتی ہیں۔
تاریخ اور قیمت کے تعلق پر دوبارہ نظر ڈالیں۔ کیا یہ scatterplot ایسا لگتا ہے کہ اسے لازمی طور پر ایک سیدھی لائن کے ذریعے تجزیہ کیا جانا چاہیے؟ کیا قیمتیں اتار چڑھاؤ نہیں کر سکتیں؟ اس صورت میں، آپ پولینومیل ریگریشن آزما سکتے ہیں۔
✅ پولینومیلز ریاضیاتی اظہار ہیں جو ایک یا زیادہ متغیرات اور coefficients پر مشتمل ہو سکتے ہیں۔
پولینومیل ریگریشن ایک خمیدہ لائن بناتا ہے تاکہ غیر لکیری ڈیٹا کو بہتر طور پر فٹ کیا جا سکے۔ ہمارے معاملے میں، اگر ہم ان پٹ ڈیٹا میں DayOfYear
متغیر کو مربع کریں، تو ہم اپنے ڈیٹا کو ایک parabolic curve کے ساتھ فٹ کر سکتے ہیں، جس کا ایک کم از کم نقطہ سال کے اندر ہوگا۔
Scikit-learn ایک مفید pipeline API شامل کرتا ہے تاکہ ڈیٹا پروسیسنگ کے مختلف مراحل کو ایک ساتھ جوڑا جا سکے۔ پائپ لائن estimators کی ایک زنجیر ہے۔ ہمارے معاملے میں، ہم ایک پائپ لائن بنائیں گے جو پہلے ہمارے ماڈل میں پولینومیل فیچرز شامل کرے گی، اور پھر ریگریشن کو تربیت دے گی:
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
2 ہوگا، لیکن دو ان پٹ متغیرات X اور Y دیے گئے، یہ X2, XY اور Y2 شامل کرے گا۔ اگر ہم چاہیں تو ہم اعلی درجے کے پولینومیلز بھی استعمال کر سکتے ہیں۔
پائپ لائنز کو اسی طرح استعمال کیا جا سکتا ہے جیسے اصل LinearRegression
آبجیکٹ، یعنی ہم پائپ لائن کو fit
کر سکتے ہیں، اور پھر predict
استعمال کر کے پیش گوئی کے نتائج حاصل کر سکتے ہیں۔ یہاں گراف ہے جو ٹیسٹ ڈیٹا اور approximation curve دکھاتا ہے:

پولینومیل ریگریشن استعمال کرتے ہوئے، ہم قدرے کم MSE اور زیادہ determination حاصل کر سکتے ہیں، لیکن زیادہ نہیں۔ ہمیں دیگر فیچرز کو مدنظر رکھنا ہوگا!
آپ دیکھ سکتے ہیں کہ کدو کی کم از کم قیمتیں کہیں ہالووین کے ارد گرد دیکھی جاتی ہیں۔ آپ اس کی وضاحت کیسے کریں گے؟
🎃 مبارک ہو، آپ نے ایک ماڈل بنایا ہے جو پائی کدو کی قیمت کی پیش گوئی کرنے میں مدد کر سکتا ہے۔ آپ شاید تمام کدو کی اقسام کے لیے یہی طریقہ کار دہرا سکتے ہیں، لیکن یہ تھکا دینے والا ہوگا۔ آئیے اب سیکھتے ہیں کہ اپنے ماڈل میں کدو کی قسم کو کیسے مدنظر رکھا جائے!
کیٹیگوریکل فیچرز
ایک مثالی دنیا میں، ہم مختلف کدو کی اقسام کے لیے قیمتوں کی پیش گوئی کرنے کے قابل ہونا چاہتے ہیں، ایک ہی ماڈل استعمال کرتے ہوئے۔ تاہم، Variety
کالم Month
جیسے کالمز سے کچھ مختلف ہے، کیونکہ اس میں غیر عددی اقدار شامل ہیں۔ ایسے کالمز کو categorical کہا جاتا ہے۔
🎥 اوپر دی گئی تصویر پر کلک کریں تاکہ کیٹیگوریکل فیچرز کے استعمال پر ایک مختصر ویڈیو دیکھ سکیں۔
یہاں آپ دیکھ سکتے ہیں کہ اوسط قیمت قسم پر کیسے منحصر ہے:

قسم کو مدنظر رکھنے کے لیے، ہمیں پہلے اسے عددی شکل میں تبدیل کرنا ہوگا، یا encode کرنا ہوگا۔ ہم اسے کرنے کے کئی طریقے ہیں:
- سادہ numeric encoding مختلف اقسام کی ایک جدول بنائے گا، اور پھر قسم کے نام کو اس جدول میں ایک انڈیکس سے بدل دے گا۔ یہ لکیری ریگریشن کے لیے بہترین خیال نہیں ہے، کیونکہ لکیری ریگریشن انڈیکس کی اصل عددی قدر کو لیتا ہے، اور اسے نتیجے میں شامل کرتا ہے، کسی coefficient سے ضرب دے کر۔ ہمارے معاملے میں، انڈیکس نمبر اور قیمت کے درمیان تعلق واضح طور پر غیر لکیری ہے، چاہے ہم یہ یقینی بنائیں کہ انڈیکسز کسی مخصوص ترتیب میں ہیں۔
- One-hot encoding
Variety
کالم کو 4 مختلف کالمز سے بدل دے گا، ہر قسم کے لیے ایک۔ ہر کالم میں1
ہوگا اگر متعلقہ قطار دی گئی قسم کی ہو، اور0
ورنہ۔ اس کا مطلب ہے کہ لکیری ریگریشن میں چار coefficients ہوں گے، ہر کدو کی قسم کے لیے ایک، جو اس مخصوص قسم کے لیے "ابتدائی قیمت" (یا "اضافی قیمت") کے لیے ذمہ دار ہوگا۔
نیچے دیا گیا کوڈ دکھاتا ہے کہ ہم قسم کو one-hot encode کیسے کر سکتے ہیں:
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 |
one-hot encoded قسم کو ان پٹ کے طور پر استعمال کرتے ہوئے لکیری ریگریشن کو تربیت دینے کے لیے، ہمیں صرف X
اور y
ڈیٹا کو صحیح طریقے سے initialize کرنے کی ضرورت ہے:
X = pd.get_dummies(new_pumpkins['Variety'])
y = new_pumpkins['Price']
باقی کوڈ وہی ہے جو ہم نے اوپر لکیری ریگریشن کو تربیت دینے کے لیے استعمال کیا۔ اگر آپ اسے آزمائیں، تو آپ دیکھیں گے کہ mean squared error تقریباً وہی ہے، لیکن ہمیں بہت زیادہ coefficient of determination (~77%) ملتا ہے۔ مزید درست پیش گوئی حاصل کرنے کے لیے، ہم مزید کیٹیگوریکل فیچرز کو مدنظر رکھ سکتے ہیں، اور عددی فیچرز جیسے Month
یا DayOfYear
کو بھی۔ ایک بڑے فیچرز کے array کو حاصل کرنے کے لیے، ہم 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%) اور determination 0.94 دیتا ہے!
سب کچھ ایک ساتھ رکھنا
بہترین ماڈل بنانے کے لیے، ہم اوپر دی گئی مثال سے مشترکہ (one-hot encoded کیٹیگوریکل + عددی) ڈیٹا کو پولینومیل ریگریشن کے ساتھ استعمال کر سکتے ہیں۔ آپ کی سہولت کے لیے یہاں مکمل کوڈ ہے:
# set up training data
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']
# make train-test split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
# setup and train the pipeline
pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())
pipeline.fit(X_train,y_train)
# predict results for test data
pred = pipeline.predict(X_test)
# calculate MSE and determination
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% کا بہترین determination coefficient اور MSE=2.23 (~8% پیش گوئی کی غلطی) دے گا۔
ماڈل | MSE | Determination |
---|---|---|
DayOfYear Linear |
2.77 (17.2%) | 0.07 |
DayOfYear Polynomial |
2.73 (17.0%) | 0.08 |
Variety Linear |
5.24 (19.7%) | 0.77 |
All features Linear | 2.84 (10.5%) | 0.94 |
All features Polynomial | 2.23 (8.25%) | 0.97 |
🏆 شاباش! آپ نے ایک سبق میں چار ریگریشن ماڈلز بنائے، اور ماڈل کے معیار کو 97% تک بہتر کیا۔ ریگریشن کے آخری حصے میں، آپ سیکھیں گے کہ زمرے کا تعین کرنے کے لیے Logistic Regression کیسے استعمال کریں۔
🚀چیلنج
اس نوٹ بک میں مختلف متغیرات کو آزمائیں تاکہ دیکھ سکیں کہ correlation ماڈل کی درستگی سے کیسے مطابقت رکھتا ہے۔
لیکچر کے بعد کا کوئز
جائزہ اور خود مطالعہ
اس سبق میں ہم نے لکیری ریگریشن کے بارے میں سیکھا۔ ریگریشن کی دیگر اہم اقسام بھی ہیں۔ Stepwise, Ridge, Lasso اور Elasticnet تکنیک کے بارے میں پڑھیں۔ مزید سیکھنے کے لیے ایک اچھا کورس Stanford Statistical Learning course ہے۔
اسائنمنٹ
ڈسکلیمر:
یہ دستاویز AI ترجمہ سروس Co-op Translator کا استعمال کرتے ہوئے ترجمہ کی گئی ہے۔ ہم درستگی کے لیے کوشش کرتے ہیں، لیکن براہ کرم آگاہ رہیں کہ خودکار ترجمے میں غلطیاں یا غیر درستیاں ہو سکتی ہیں۔ اصل دستاویز کو اس کی اصل زبان میں مستند ذریعہ سمجھا جانا چاہیے۔ اہم معلومات کے لیے، پیشہ ور انسانی ترجمہ کی سفارش کی جاتی ہے۔ ہم اس ترجمے کے استعمال سے پیدا ہونے والی کسی بھی غلط فہمی یا غلط تشریح کے ذمہ دار نہیں ہیں۔