|
|
# স্কাইকিট-লার্ন ব্যবহার করে একটি রিগ্রেশন মডেল নির্মাণ: চার ধরণের রিগ্রেশন
|
|
|
|
|
|
## প্রারম্ভিক নোট
|
|
|
|
|
|
রৈখিক রিগ্রেশন তখন ব্যবহার করা হয় যখন আমরা একটি **সংখ্যাগত মান** পূর্বাভাস করতে চাই (যেমন, বাড়ির দাম, তাপমাত্রা, বা বিক্রয়)।
|
|
|
এটি কাজ করে এমন একটি সরলরেখা খুঁজে বের করে যা ইনপুট বৈশিষ্ট্য এবং আউটপুটের মধ্যে সম্পর্ককে সর্বোত্তমভাবে উপস্থাপন করে।
|
|
|
|
|
|
এই পাঠে, আমরা মূল ধারণাটি বোঝার উপর ফোকাস করব, এর পরে আরো উন্নত রিগ্রেশন পদ্ধতি অনুসন্ধান করবে।
|
|
|

|
|
|
> ইনফোগ্রাফিক [দাসানি মাদিপল্লী](https://twitter.com/dasani_decoded) এর দ্বারা
|
|
|
## [পূর্ব-লেকচার কুইজ](https://ff-quizzes.netlify.app/en/ml/)
|
|
|
|
|
|
> ### [এই পাঠটি R ভাষায় পাওয়া যায়!](../../../../2-Regression/3-Linear/solution/R/lesson_3.html)
|
|
|
### পরিচিতি
|
|
|
|
|
|
এখন পর্যন্ত আপনি pumpkin মুল্য নির্ধারণের ডেটাসেট থেকে সংগৃহীত নমুনা ডেটা ব্যবহার করে রিগ্রেশন কী তা অন্বেষণ করেছেন যা আমরা এই পাঠজুড়ে ব্যবহার করব। আপনি এটিও Matplotlib ব্যবহার করে ভিজ্যুয়ালাইজ করে দেখেছেন।
|
|
|
|
|
|
এখন আপনি এমএল এর জন্য রিগ্রেশনের গভীরে প্রবেশ করতে প্রস্তুত। ভিজ্যুয়ালাইজেশন আপনাকে ডেটা বুঝতে সাহায্য করলেও, মেশিন লার্নিংয়ের প্রকৃত শক্তি আসে _মডেল প্রশিক্ষণ_ থেকে। মডেলগুলি ঐতিহাসিক ডেটার উপর প্রশিক্ষিত হয় যা ডেটার নির্ভরশীলতা স্বয়ংক্রিয়ভাবে ধারণ করে, এবং তারা নতুন, অদেখা ডেটা জন্য ফলাফল পূর্বাভাস করতে সহায়তা করে।
|
|
|
|
|
|
এই পাঠে, আপনি দুই ধরনের রিগ্রেশন সম্পর্কে শিখবেন: _মৌলিক রৈখিক রিগ্রেশন_ এবং _বহুপদী রিগ্রেশন_, এবং কিছু গণিত যা এই পদ্ধতিগুলির ভিত্তি। এই মডেলগুলি আমাদের বিভিন্ন ইনপুট ডেটা অনুসারে pumpkin এর মূল্য পূর্বাভাস করার সুযোগ দেবে।
|
|
|
|
|
|
[](https://youtu.be/CRxFT8oTDMg "শিক্ষানবিসদের জন্য এমএল - রৈখিক রিগ্রেশন বোঝা")
|
|
|
|
|
|
> 🎥 রৈখিক রিগ্রেশনের সংক্ষিপ্ত ভিডিও ওভারভিউ দেখতে উপরের চিত্রে ক্লিক করুন।
|
|
|
|
|
|
> এই পাঠক্রম জুড়ে, আমরা গণিতের নূন্যতম জ্ঞান ধরে নিই, এবং অন্যান্য ক্ষেত্রে থেকে আগত শিক্ষার্থীদের জন্য এটি বুঝতে সহজ করার চেষ্টা করি, সুতরাং লক্ষ্য করুন নোট, 🧮 কলআউট, ডায়াগ্রাম এবং অন্যান্য শিক্ষা সরঞ্জামগুলি।
|
|
|
|
|
|
### পূর্বশর্ত
|
|
|
|
|
|
আপনি এখন পর্যন্ত pumpkin ডেটার কাঠামো সম্পর্কে পরিচিত হওয়া উচিত যা আমরা পর্যবেক্ষণ করছি। এটি পূর্বনির্ধারিত এবং পরিষ্কৃত অবস্থায় এই পাঠের _notebook.ipynb_ ফাইলে পাওয়া যায়। ফাইলে, pumpkin এর দাম প্রতি বাসেল হিসেবে প্রদর্শিত হয়েছে। নিশ্চিত করুন যে আপনি Visual Studio Code এর কের্নেলগুলিতে এই নোটবুকগুলি চালাতে পারেন।
|
|
|
|
|
|
### প্রস্তুতি
|
|
|
|
|
|
স্মরণ করিয়ে দিতে চাই, আপনি এই ডেটা লোড করছেন যাতে এর উপর প্রশ্ন উত্থাপন করতে পারেন।
|
|
|
|
|
|
- কখন pumpkin কেনা সবচেয়ে ভালো সময়?
|
|
|
- একটি ছোট আকারের pumpkin এর দাম কত আশা করা যায়?
|
|
|
- আমি কি তাদের অর্ধ-বাসেল ঝুড়িতে কিনব নাকি ১ ১/৯ বাসেল বাক্সে?
|
|
|
চলুন এই ডেটা আরও খতিয়ে দেখা যাক।
|
|
|
|
|
|
পূর্বের পাঠে, আপনি একটি Pandas ডেটাফ্রেম তৈরি করেছিলেন এবং প্রাথমিক ডেটাসেটের একটি অংশ নিয়ে এটিকে বাসেল অনুযায়ী দাম মানকরণ করেছিলেন। কিন্তু এতে আপনি প্রায় ৪০০ ডেটাপয়েন্ট এবং শুধুমাত্র শরৎ মাসের জন্য তথ্য পেয়েছিলেন।
|
|
|
|
|
|
এই পাঠের সঙ্গী নোটবুকে আমরা পূর্বনির্ধারিত যে ডেটা লোড করেছি তা দেখুন। ডেটাটি লোড করা হয়েছে এবং প্রথম একটি scatterplot তৈরি করা হয়েছে যা মাসের ডেটা দেখায়। হয়তো এটি আরও পরিষ্কার করলে ডেটার প্রকৃতি সম্পর্কে কিছু বিস্তারিত জানতে পারি।
|
|
|
|
|
|
## একটি রৈখিক রিগ্রেশন লাইন
|
|
|
|
|
|
আপনি প্রথম পাঠে শিখেছেন, রৈখিক রিগ্রেশন অনুশীলনের লক্ষ্য হল এমন একটি রেখা আঁকতে পারা যা:
|
|
|
|
|
|
- **চলকগুলোর মধ্যে সম্পর্ক প্রদর্শন করে**। চলকগুলোর মধ্যে সম্পর্ক দেখানো।
|
|
|
- **পূর্বাভাস দেয়**। একটি নতুন ডেটাপয়েন্ট যেখানে পড়বে সেই সম্পর্কে সঠিক পূর্বাভাস দেওয়া।
|
|
|
|
|
|
**Least-Squares Regression** এ এই ধরনের রেখা আঁকা সাধারণ। "Least-Squares" শব্দগুচ্ছ আমাদের মডেলে মোট ত্রুটি সবচেয়ে কম করার প্রক্রিয়াকে বোঝায়। প্রতিটি ডেটাপয়েন্টের জন্য, আমরা আসল বিন্দু এবং রিগ্রেশন লাইনের মধ্যে উল্লম্ব দূরত্ব (যা অবশিষ্টাংশ বলে) পরিমাপ করি।
|
|
|
|
|
|
আমরা এই দূরত্বগুলিকে বর্গ করি দুইটি প্রধান কারণে:
|
|
|
|
|
|
1. **পরিমাণের গুরুত্ব, দিক নয়:** আমরা -৫ এর ত্রুটিকে +৫ এর ত্রুটির মত বিবেচনা করতে চাই। বর্গ করলে সকল মান ধনাত্মক হয়।
|
|
|
|
|
|
2. **বহিরাগত মানগুলিকে শাস্তি দেওয়া:** বড় ত্রুটিকে বেশি ওজন দেয়, রেখাটিকে সেসব দূরের পয়েন্টের কাছাকাছি থাকতে বাধ্য করে।
|
|
|
|
|
|
তারপর আমরা এই সব বর্গ মান যোগ করি। আমাদের লক্ষ্য হল সেই রেখাটি খুঁজে পাওয়া যেখান থেকে এই চূড়ান্ত সমষ্টি সর্বনিম্ন হয়—এ কারণেই নাম "Least-Squares"।
|
|
|
|
|
|
> **🧮 আমাকে গণিত দেখাও**
|
|
|
>
|
|
|
> এই রেখাটি, যাকে _line of best fit_ বলা হয়, [একটি সমীকরণ](https://en.wikipedia.org/wiki/Simple_linear_regression) দ্বারা প্রকাশ করা যায়:
|
|
|
>
|
|
|
> ```
|
|
|
> Y = a + bX
|
|
|
> ```
|
|
|
>
|
|
|
> `X` হল 'explanatory variable'। `Y` হল 'dependent variable'। রেখার ঢালের মান `b` এবং `a` হল y-intercept, যা `X = 0` এর সময় `Y` এর মান নির্দেশ করে।
|
|
|
>
|
|
|
>
|
|
|
>
|
|
|
> প্রথমে ঢাল `b` গণনা করুন। ইনফোগ্রাফিক [জেন লুপার](https://twitter.com/jenlooper) এর দ্বারা
|
|
|
>
|
|
|
> অন্য কথায়, এবং আমাদের pumpkin ডেটার মূল প্রশ্নের পরিপ্রেক্ষিতে: "মাস অনুযায়ী একটি pumpkin এর দাম পূর্বাভাস", এখানে `X` দাম বোঝাবে এবং `Y` বিক্রয়ের মাস।
|
|
|
>
|
|
|
>
|
|
|
>
|
|
|
> Y এর মান গণনা করুন। আপনি যদি প্রায় $4 দিচ্ছেন, তবে অবশ্যই এপ্রিল! ইনফোগ্রাফিক [জেন লুপার](https://twitter.com/jenlooper) এর দ্বারা
|
|
|
>
|
|
|
> লাইন গণনা যে গণিতটি করে তা ঢালটি প্রদর্শন করে, যা ইন্টারসেপ্টের উপর নির্ভরশীল, অর্থাৎ `X = 0` এর সময় `Y` কোথায় রয়েছে।
|
|
|
>
|
|
|
> এই মানগুলি গণনার পদ্ধতি দেখতে পারেন [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html) ওয়েবসাইটে। এছাড়া দেখুন [এই Least-squares calculator](https://www.mathsisfun.com/data/least-squares-calculator.html) যেখানে সংখ্যাগুলোর মান লাইনকে কীভাবে প্রভাবিত করে তা দেখা যায়।
|
|
|
|
|
|
## সহগ
|
|
|
|
|
|
আরেকটি শব্দ যা জানতেও হবে তা হল `X` এবং `Y` চলকগুলোর মধ্যে **সহগ সহগ (Correlation Coefficient)**। একটি scatterplot ব্যবহার করে আপনি দ্রুত এই সহগকে ভিজ্যুয়ালাইজ করতে পারেন। যে প্লটের ডেটাপয়েন্টগুলো একটি সুন্দর লাইনে ছড়িয়ে আছে সে প্লটের সহগ বেশি, কিন্তু যেখানে ডেটাপয়েন্টগুলো X এবং Y এর মধ্যে এলোমেলো ছড়ানো সেখানে সহগ কম।
|
|
|
|
|
|
একটি ভাল রৈখিক রিগ্রেশন মডেল হবে এমনটি যার সহগ খুব বেশি (০ থেকে ১ এর কাছে) এবং Least-Squares Regression এর মাধ্যমে রিগ্রেশন রেখা থাকবে।
|
|
|
|
|
|
✅ এই পাঠের সঙ্গী নোটবুকটি চালান এবং Month থেকে Price পর্যন্ত scatterplot দেখুন। কি মনে হয়, মাস এবং দাম পাম্পকিন বিক্রয়ের ডেটার মধ্যে আপনার scatterplot অনুযায়ী কি উচ্চ না কম সহগ আছে? যদি আপনি `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)
|
|
|
```
|
|
|
|
|
|
এখন আপনি রৈখিক রিগ্রেশনের পেছনের গণিত বুঝতে পারছেন, চলুন একটি রিগ্রেশন মডেল তৈরী করি যা পূর্বাভাস করবে কোন pumpkin এর প্যাকেজে ভালো দাম পাওয়া যাবে। ছুটির জন্য pumpkin কিনছেন এমন কেউ এই তথ্য পেতে চাইবেন যাতে তাদের পাম্পকিন প্যাকেজ কেনাকাটা অপ্টিমাইজ করতে পারেন।
|
|
|
|
|
|
## সহগ অনুসন্ধান
|
|
|
|
|
|
[](https://youtu.be/uoRq-lW2eQo "শিক্ষানবিসদের জন্য এমএল - সহগ অনুসন্ধান: লিনিয়ার রিগ্রেশনের চাবিকাঠি")
|
|
|
|
|
|
> 🎥 সহগের সংক্ষিপ্ত ভিডিও ওভারভিউ দেখতে উপরের চিত্রে ক্লিক করুন।
|
|
|
|
|
|
পূর্বের পাঠ থেকে আপনি সম্ভবত দেখেছেন বিভিন্ন মাসের গড় দাম এভাবে:
|
|
|
|
|
|
<img alt="মাস ভিত্তিক গড় দাম" src="../../../../translated_images/bn/barchart.a833ea9194346d76.webp" width="50%"/>
|
|
|
|
|
|
এটি নির্দেশ করে যে কিছুটা সহগ থাকতে হবে, এবং আমরা `Month` এবং `Price` অথবা `DayOfYear` এবং `Price` এর মধ্যে সম্পর্ক পূর্বাভাস করার জন্য লিনিয়ার রিগ্রেশন মডেল প্রশিক্ষণ দেওয়ার চেষ্টা করতে পারি। নিচের scatter plot দেখায় পরবর্তী সম্পর্ক:
|
|
|
|
|
|
<img alt="Price বনাম Day of Year ৰScatter plot" src="../../../../translated_images/bn/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` দ্বারা -০.১৫ এবং `DayOfMonth` দ্বারা -০.১৭, কিন্তু একটি অন্য গুরুত্বপূর্ণ সম্পর্ক থাকতে পারে। মনে হচ্ছে বিভিন্ন pumpkin জাতের জন্য বিভিন্ন দামের ক্লাস্টার রয়েছে। এই অনুমান নিশ্চিত করার জন্য, আসুন প্রতিটি pumpkin শ্রেণী ভিন্ন রঙে প্লট করি। `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="Price বনাম Day of Year রঙিন Scatter plot" src="../../../../translated_images/bn/scatter-dayofyear-color.65790faefbb9d54f.webp" width="50%" />
|
|
|
|
|
|
আমাদের তদন্ত ইঙ্গিত দেয় যে জাত জেনারেল মূল্যের ওপর বিক্রির তারিখের চেয়ে বেশি প্রভাব ফেলে। আমরা এটি একটি বারের গ্রাফে দেখতে পারি:
|
|
|
|
|
|
```python
|
|
|
new_pumpkins.groupby('Variety')['Price'].mean().plot(kind='bar')
|
|
|
```
|
|
|
|
|
|
<img alt="Price বনাম variety এর বার গ্রাফ" src="../../../../translated_images/bn/price-by-variety.744a2f9925d9bcb4.webp" width="50%" />
|
|
|
|
|
|
এখন কেবল একটি pumpkin জাত, 'pie type', নিয়ে ফোকাস করি এবং দেখি বিক্রয় তারিখ মূল্যের উপরে কেমন প্রভাব ফেলে:
|
|
|
|
|
|
```python
|
|
|
pie_pumpkins = new_pumpkins[new_pumpkins['Variety']=='PIE TYPE']
|
|
|
pie_pumpkins.plot.scatter('DayOfYear','Price')
|
|
|
```
|
|
|
<img alt="Price বনাম Day of Year পাই pumpkin স্ক্যাটার" src="../../../../translated_images/bn/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 "শিক্ষানবিসদের জন্য এমএল - 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 অ্যারেতে রাখব:
|
|
|
|
|
|
```python
|
|
|
X = pie_pumpkins['DayOfYear'].to_numpy().reshape(-1,1)
|
|
|
y = pie_pumpkins['Price']
|
|
|
```
|
|
|
|
|
|
> লক্ষণীয় যে ইনপুট ডেটাতে `reshape` প্রয়োগ করতে হয়েছে যাতে লিনিয়ার রিগ্রেশন প্যাকেজ এটি সঠিকভাবে বুঝতে পারে। লিনিয়ার রিগ্রেশন ২-ডি অ্যারে ইনপুট হিসেবে চায়, যেখানে প্রতিটি সারি হলো ইনপুট বৈশিষ্ট্যের ভেক্টর। আমাদের ক্ষেত্রে, যেহেতু ইনপুট মাত্র একটির মত, তাই একটি N×1 আকৃতির অ্যারে দরকার, যেখানে 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` হওয়া উচিত। এর মানে হলো দাম সময়ের সাথে একটু কমে যাচ্ছে, কিন্তু খুব বেশি নয়, প্রায় দিন প্রতি ২ সেন্ট। আমরা রিগ্রেশনের Y-অক্ষের সাথে ছেদ বিন্দুও `lin_reg.intercept_` ব্যবহার করে অ্যাক্সেস করতে পারি - আমাদের ক্ষেত্রে এটি প্রায় `21` হতে পারে, যা বছরের শুরুতে দাম নির্দেশ করে।
|
|
|
|
|
|
আমাদের মডেল কতটা সঠিক তা দেখতে, আমরা টেস্ট ডেটাসেটে দাম পূর্বাভাস দিতে পারি, এবং তারপর আমাদের পূর্বাভাসগুলি প্রত্যাশিত মানের কতটা কাছাকাছি তা মাপতে পারি। এটি মূল গড় বর্গমূল ত্রুটি (RMSE) মেট্রিক ব্যবহার করে করা যায়, যা প্রত্যাশিত এবং পূর্বাভাসিত মানের মধ্যে সমস্ত বর্গ পার্থক্যের গড়ের বর্গমূল।
|
|
|
|
|
|
```python
|
|
|
pred = lin_reg.predict(X_test)
|
|
|
|
|
|
rmse = np.sqrt(mean_squared_error(y_test,pred))
|
|
|
print(f'RMSE: {rmse:3.3} ({rmse/np.mean(pred)*100:3.3}%)')
|
|
|
```
|
|
|
|
|
|
আমাদের ত্রুটি প্রায় ২ পয়েন্ট, যা প্রায় ~১৭%। খুব ভাল নয়। মডেলের গুণমানের আরেকটি সূচক হল **নির্ধারণ সহগ**, যা এভাবে পাওয়া যায়:
|
|
|
|
|
|
```python
|
|
|
score = lin_reg.score(X_train,y_train)
|
|
|
print('Model determination: ', score)
|
|
|
```
|
|
|
|
|
|
যদি মান ০ হয়, তার মানে মডেল ইনপুট ডেটাকে বিবেচনা করে না, এবং *অতীব বাজে রেখীয় পূর্বাভাসকারী* হিসেবে কাজ করে, যা কেবল ফলাফলের গড় মান। মান ১ হলে তার মানে আমরা সমস্ত প্রত্যাশিত আউটপুট নিখুঁতভাবে পূর্বাভাস দিতে পারি। আমাদের ক্ষেত্রে, সহগ প্রায় ০.০৬, যা যথেষ্ট কম।
|
|
|
|
|
|
আমরা টেস্ট ডেটা এবং রিগ্রেশন লাইন একসাথে প্লট করতে পারি যাতে আমাদের ক্ষেত্রে রিগ্রেশন কিভাবে কাজ করছে তা ভালোভাবে দেখা যায়:
|
|
|
|
|
|
```python
|
|
|
plt.scatter(X_test,y_test)
|
|
|
plt.plot(X_test,pred)
|
|
|
```
|
|
|
|
|
|
<img alt="Linear regression" src="../../../../translated_images/bn/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/bn/poly-results.ee587348f0f1f60b.webp" width="50%" />
|
|
|
|
|
|
পলিনোমিয়াল রিগ্রেশন ব্যবহার করে আমরা সামান্য কম MSE এবং বেশি নির্ধারণ সহগ পেতে পারি, কিন্তু তা খুব বেশি নয়। আমাদের অন্যান্য বৈশিষ্ট্যগুলোও বিবেচনায় নিতে হবে!
|
|
|
|
|
|
> আপনি দেখতে পাচ্ছেন যে বছরের আশেপাশে হ্যালোউইনের সময় পাম্পকিনের দাম ন্যূনতম হয়। আপনি কীভাবে এটি ব্যাখ্যা করবেন?
|
|
|
|
|
|
🎃 অভিনন্দন, আপনি এমন একটি মডেল তৈরি করলেন যা পাই পাম্পকিনের দাম পূর্বাভাসে সাহায্য করতে পারে। একই পদ্ধতি সব ধরনের পাম্পকিনের জন্য পুনরাবৃত্তি করতে পারেন, কিন্তু সেটা ক্লান্তিকর হবে। এখন শিখি কিভাবে আমাদের মডেলে পাম্পকিন জাত বিবেচনা করব!
|
|
|
|
|
|
## শ্রেণীবদ্ধ বৈশিষ্ট্য (Categorical Features)
|
|
|
|
|
|
এক আদর্শ বিশ্বের, আমরা একই মডেল ব্যবহার করে বিভিন্ন পাম্পকিন জাতের দাম পূর্বাভাস দিতে চাই। তবে, `Variety` কলামটি অন্য কলাম যেমন `Month` থেকে ভিন্ন, কারণ এতে অ-সংখ্যাসূচক মান থাকে। এই ধরনের কলামকে বলা হয় **শ্রেণীবদ্ধ (Categorical)**।
|
|
|
|
|
|
[](https://youtu.be/DYGliioIAE0 "শিক্ষানবিশদের জন্য এমএল - শ্রেণীবদ্ধ বৈশিষ্ট্য ব্যবহার করে রিগ্রেশন পূর্বাভাস")
|
|
|
|
|
|
> 🎥 উপরের ছবিটিতে ক্লিক করে শ্রেণীবদ্ধ বৈশিষ্ট্য ব্যবহারের সংক্ষিপ্ত ভিডিও দেখুন।
|
|
|
|
|
|
এখানে আপনি দেখতে পাচ্ছেন গড় দাম কীভাবে পাম্পকিন জাত অনুযায়ী পরিবর্তিত হয়:
|
|
|
|
|
|
<img alt="Average price by variety" src="../../../../translated_images/bn/price-by-variety.744a2f9925d9bcb4.webp" width="50%" />
|
|
|
|
|
|
জাতকে বিবেচনায় নিতে, প্রথমে আমাদের এটিকে সংখ্যাসূচক রূপে রূপান্তর করতে হবে, বা **এনকোড** করতে হবে। আমরা এটি করার কয়েকটি পদ্ধতি আছে:
|
|
|
|
|
|
* সাধারণ **সংখ্যাসূচক এনকোডিং** বিভিন্ন জাতের একটি টেবিল তৈরি করবে, এবং তারপর জাতের নামকে সেই টেবিলে ইন্ডেক্স দিয়ে প্রতিস্থাপন করবে। এটি রেখীয় রিগ্রেশনের জন্য সবচেয়ে ভালো ধারণা নয়, কারণ রেখীয় রিগ্রেশন ইন্ডেক্সের আসল সংখ্যাসূচক মান নিয়ে কাজ করে, এবং কিছু সহগ দিয়ে তা গুণ করে রেজাল্ট দেয়। আমাদের ক্ষেত্রে, ইন্ডেক্স নম্বর ও দাম এর মধ্যে সম্পর্ক স্পষ্টভাবে অ-রৈখিক, এমনকি আমরা নিশ্চিত করি যে ইন্ডেক্সসমূহ নির্দিষ্ট ক্রমে সাজানো।
|
|
|
|
|
|
* **ওয়ান-হট এনকোডিং** `Variety` কলামকে ৪টি ভিন্ন কলামে পরিবর্তন করবে, প্রতিটার জন্য আলাদা আলাদা। প্রতিটি কলামে থাকবে `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` ডেটা আরম্ভ করতে হবে:
|
|
|
|
|
|
```python
|
|
|
X = pd.get_dummies(new_pumpkins['Variety'])
|
|
|
y = new_pumpkins['Price']
|
|
|
```
|
|
|
|
|
|
বাকি কোড একই, যেটি আমরা পূর্বে লিনিয়ার রিগ্রেশন ট্রেনিংয়ের জন্য ব্যবহার করেছিলাম। আপনি যদি এটি চেষ্টা করেন, দেখতে পাবেন গড় বর্গমূল ত্রুটি প্রায় একই, কিন্তু নির্ধারণ সহগ অনেক বেশি (~৭৭%) পেয়েছি। আরও সঠিক পূর্বাভাসের জন্য আমরা আরো শ্রেণীবদ্ধ বৈশিষ্ট্য এবং সংখ্যাসূচক বৈশিষ্ট্য, যেমন `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 (১০%) এবং নির্ধারণ 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)
|
|
|
```
|
|
|
|
|
|
এটি আমাদের প্রায় ৯৭% সেরা নির্ধারণ সহগ এবং MSE=2.23 (~৮% পূর্বাভাস ত্রুটি) দেবে।
|
|
|
|
|
|
| মডেল | MSE | নির্ধারণ |
|
|
|
|-------|-----|---------------|
|
|
|
| `DayOfYear` লিনিয়ার | 2.77 (১৭.২%) | 0.07 |
|
|
|
| `DayOfYear` পলিনোমিয়াল | 2.73 (১৭.০%) | 0.08 |
|
|
|
| `Variety` লিনিয়ার | 5.24 (১৯.৭%) | 0.77 |
|
|
|
| সব বৈশিষ্ট্য লিনিয়ার | 2.84 (১০.৫%) | 0.94 |
|
|
|
| সব বৈশিষ্ট্য পলিনোমিয়াল | 2.23 (৮.২৫%) | 0.97 |
|
|
|
|
|
|
🏆 অসাধারণ! এক লেসনে চারটি রিগ্রেশন মডেল তৈরি করলেন এবং মডেলের গুণমান ৯৭% এ উন্নত করলেন। রিগ্রেশন এর শেষ অংশে আপনি ক্যাটেগরি নির্ধারণের জন্য লজিস্টিক রিগ্রেশন সম্পর্কে জানতে পারবেন।
|
|
|
|
|
|
---
|
|
|
## 🚀চ্যালেঞ্জ
|
|
|
|
|
|
এই নোটবুকে বিভিন্ন ভেরিয়েবল পরীক্ষা করুন এবং দেখুন কিভাবে সহগ মডেলের সঠিকতার সাথে সম্পর্কিত।
|
|
|
|
|
|
## [পোস্ট-লেকচার কুইজ](https://ff-quizzes.netlify.app/en/ml/)
|
|
|
|
|
|
## রিভিউ ও স্ব-অধ্যয়ন
|
|
|
|
|
|
এই লেসনে আমরা লিনিয়ার রিগ্রেশন শিখেছি। রিগ্রেশনের অন্য গুরুত্বপূর্ণ ধরন রয়েছে। স্টেপওয়াইজ, রিজ, লাসো এবং ইলাস্টিকনেট পদ্ধতি সম্পর্কে পড়ুন। ভালো কোর্স হলো [স্ট্যানফোর্ড স্ট্যাটিস্টিক্যাল লার্নিং কোর্স](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning)
|
|
|
|
|
|
## অ্যাসাইনমেন্ট
|
|
|
|
|
|
[একটি মডেল তৈরি করুন](assignment.md)
|
|
|
|
|
|
---
|
|
|
|
|
|
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
|
|
|
**প্রত্যাহার সতর্কতা**:
|
|
|
এই নথিটি এআই অনুবাদ সেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনূদিত হয়েছে। আমরা যথাসাধ্য সঠিকতার জন্য চেষ্টা করি, তবে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা ভুল থাকতে পারে। মূল নথিটি তার প্রাসঙ্গিক ভাষায় কর্তৃত্বস্বরূপ বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য পেশাদার মানুষের অনুবাদ সুপারিশ করা হয়। এই অনুবাদের ব্যবহারে যে কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যার জন্য আমরা দায়ী নই।
|
|
|
<!-- CO-OP TRANSLATOR DISCLAIMER END --> |