You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ML-For-Beginners/translations/bn/2-Regression/3-Linear/README.md

380 lines
46 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "40e64f004f3cb50aa1d8661672d3cd92",
"translation_date": "2025-09-04T20:57:44+00:00",
"source_file": "2-Regression/3-Linear/README.md",
"language_code": "bn"
}
-->
# স্কিকিট-লার্ন ব্যবহার করে রিগ্রেশন মডেল তৈরি করুন: চারটি পদ্ধতিতে রিগ্রেশন
![লিনিয়ার বনাম পলিনোমিয়াল রিগ্রেশন ইনফোগ্রাফিক](../../../../2-Regression/3-Linear/images/linear-polynomial.png)
> ইনফোগ্রাফিক: [দাসানি মাদিপল্লি](https://twitter.com/dasani_decoded)
## [পূর্ব-লেকচার কুইজ](https://ff-quizzes.netlify.app/en/ml/)
> ### [এই পাঠটি R-এও উপলব্ধ!](../../../../2-Regression/3-Linear/solution/R/lesson_3.html)
### ভূমিকা
এখন পর্যন্ত আপনি রিগ্রেশন কী তা কুমড়ার দাম সম্পর্কিত নমুনা ডেটার মাধ্যমে অন্বেষণ করেছেন, যা আমরা এই পাঠে ব্যবহার করব। আপনি এটি ম্যাটপ্লটলিব ব্যবহার করে ভিজ্যুয়ালাইজও করেছেন।
এখন আপনি মেশিন লার্নিংয়ের জন্য রিগ্রেশন আরও গভীরভাবে বুঝতে প্রস্তুত। ভিজ্যুয়ালাইজেশন ডেটা বোঝার জন্য সহায়ক হলেও, মেশিন লার্নিংয়ের আসল শক্তি _মডেল প্রশিক্ষণ_ থেকে আসে। মডেলগুলো ঐতিহাসিক ডেটার উপর প্রশিক্ষিত হয় যাতে ডেটার নির্ভরশীলতা স্বয়ংক্রিয়ভাবে ধরা যায় এবং নতুন ডেটার জন্য ফলাফল পূর্বাভাস দেওয়া যায়, যা মডেল আগে দেখেনি।
এই পাঠে, আপনি দুটি ধরণের রিগ্রেশন সম্পর্কে আরও জানবেন: _বেসিক লিনিয়ার রিগ্রেশন_ এবং _পলিনোমিয়াল রিগ্রেশন_, এবং এই পদ্ধতিগুলোর কিছু গাণিতিক ভিত্তি। এই মডেলগুলো আমাদের বিভিন্ন ইনপুট ডেটার উপর ভিত্তি করে কুমড়ার দাম পূর্বাভাস দিতে সাহায্য করবে।
[![শুরু করুন লিনিয়ার রিগ্রেশন বুঝতে](https://img.youtube.com/vi/CRxFT8oTDMg/0.jpg)](https://youtu.be/CRxFT8oTDMg "শুরু করুন লিনিয়ার রিগ্রেশন বুঝতে")
> 🎥 উপরের ছবিতে ক্লিক করুন লিনিয়ার রিগ্রেশন সম্পর্কে সংক্ষিপ্ত ভিডিও দেখার জন্য।
> এই পাঠক্রমে, আমরা গণিতের ন্যূনতম জ্ঞান ধরে নিয়েছি এবং এটি অন্যান্য ক্ষেত্র থেকে আসা শিক্ষার্থীদের জন্য সহজলভ্য করার চেষ্টা করেছি। তাই নোট, 🧮 কলআউট, ডায়াগ্রাম এবং অন্যান্য শিক্ষণ সরঞ্জামগুলোর দিকে নজর রাখুন।
### পূর্বশর্ত
আপনার এখন পর্যন্ত কুমড়ার ডেটার গঠন সম্পর্কে পরিচিত হওয়া উচিত, যা আমরা পরীক্ষা করছি। এই পাঠের _notebook.ipynb_ ফাইলে এটি প্রি-লোড এবং প্রি-ক্লিন করা অবস্থায় পাওয়া যাবে। ফাইলে, কুমড়ার দাম প্রতি বাসেল হিসেবে একটি নতুন ডেটা ফ্রেমে প্রদর্শিত হয়েছে। নিশ্চিত করুন যে আপনি এই নোটবুকগুলো ভিজ্যুয়াল স্টুডিও কোডের কার্নেলে চালাতে পারেন।
### প্রস্তুতি
স্মরণ করিয়ে দেওয়া হচ্ছে, আপনি এই ডেটা লোড করছেন যাতে এর উপর প্রশ্ন করতে পারেন।
- কুমড়া কেনার সেরা সময় কখন?
- ক্ষুদ্রাকৃতির কুমড়ার একটি কেসের দাম কত হতে পারে?
- আমি কি এগুলো অর্ধ-বাসেল ঝুড়িতে কিনব নাকি ১ ১/৯ বাসেল বাক্সে কিনব?
চলুন এই ডেটা আরও গভীরভাবে বিশ্লেষণ করি।
পূর্ববর্তী পাঠে, আপনি একটি প্যান্ডাস ডেটা ফ্রেম তৈরি করেছেন এবং মূল ডেটাসেটের অংশ দিয়ে এটি পূরণ করেছেন, দামকে বাসেল অনুযায়ী মানক করে। তবে, এর ফলে আপনি শুধুমাত্র প্রায় ডেটাপয়েন্ট এবং শুধুমাত্র শরৎ মাসের জন্য ডেটা সংগ্রহ করতে পেরেছেন।
এই পাঠের সাথে থাকা নোটবুকে প্রি-লোড করা ডেটা দেখুন। ডেটা প্রি-লোড করা হয়েছে এবং একটি প্রাথমিক স্ক্যাটারপ্লট চার্ট করা হয়েছে মাসের ডেটা দেখানোর জন্য। হয়তো আমরা ডেটার প্রকৃতি সম্পর্কে আরও বিস্তারিত জানতে পারি যদি এটি আরও পরিষ্কার করি।
## একটি লিনিয়ার রিগ্রেশন লাইন
পাঠ ১-এ আপনি শিখেছেন যে একটি লিনিয়ার রিগ্রেশন অনুশীলনের লক্ষ্য হলো একটি লাইন প্লট করা যাতে:
- **ভেরিয়েবল সম্পর্ক দেখানো যায়**। ভেরিয়েবলগুলোর মধ্যে সম্পর্ক দেখানো যায়।
- **পূর্বাভাস দেওয়া যায়**। নতুন ডেটাপয়েন্টটি সেই লাইনের সাথে সম্পর্কিত কোথায় পড়বে তা সঠিকভাবে পূর্বাভাস দেওয়া যায়।
**লিস্ট-স্কয়ার রিগ্রেশন** সাধারণত এই ধরণের লাইন আঁকতে ব্যবহৃত হয়। 'লিস্ট-স্কয়ার' শব্দটি বোঝায় যে রিগ্রেশন লাইনের চারপাশের সব ডেটাপয়েন্ট স্কয়ার করা হয় এবং তারপর যোগ করা হয়। আদর্শভাবে, সেই চূড়ান্ত যোগফল যতটা সম্ভব ছোট হওয়া উচিত, কারণ আমরা কম সংখ্যক ত্রুটি বা `লিস্ট-স্কয়ার` চাই।
আমরা এটি করি কারণ আমরা এমন একটি লাইন মডেল করতে চাই যার সব ডেটাপয়েন্ট থেকে সামগ্রিক দূরত্ব কম। আমরা টার্মগুলো যোগ করার আগে স্কয়ার করি কারণ আমরা এর মাত্রা নিয়ে চিন্তিত, দিক নিয়ে নয়।
> **🧮 আমাকে গণিত দেখান**
>
> এই লাইন, যা _সেরা ফিটের লাইন_ নামে পরিচিত, [একটি সমীকরণ](https://en.wikipedia.org/wiki/Simple_linear_regression) দ্বারা প্রকাশ করা যেতে পারে:
>
> ```
> Y = a + bX
> ```
>
> `X` হলো 'ব্যাখ্যামূলক ভেরিয়েবল'। `Y` হলো 'নির্ভরশীল ভেরিয়েবল'। লাইনের ঢাল হলো `b` এবং `a` হলো y-ইন্টারসেপ্ট, যা `X = 0` হলে `Y` এর মানকে বোঝায়।
>
>![ঢাল গণনা করুন](../../../../2-Regression/3-Linear/images/slope.png)
>
> প্রথমে, ঢাল `b` গণনা করুন। ইনফোগ্রাফিক: [জেন লুপার](https://twitter.com/jenlooper)
>
> অন্য কথায়, এবং আমাদের কুমড়ার ডেটার মূল প্রশ্নের দিকে ইঙ্গিত করে: "মাস অনুযায়ী প্রতি বাসেলে কুমড়ার দাম পূর্বাভাস দিন", `X` দামকে বোঝাবে এবং `Y` বিক্রয়ের মাসকে বোঝাবে।
>
>![সমীকরণ সম্পূর্ণ করুন](../../../../2-Regression/3-Linear/images/calculation.png)
>
> `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) দেখুন যাতে সংখ্যার মানগুলো লাইনে কীভাবে প্রভাব ফেলে তা দেখতে পারেন।
## সম্পর্ক
আরেকটি গুরুত্বপূর্ণ শব্দ হলো **করেলেশন কোইফিসিয়েন্ট** যা প্রদত্ত X এবং Y ভেরিয়েবলের মধ্যে সম্পর্ক বোঝায়। একটি স্ক্যাটারপ্লট ব্যবহার করে আপনি দ্রুত এই কোইফিসিয়েন্ট ভিজ্যুয়ালাইজ করতে পারেন। একটি প্লটে ডেটাপয়েন্টগুলো যদি একটি সুশৃঙ্খল লাইনে থাকে তবে উচ্চ করেলেশন থাকে, কিন্তু যদি ডেটাপয়েন্টগুলো X এবং Y এর মধ্যে এলোমেলোভাবে ছড়িয়ে থাকে তবে নিম্ন করেলেশন থাকে।
একটি ভালো লিনিয়ার রিগ্রেশন মডেল হবে এমন একটি যার **লিস্ট-স্কয়ার রিগ্রেশন** পদ্ধতি ব্যবহার করে রিগ্রেশন লাইনের সাথে উচ্চ (১ এর কাছাকাছি, এর চেয়ে বেশি) করেলেশন কোইফিসিয়েন্ট থাকে।
✅ এই পাঠের সাথে থাকা নোটবুক চালান এবং মাস থেকে দাম সম্পর্কিত স্ক্যাটারপ্লট দেখুন। কুমড়া বিক্রির মাস থেকে দাম সম্পর্কিত ডেটা আপনার ভিজ্যুয়াল ব্যাখ্যা অনুযায়ী উচ্চ বা নিম্ন করেলেশন আছে বলে মনে হয়? যদি আপনি `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`](../../../../2-Regression/3-Linear/notebook.ipynb) এ উপলব্ধ। আমরা পূর্ববর্তী পাঠের মতো একই পরিষ্কার করার ধাপ সম্পন্ন করেছি এবং নিম্নলিখিত এক্সপ্রেশন ব্যবহার করে `DayOfYear` কলাম গণনা করেছি:
```python
day_of_year = pd.to_datetime(pumpkins['Date']).apply(lambda dt: (dt-datetime(dt.year,1,1)).days)
```
এখন আপনি লিনিয়ার রিগ্রেশনের পেছনের গণিত সম্পর্কে ধারণা পেয়েছেন, চলুন একটি রিগ্রেশন মডেল তৈরি করি যাতে আমরা পূর্বাভাস দিতে পারি কোন কুমড়ার প্যাকেজের দাম সবচেয়ে ভালো হবে। কেউ যদি ছুটির দিনে কুমড়ার প্যাচের জন্য কুমড়া কিনতে চান, তাহলে এই তথ্য তাদের কুমড়ার প্যাকেজ কেনার ক্ষেত্রে অপ্টিমাইজ করতে সাহায্য করবে।
## করেলেশন খুঁজে বের করা
[![করেলেশন খুঁজে বের করা: লিনিয়ার রিগ্রেশনের চাবিকাঠি](https://img.youtube.com/vi/uoRq-lW2eQo/0.jpg)](https://youtu.be/uoRq-lW2eQo "করেলেশন খুঁজে বের করা: লিনিয়ার রিগ্রেশনের চাবিকাঠি")
> 🎥 উপরের ছবিতে ক্লিক করুন করেলেশন সম্পর্কে সংক্ষিপ্ত ভিডিও দেখার জন্য।
পূর্ববর্তী পাঠ থেকে আপনি সম্ভবত দেখেছেন যে বিভিন্ন মাসের গড় দাম নিম্নরূপ দেখায়:
<img alt="মাস অনুযায়ী গড় দাম" src="../2-Data/images/barchart.png" width="50%"/>
এটি ইঙ্গিত করে যে কিছু করেলেশন থাকতে পারে, এবং আমরা `Month` এবং `Price` এর মধ্যে সম্পর্ক বা `DayOfYear` এবং `Price` এর মধ্যে সম্পর্ক পূর্বাভাস দিতে লিনিয়ার রিগ্রেশন মডেল প্রশিক্ষণ দিতে চেষ্টা করতে পারি। এখানে একটি স্ক্যাটারপ্লট দেখানো হয়েছে যা পরবর্তী সম্পর্কটি দেখায়:
<img alt="দাম বনাম বছরের দিন স্ক্যাটারপ্লট" src="images/scatter-dayofyear.png" 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="দাম বনাম বছরের দিন স্ক্যাটারপ্লট" src="images/scatter-dayofyear-color.png" width="50%" />
আমাদের তদন্ত ইঙ্গিত করে যে প্রজাতি বিক্রয়ের তারিখের চেয়ে সামগ্রিক দামের উপর বেশি প্রভাব ফেলে। আমরা এটি একটি বার গ্রাফের মাধ্যমে দেখতে পারি:
```python
new_pumpkins.groupby('Variety')['Price'].mean().plot(kind='bar')
```
<img alt="প্রজাতি অনুযায়ী দাম বার গ্রাফ" src="images/price-by-variety.png" width="50%" />
চলুন আপাতত শুধুমাত্র একটি কুমড়ার প্রজাতি, 'পাই টাইপ', এর উপর মনোযোগ দিই এবং দেখি তারিখের দাম উপর কী প্রভাব ফেলে:
```python
pie_pumpkins = new_pumpkins[new_pumpkins['Variety']=='PIE TYPE']
pie_pumpkins.plot.scatter('DayOfYear','Price')
```
<img alt="দাম বনাম বছরের দিন স্ক্যাটারপ্লট" src="images/pie-pumpkins-scatter.png" width="50%" />
যদি আমরা এখন `corr` ফাংশন ব্যবহার করে `Price` এবং `DayOfYear` এর মধ্যে করেলেশন গণনা করি, আমরা কিছুটা `-0.27` পাব - যা নির্দেশ করে যে একটি পূর্বাভাস মডেল প্রশিক্ষণ দেওয়া যুক্তিযুক্ত।
> একটি লিনিয়ার রিগ্রেশন মডেল প্রশিক্ষণ দেওয়ার আগে, আমাদের ডেটা পরিষ্কার করা নিশ্চিত করা গুরুত্বপূর্ণ। লিনিয়ার রিগ্রেশন মিসিং ভ্যালু নিয়ে ভালো কাজ করে না, তাই সব খালি সেলগুলো সরিয়ে ফেলা যুক্তিযুক্ত:
```python
pie_pumpkins.dropna(inplace=True)
pie_pumpkins.info()
```
অন্য একটি পদ্ধতি হলো খালি ভ্যালুগুলো সংশ্লিষ্ট কলামের গড় মান দিয়ে পূরণ করা।
## সাধারণ লিনিয়ার রিগ্রেশন
[![স্কিকিট-লার্ন ব্যবহার করে লিনিয়ার এবং পলিনোমিয়াল রিগ্রেশন](https://img.youtube.com/vi/e4c_UP2fSjg/0.jpg)](https://youtu.be/e4c_UP2fSjg "স্কিকিট-লার্ন ব্যবহার করে লিনিয়ার এবং পলিনোমিয়াল রিগ্রেশন")
> 🎥 উপরের ছবিতে ক্লিক করুন লিনিয়ার এবং পলিনোমিয়াল রিগ্রেশন সম্পর্কে সংক্ষিপ্ত ভিডিও দেখার জন্য।
আমাদের লিনিয়ার রিগ্রেশন মডেল প্রশিক্ষণ দিতে আমরা **স্কিকিট-লার্ন** লাইব্রেরি ব্যবহার করব।
```python
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
```
আমরা ইনপুট মান (ফিচার) এবং প্রত্যাশিত আউটপুট (লেবেল) আলাদা নাম্পাই অ্যারেতে ভাগ করে শুরু করি:
```python
X = pie_pumpkins['DayOfYear'].to_numpy().reshape(-1,1)
y = pie_pumpkins['Price']
```
> লক্ষ্য করুন যে আমরা ইনপুট ডেটার উপর `reshape` করতে বাধ্য হয়েছি যাতে লিনিয়ার রিগ্রেশন প্যাকেজ এটি সঠিকভাবে বুঝতে পারে। লিনিয়ার রিগ্রেশন একটি 2D-অ্যারে ইনপুট হিসেবে আশা করে, যেখানে অ্যারেটির প্রতিটি সারি ইনপুট ফিচারের একটি ভেক্টরের সাথে সম্পর্কিত। আমাদের ক্ষেত্রে, যেহেতু আমাদের শুধুমাত্র একটি ইনপুট আছে - আমাদের একটি 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` হবে, যা বছরের শুরুতে দাম নির্দেশ করে।
আমাদের মডেল কতটা সঠিক তা দেখতে, আমরা টেস্ট ডেটাসেটে দাম পূর্বাভাস দিতে পারি এবং তারপর আমাদের পূর্বাভাস প্রত্যাশিত মানের সাথে কতটা কাছাকাছি তা পরিমাপ করতে পারি। এটি মীন স্কয়ার এরর (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}%)')
```
আমাদের ত্রুটি প্রায় ২টি পয়েন্টের আশেপাশে, যা প্রায় ১৭%। খুব একটা ভালো নয়। মডেলের গুণমানের আরেকটি সূচক হলো **coefficient of determination**, যা এইভাবে পাওয়া যায়:
```python
score = lin_reg.score(X_train,y_train)
print('Model determination: ', score)
```
যদি মান হয়, তাহলে এর অর্থ হলো মডেল ইনপুট ডেটাকে বিবেচনায় নেয় না এবং এটি *সবচেয়ে খারাপ লিনিয়ার প্রেডিক্টর* হিসেবে কাজ করে, যা কেবলমাত্র ফলাফলের গড় মান। মান ১ হলে বোঝায় যে আমরা প্রত্যাশিত সমস্ত আউটপুট নিখুঁতভাবে পূর্বানুমান করতে পারি। আমাদের ক্ষেত্রে, coefficient প্রায় .০৬, যা বেশ কম।
আমরা টেস্ট ডেটা এবং রিগ্রেশন লাইনের সাথে একটি গ্রাফ আঁকতে পারি, যাতে আমাদের ক্ষেত্রে রিগ্রেশন কীভাবে কাজ করছে তা আরও ভালোভাবে বোঝা যায়:
```python
plt.scatter(X_test,y_test)
plt.plot(X_test,pred)
```
<img alt="লিনিয়ার রিগ্রেশন" src="images/linear-results.png" width="50%" />
## পলিনোমিয়াল রিগ্রেশন
লিনিয়ার রিগ্রেশনের আরেকটি ধরন হলো পলিনোমিয়াল রিগ্রেশন। কখনও কখনও ভেরিয়েবলগুলোর মধ্যে একটি সরল সম্পর্ক থাকে - যেমন, কুমড়ার আয়তন যত বড়, দাম তত বেশি - কিন্তু কখনও কখনও এই সম্পর্কগুলোকে একটি সমতল বা সরল রেখা হিসেবে চিত্রিত করা যায় না।
✅ এখানে [কিছু উদাহরণ](https://online.stat.psu.edu/stat501/lesson/9/9.8) দেওয়া হলো, যেখানে পলিনোমিয়াল রিগ্রেশন ব্যবহার করা যেতে পারে।
তারিখ এবং দামের মধ্যে সম্পর্কটি আবার দেখুন। এই স্ক্যাটারপ্লটটি কি সরল রেখা দিয়ে বিশ্লেষণ করা উচিত বলে মনে হয়? দামের ওঠানামা কি সম্ভব নয়? এই ক্ষেত্রে, আপনি পলিনোমিয়াল রিগ্রেশন চেষ্টা করতে পারেন।
✅ পলিনোমিয়াল হলো গাণিতিক প্রকাশ, যা এক বা একাধিক ভেরিয়েবল এবং কোইফিসিয়েন্ট নিয়ে গঠিত হতে পারে।
পলিনোমিয়াল রিগ্রেশন একটি বাঁকানো রেখা তৈরি করে, যা অ-রৈখিক ডেটার সাথে আরও ভালোভাবে মানানসই হয়। আমাদের ক্ষেত্রে, যদি ইনপুট ডেটায় একটি বর্গ `DayOfYear` ভেরিয়েবল যোগ করি, তাহলে আমরা একটি প্যারাবোলিক কার্ভ দিয়ে আমাদের ডেটাকে মানানসই করতে পারব, যার একটি নির্দিষ্ট বিন্দুতে সর্বনিম্ন মান থাকবে।
Scikit-learn একটি সহায়ক [pipeline API](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.make_pipeline.html?highlight=pipeline#sklearn.pipeline.make_pipeline) অন্তর্ভুক্ত করে, যা ডেটা প্রসেসিংয়ের বিভিন্ন ধাপ একত্রিত করতে সাহায্য করে। একটি **pipeline** হলো **estimators**-এর একটি চেইন। আমাদের ক্ষেত্রে, আমরা একটি 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="পলিনোমিয়াল রিগ্রেশন" src="images/poly-results.png" width="50%" />
পলিনোমিয়াল রিগ্রেশন ব্যবহার করে আমরা সামান্য কম MSE এবং সামান্য বেশি determination পেতে পারি, তবে তা উল্লেখযোগ্য নয়। আমাদের আরও ফিচার বিবেচনায় নিতে হবে!
> আপনি দেখতে পাবেন যে হ্যালোউইনের আশেপাশে কুমড়ার সর্বনিম্ন দাম দেখা যায়। আপনি এটি কীভাবে ব্যাখ্যা করবেন?
🎃 অভিনন্দন, আপনি একটি মডেল তৈরি করেছেন যা পাই কুমড়ার দাম পূর্বানুমান করতে সাহায্য করতে পারে। আপনি সম্ভবত একই পদ্ধতি সমস্ত কুমড়ার প্রকারের জন্য পুনরাবৃত্তি করতে পারেন, তবে এটি বেশ ক্লান্তিকর হবে। এখন চলুন শিখি কীভাবে মডেলে কুমড়ার বৈচিত্র্যকে বিবেচনায় নেওয়া যায়!
## শ্রেণীবদ্ধ ফিচার
আদর্শ জগতে, আমরা একই মডেল ব্যবহার করে বিভিন্ন কুমড়ার প্রকারের দাম পূর্বানুমান করতে চাই। তবে, `Variety` কলামটি `Month`-এর মতো কলাম থেকে কিছুটা আলাদা, কারণ এতে অ-সংখ্যাসূচক মান রয়েছে। এই ধরনের কলামগুলোকে **শ্রেণীবদ্ধ (categorical)** বলা হয়।
[![শ্রেণীবদ্ধ ফিচার নিয়ে লিনিয়ার রিগ্রেশন](https://img.youtube.com/vi/DYGliioIAE0/0.jpg)](https://youtu.be/DYGliioIAE0 "শ্রেণীবদ্ধ ফিচার নিয়ে লিনিয়ার রিগ্রেশন")
> 🎥 উপরের ছবিতে ক্লিক করে শ্রেণীবদ্ধ ফিচার ব্যবহারের একটি সংক্ষিপ্ত ভিডিও দেখুন।
এখানে আপনি দেখতে পাচ্ছেন কীভাবে গড় দাম বৈচিত্র্যের উপর নির্ভর করে:
<img alt="বৈচিত্র্য অনুযায়ী গড় দাম" src="images/price-by-variety.png" 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']
```
বাকি কোডটি উপরের লিনিয়ার রিগ্রেশন প্রশিক্ষণের মতোই। যদি আপনি এটি চেষ্টা করেন, আপনি দেখতে পাবেন যে গড় বর্গ ত্রুটি (MSE) প্রায় একই থাকে, তবে আমরা অনেক বেশি determination coefficient (~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%) এবং determination 0.94 দেয়!
## সবকিছু একত্রিত করা
সেরা মডেল তৈরি করতে, আমরা উপরের উদাহরণ থেকে সম্মিলিত (ওয়ান-হট এনকোড করা শ্রেণীবদ্ধ + সংখ্যাসূচক) ডেটা এবং পলিনোমিয়াল রিগ্রেশন ব্যবহার করতে পারি। আপনার সুবিধার জন্য এখানে সম্পূর্ণ কোড দেওয়া হলো:
```python
# 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)
```
এটি আমাদের প্রায় ৯৭% determination coefficient এবং MSE=2.23 (~8% পূর্বানুমান ত্রুটি) দেবে।
| মডেল | MSE | Determination |
|-------|-----|---------------|
| `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 |
🏆 দারুণ কাজ! আপনি এক পাঠে চারটি রিগ্রেশন মডেল তৈরি করেছেন এবং মডেলের গুণমান ৯৭% পর্যন্ত উন্নত করেছেন। রিগ্রেশনের চূড়ান্ত অংশে, আপনি ক্যাটাগরি নির্ধারণের জন্য লজিস্টিক রিগ্রেশন সম্পর্কে শিখবেন।
---
## 🚀চ্যালেঞ্জ
এই নোটবুকে বিভিন্ন ভেরিয়েবল পরীক্ষা করুন এবং দেখুন কীভাবে সম্পর্ক মডেলের নির্ভুলতার সাথে সামঞ্জস্যপূর্ণ।
## [পোস্ট-লেকচার কুইজ](https://ff-quizzes.netlify.app/en/ml/)
## পুনরালোচনা ও স্ব-অধ্যয়ন
এই পাঠে আমরা লিনিয়ার রিগ্রেশন সম্পর্কে শিখেছি। রিগ্রেশনের অন্যান্য গুরুত্বপূর্ণ ধরন রয়েছে। Stepwise, Ridge, Lasso এবং Elasticnet কৌশল সম্পর্কে পড়ুন। আরও শেখার জন্য একটি ভালো কোর্স হলো [স্ট্যানফোর্ড স্ট্যাটিস্টিক্যাল লার্নিং কোর্স](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning)।
## অ্যাসাইনমেন্ট
[একটি মডেল তৈরি করুন](assignment.md)
---
**অস্বীকৃতি**:
এই নথিটি AI অনুবাদ পরিষেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনুবাদ করা হয়েছে। আমরা যথাসম্ভব সঠিক অনুবাদের চেষ্টা করি, তবে অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। নথিটির মূল ভাষায় রচিত সংস্করণটিকেই প্রামাণিক উৎস হিসেবে বিবেচনা করা উচিত। গুরুত্বপূর্ণ তথ্যের জন্য পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদ ব্যবহারের ফলে সৃষ্ট কোনো ভুল বোঝাবুঝি বা ভুল ব্যাখ্যার জন্য আমরা দায়ী নই।