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

> ইনফোগ্রাফিক [দাসানি মাডিপাল্লি](https://twitter.com/dasani_decoded) দ্বারা
## [পূর্ব-লেকচার কুইজ](https://ff-quizzes.netlify.app/en/ml/)
> ### [এই পাঠটি R ভাষায় পাওয়া যায়!](../../../../2-Regression/3-Linear/solution/R/lesson_3.html)
### পরিচিতি
এখন পর্যন্ত আপনি পদক্ষেপভিত্তিক রিগ্রেশন কী তা অন্বেষণ করেছেন, আমরা যা ব্যবহার করছি সেসব কুমড়ো মূল্য ডেটাসেট থেকে উদাহরণ হিসেবে। আপনি matplotlib দিয়ে এটি ভিজুয়ালাইজেশনও করেছেন।
এখন আপনি এমএল এর জন্য রিগ্রেশনে আরও গভীরে প্রবেশ করার জন্য প্রস্তুত। ভিজুয়ালাইজেশন ডেটা বোঝার জন্য সাহায্য করে, কিন্তু মেশিন লার্নিংয়ের আসল শক্তি আসে _মডেল প্রশিক্ষণ_ থেকে। মডেলগুলি ঐতিহাসিক ডেটায় প্রশিক্ষিত হয় যাতে তারা ডেটার নির্ভরতা স্বয়ংক্রিয়ভাবে ধরতে পারে, এবং এটি নতুন ডেটার জন্য পূর্বাভাস দিতে সক্ষম করে, যা আগে মডেল দেখেনি।
এই পাঠে, আপনি দুই ধরনের রিগ্রেশন সম্পর্কে শেখবেন: _মৌলিক লিনিয়ার রিগ্রেশন_ এবং _পলিনোমিয়াল রিগ্রেশন_, এর সাথে এই প্রযুক্তির প্রাথমিক গাণিতিক ধারণা। এই মডেলগুলি আমাদের দেয় আলাদা ইনপুট ডেটার উপর ভিত্তি করে কুমড়োর দাম অনুমান করার সুযোগ।
[](https://youtu.be/CRxFT8oTDMg "ML for beginners - Understanding Linear Regression")
> 🎥 উপরের ছবিতে ক্লিক করুন লিনিয়ার রিগ্রেশনের একটি সংক্ষিপ্ত ভিডিও ওভারভিউ এর জন্য।
> এই কারিকুলামের পুরো সময় আমরা গাণিতিক জ্ঞান সীমিত ধরেই চলব, এবং অন্য ক্ষেত্রে থেকে আসা শিক্ষার্থীদের জন্য এটি সহজবোধ্য করার চেষ্টা করব, তাই নোট, 🧮 কলআউট, চিত্র এবং অন্যান্য শিক্ষণ সরঞ্জাম লক্ষ্য রাখুন সহায়তার জন্য।
### পূর্ব শর্ত
আপনি এখন পর্যন্ত যে কুমড়ো ডেটা নিয়ে কাজ করছেন তার কাঠামো সম্পর্কে পরিচিত হওয়া উচিত। এটি আপনি এটি আগেই লোড ও ক্লিন করে রেখেছেন এই পাঠের _notebook.ipynb_ ফাইলে। এই ফাইলে, কুমড়ো দামের তথ্য প্রতি বাসেলের হিসেবে নতুন ডেটা ফ্রেমে দেখানো হয়েছে।
Visual Studio Code এ কনর্নেলে এই নোটবুকগুলো চালাতে পারবেন কিনা তা পরীক্ষা করে নিন।
### প্রস্তুতি
স্মরণ করিয়ে দিতে চাই, আপনি এই ডেটা লোড করছেন যাতে এর জন্য প্রশ্ন করতে পারেন।
- কখন কুমড়ো কেনা সবচেয়ে ভালো সময়?
- ছোট আকারের কুমড়োর একটি কেসের দাম প্রায় কত হবে?
- কি আমি এগুলো আধা বাসেল বস্তায় কিনব, না ১ ১/৯ বাসেল বাক্সে?
চলুন এ ডেটার খোঁজ চালিয়ে যাই।
আগের পাঠে, আপনি একটি Pandas ডেটা ফ্রেম তৈরি করেছিলেন এবং মূল ডেটাসেটের একটি অংশ দিয়ে পূর্ণ করেছিলেন, দামগুলো বাসেল অনুযায়ী মানানসই করে। এর ফলে, আপনি মাত্র ৪০০-র মতো ডেটাপয়েন্ট এবং শুধুমাত্র শরতের মাসগুলো নিয়েই তথ্য সংগ্রহ করতে পেরেছিলেন।
এই পাঠের সঙ্গেই প্রিলোড করা ডেটা দেখুন। ডেটা লোড করা হয়েছে এবং প্রথম একটি স্ক্যাটারপ্লট চার্টে মাস অনুযায়ী দেখানো হয়েছে। হয়তো আরও পরিষ্কার করতে ডেটা ক্লিন করে আরও বিশদ পেতে পারি।
## একটি লিনিয়ার রিগ্রেশন লাইন
যেমন আপনি পাঠ ১ এ শিখেছেন, লিনিয়ার রিগ্রেশন চর্চার লক্ষ্য হলো একটি লাইন আঁকা যাতে:
- **চর পরিবর্তনের সম্পর্ক দেখানো**। চর পরিবর্তনের মধ্যে সম্পর্ককে উপস্থাপন করা।
- **পূর্বাভাস তৈরি**। এমন একটি পূর্বাভাস তৈরি করা যেখানে নতুন ডেটাপয়েন্ট সেই লাইন সম্পর্কিত কোথায় পড়বে তা নির্ধারণ করা যায়।
সাধারণত, **লিস্ট-স্কোয়ার্স রিগ্রেশন** এই ধরনের লাইন আঁকার জন্য ব্যবহৃত হয়। "লিস্ট-স্কোয়ার্স" শব্দটি বোঝায় এমন একটি প্রক্রিয়া যেখানে মোট ত্রুটি (এরর) সর্বনিম্ন করার চেষ্টা করা হয়। প্রতিটি ডেটা পয়েন্টের জন্য, আমরা আসল পয়েন্ট এবং আমাদের রিগ্রেশন লাইনের মধ্যে উল্লম্ব দূরত্ব (যা রেসিডুয়াল নামে পরিচিত) পরিমাপ করি।
আমরা এই দূরত্বগুলো বর্গ করি কারণ দুটি প্রধান কারণ:
1. **দিকের উপর নয় মাত্রার ভিত্তিতে:** আমরা -৫ এর ত্রুটিকেও +৫ এর ত্রুটির মতোই বিবেচনা করতে চাই। বর্গ করলে সব মান ধনাত্মক হয়।
2. **আউটলায়ারদের জন্য বেশি শাস্তি:** বড় ত্রুটির বর্গ করলে তার ওজন বেশি হয়, ফলে লাইন দূরে থাকা পয়েন্টের কাছাকাছি থাকে।
তারপর আমরা সব বর্গ করা দূরত্ব একত্র করি। আমাদের লক্ষ্য হল এমন একটি নির্দিষ্ট লাইন খোঁজা যেখানে এই যোগফল সর্বনিম্ন থাকবে — তাই নাম "লিস্ট-স্কোয়ার্স"।
> **🧮 আমাকে গাণিতিক সূত্র দেখাও**
>
> এই লাইন, যা _লাইন অফ বেস্ট ফিট_ বলা হয়, এক [সমীকরণের মাধ্যমে](https://en.wikipedia.org/wiki/Simple_linear_regression) প্রকাশ করা যায়:
>
> ```
> Y = a + bX
> ```
>
> `X` হল 'ব্যাখ্যামূলক ভেরিয়েবল'। `Y` হল 'নির্ভরশীল ভেরিয়েবল'। লাইনের ঢাল `b` এবং `a` হল y-ইন্টারসেপ্ট যা নির্দেশ করে যখন `X = 0` তখন `Y` এর মান কত।
>
>
>
> প্রথমে, ঢাল `b` হিসাব করুন। ইনফোগ্রাফিক [জেন লুপার](https://twitter.com/jenlooper) দ্বারা
>
> অন্য কথায়, আমাদের কুমড়ো ডেটার প্রশ্ন অনুযায়ী: "মাস অনুযায়ী প্রতি বাসেলে কুমড়োর দাম অনুমান করুন", এখানে `X` হবে দাম এবং `Y` হবে বিক্রয়ের মাস।
>
>
>
> Y এর মান হিসাব করুন। যদি আপনি প্রায় $৪ প্রদান করছেন, তবে এটা অবশ্যই এপ্রিল! ইনফোগ্রাফিক [জেন লুপার](https://twitter.com/jenlooper) দ্বারা
>
> গাণিতিক সূত্রটি লাইন এর ঢাল দেখাতে হবে, যা নির্ভর করে y-ইন্টারসেপ্টের উপর, অর্থাৎ `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) দেখুন সংখ্যাগুলোর মান কীভাবে লাইনে প্রভাব ফেলে।
## সহসंबন্ধ (Correlation)
আরেকটি শব্দ যা বুঝতে হবে তা হল X এবং Y এর মধ্যে **করেলেশন সহগ**। একটি scatterplot ব্যবহার করে আপনি দ্রুত এই সহগটি দেখতে পারেন। একটি স্ক্যাটারপ্লটে পয়েন্টগুলো সুসজ্জিত রেখায় থাকলে করেলেশন বেশি, আর যেসব পয়েন্ট এলোমেলো ছড়িয়ে থাকে সেসবের করেলেশন কম।
একটি ভালো লিনিয়ার রিগ্রেশন মডেল হবে যার লিস্ট-স্কোয়ার্স রিগ্রেশন ব্যবহারের মাধ্যমে করেলেশন সহগ বেশি (0 এর থেকে 1 এর দিকে) হবে।
✅ এই পাঠের সাথে থাকা নোটবুক চালিয়ে দেখুন এবং মাস এবং দাম এর scatterplot টি দেখুন। আপনার ভিজুয়াল ইন্টারপ্রিটেশন অনুযায়ী কি মাস থেকে দাম এর ডেটার উপর করেলেশন বেশি নাকি কম বলে মনে হচ্ছে? আপনি কি পেতে পারেন আরও সূক্ষ্ম মাপ যেমন *বছরের দিন* (অর্থাৎ বছরের শুরু থেকে কততম দিন)?
নীচের কোডে, আমরা ধরে নিচ্ছি যে ডেটা আমরা ক্লিন করেছি এবং একটি `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")
> 🎥 উপরের ছবিতে ক্লিক করুন করেলেশন সম্পর্কে ছোট ভিডিও ওভারভিউ এর জন্য।
গত পাঠ থেকে আপনি নিশ্চয়ই দেখেছেন ভিন্ন ভিন্ন মাসে গড় দাম কেমন লাগে:
এটি নির্দেশ করে কিছু করেলেশন থাকবে, এবং আমরা চেষ্টা করতে পারি লিনিয়ার রিগ্রেশন মডেল প্রশিক্ষণ করতে যা `Month` এবং `Price` বা `DayOfYear` এবং `Price` এর মধ্যকার সম্পর্ক অনুমান করবে। নিচে scatterplot আছে যা `DayOfYear` এবং `Price` এর সম্পর্ক দেখায়:
চলুন দেখি `corr` ফাংশন দিয়ে করেলেশন কেমন:
```python
print(new_pumpkins['Month'].corr(new_pumpkins['Price']))
print(new_pumpkins['DayOfYear'].corr(new_pumpkins['Price']))
```
করেলেশন সম্ভবত খুব বেশি নয়, মাস অনুসারে প্রায় -০.১৫ এবং `DayOfMonth` অনুসারে -০.১৭, কিন্তু হতে পারে অন্য গুরুত্বপূর্ণ সম্পর্ক আছে। মনে হচ্ছে দাম বিভিন্ন কুমড়ো প্রকার অনুসারে আলাদা আলাদা ক্লাস্টারে বিভক্ত। এই অনুমান নিশ্চিত করতে, প্রতিটি কুমড়ো ধরণ একটি আলাদা রঙে প্লট করি। `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)
```
আমাদের তদন্তে দেখা যায়, কুমড়োর প্রকার দামকে বিক্রয় তারিখের চেয়ে বেশি প্রভাবিত করে। এটি একটি বার গ্রাফ থেকে স্পষ্ট:
```python
new_pumpkins.groupby('Variety')['Price'].mean().plot(kind='bar')
```
এখন আমরা শুধুমাত্র একটি কুমড়ো প্রকারের দিকে মনোযোগ দিবো, 'pie type', এবং দেখি বিক্রয় তারিখের মূল্যতে কী প্রভাব:
```python
pie_pumpkins = new_pumpkins[new_pumpkins['Variety']=='PIE TYPE']
pie_pumpkins.plot.scatter('DayOfYear','Price')
```
`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
```
আমরা প্রথমে ইনপুট মান (ফিচার) এবং প্রত্যাশিত আউটপুট (লেবেল) আলাদা নাম্পাই অ্যারেতে বিভক্ত করব:
```python
X = pie_pumpkins['DayOfYear'].to_numpy().reshape(-1,1)
y = pie_pumpkins['Price']
```
> লক্ষ্য করুন, ইনপুট ডেটাকে `reshape` করতে হয়েছে যাতে লিনিয়ার রিগ্রেশন প্যাকেজ এটি সঠিকভাবে বুঝতে পারে। লিনিয়ার রিগ্রেশন ২-ডি অ্যারে প্রত্যাশা করে, যেখানে অ্যারের প্রতিটি সারি ইনপুট ফিচারের ভেক্টর। আমাদের ক্ষেত্রে, যেহেতু কেবল একটি ইনপুট আছে, তাই N x 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` হবে, যা বছরের শুরুতে মূল্যের নির্দেশ করে।
আমাদের মডেল কতটা সঠিক তা দেখার জন্য, আমরা টেস্ট ডেটাসেটে দাম প্রেডিক্ট করতে পারি, এবং তারপর আমাদের পূর্বাভাসগুলি প্রত্যাশিত মানের সাথে কতটা কাছাকাছি তা পরিমাপ করি। এটি করা যায় mean square error (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)
```
যদি মান ০ হয়, এর অর্থ মডেল ইনপুট তথ্য বিবেচনায় নেয় না, এবং *worst linear predictor* হিসেবে কাজ করে, যা কেবল ফলাফলের গড় মান। ১ এর মানে হল আমরা সব প্রত্যাশিত আউটপুট নিখুঁতভাবে প্রেডিক্ট করতে পারি। আমাদের ক্ষেত্রে, কোএফিসিয়েন্ট প্রায় ০.০৬, যা বেশ কম।
আমরা টেস্ট ডেটা এবং রিগ্রেশন লাইনের গ্রাফও আঁকতে পারি যেন ভালভাবে বুঝতে পারি কিভাবে রিগ্রেশন কাজ করে আমাদের ক্ষেত্রে:
```python
plt.scatter(X_test,y_test)
plt.plot(X_test,pred)
```
## Polynomial Regression
রৈখিক রিগ্রেশনের আরেকটি ধরন হল Polynomial Regression। মাঝে মাঝে ভেরিয়েবলগুলোর মধ্যে সরলরৈখিক সম্পর্ক থাকে - যেমন ভলিউমে বড় পাম্পকিনের দাম বেশি হয় - কিন্তু কখনো কখনো এই সম্পর্কগুলো প্লেন বা সরলরেখা হিসেবে ছবি করা যায় না।
✅ এখানে [আরো কিছু উদাহরণ](https://online.stat.psu.edu/stat501/lesson/9/9.8) আছে যেখানে Polynomial Regression ব্যবহার করা যেতে পারে।
আবার Date এবং Price এর সম্পর্ক দেখুন। এই scatterplot কি অবশ্যই সরলরেখা দ্বারা বিশ্লেষণ করা উচিত বলে মনে হয়? দাম কি ওঠানামা করতে পারে না? এই ক্ষেত্রে, আপনি polynomial regression চেষ্টা করতে পারেন।
✅ পলিনোমিয়াল হলো গাণিতিক প্রকাশ যা এক বা একাধিক ভেরিয়েবল ও কোএফিসিয়েন্ট নিয়ে গঠিত হতে পারে।
Polynomial Regression একটি বাকা রেখা তৈরি করে যাতে নন-লিনিয়ার ডেটা ভালো ফিট হয়। আমাদের ক্ষেত্রে, যদি ইনপুট ডেটাতে squared `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 তৈরি করব যা প্রথমে polynomial ফিচার তৈরি করে, তারপরে রিগ্রেশন ট্রেন করে:
```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`2, কিন্তু যদি ইনপুটে দুটি ভেরিয়েবল X এবং Y থাকে, তাহলে এটি X2, XY এবং Y2 যোগ করবে। আমরা চাইলে উচ্চতর ডিগ্রী পলিনোমিয়ালও ব্যবহার করতে পারি।
Pipeline মূল `LinearRegression` অবজেক্টের মতো ব্যবহার করা যাবে, যেমন আমরা pipeline কে `fit` করতে পারি, এবং তারপর `predict` ব্যবহার করে ফলাফল পেতে পারি। নিচের গ্রাফে টেস্ট ডেটা আর অ্যাপ্রক্সিমেশন কুভ দেখানো হয়েছে:
Polynomial Regression ব্যবহার করলে আমরা কিছুটা কম MSE এবং বেশি determination পাই, তবে উল্লেখযোগ্য নয়। আমাদের অন্য ফিচারগুলোও বিবেচনায় নিতে হবে!
> আপনি লক্ষ্য করতে পারেন যে হ্যালোউইনের সময় পাম্পকিনের দাম ন্যূনতম পর্যায়ে থাকে। আপনি এই ঘটনা কীভাবে ব্যাখ্যা করবেন?
🎃 অভিনন্দন, আপনি একটি মডেল তৈরি করেছেন যা পাই পাম্পকিনের দাম পূর্বাভাস দিতে পারে। সম্ভবত আপনি একই পদ্ধতি অন্য সব ধরনের পাম্পকিনের জন্যও অনুসরণ করতে পারেন, তবে সেটা ক্লান্তিকর হবে। চলুন এখন শিখি কিভাবে পাম্পকিনের ভ্যারাইটি আমাদের মডেলে বিবেচনা করা যায়!
## Categorical Features
আদর্শ জগতে, আমরা চাই একই মডেল ব্যবহার করে বিভিন্ন পাম্পকিন ভ্যারাইটির দাম পূর্বাভাস দিতে পারি। কিন্তু `Variety` কলামটি `Month` এর মত নয়, কারণ এতে অ-সংখ্যাত্মক মান থাকে। এমন কলামগুলোকে **categorical** বলা হয়।
[](https://youtu.be/DYGliioIAE0 "ML for beginners - Categorical Feature Predictions with Linear Regression")
> 🎥 উপরের ছবিতে ক্লিক করে ক্যাটেগরিক্যাল ফিচার ব্যবহার করার একটা ছোট ভিডিও দেখতে পারেন।
এখানে আপনি দেখতে পাচ্ছেন কিভাবে গড় দাম ভ্যারাইটির ওপর নির্ভর করে:
ভ্যারাইটিকে বিবেচনায় নিতে প্রথমে এটিকে সংখ্যাত্মক ফর্মে রূপান্তর করতে হবে, বা **encode** করতে হবে। আমরা এটি করার কয়েকটি পদ্ধতি ব্যবহার করতে পারি:
* সাধারণ **numeric encoding** একটি ভ্যারাইটির তালিকা তৈরি করে, এবং তারপর আলাদা ভ্যারাইটির নামের পরিবর্তে তালিকার ইন্ডেক্স যোগ করে। এটি লিনিয়ার রিগ্রেশনের জন্য ভাল নয়, কারণ লিনিয়ার রিগ্রেশন ইনডেক্সের সংখ্যাটিকে গণ্য করে ফলাফলে যোগ করে কোন কোএফিসিয়েন্টের গুণিতকে। আমাদের ক্ষেত্রে, ইনডেক্স নম্বর এবং দাম এর সম্পর্ক স্পষ্টভাবে নন-লিনিয়ার, যদিও ইনডেক্সগুলি বিশেষভাবে সাজানো হোক।
* **One-hot encoding** `Variety` কলামকে ৪টি আলাদা কলামে ভেঙে দেয়, প্রতিটি ভ্যারাইটির জন্য একটি করে। প্রতিটি কলামে ১ থাকবে যদি ভ্যারাইটির রোটি সেই ভ্যারাইটির হয়, অন্যথায় ০। এর ফলে লিনিয়ার রিগ্রেশনে প্রতিটি পাম্পকিন ভ্যারাইটির জন্য চারটি কোএফিসিয়েন্ট থাকবে, যা ঐ ভ্যারাইটির "শুরুর দাম" (বা "অতিরিক্ত দাম") নির্দেশ করে।
নিচের কোডটি দেখায় কিভাবে আমরা একটি ভ্যারাইটিকে one-hot encode করতে পারি:
```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
One-hot encoded variety ইনপুট ব্যবহার করে লিনিয়ার রিগ্রেশন ট্রেন করতে, আমরা কেবল সঠিকভাবে `X` এবং `y` ডেটা ইনিশিয়ালাইজ করলেই হয়:
```python
X = pd.get_dummies(new_pumpkins['Variety'])
y = new_pumpkins['Price']
```
বাকি কোড আগের লিনিয়ার রিগ্রেশন ট্রেন করার মতই। চেষ্টা করলে দেখবেন mean squared error প্রায় একই থাকে, কিন্তু determination অনেক বেশি (~৭৭%) হয়। আরো সঠিক পূর্বাভাস পেতে আমরা আরো ক্যাটেগরিক্যাল ফিচার এবং সংখ্যাত্মক ফিচার যেমন `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 (১০%) এবং determination 0.94 দেয়!
## Putting it all together
সেরা মডেল তৈরি করতে আমরা উপরের উদাহরণ থেকে একত্রিত (one-hot encoded ক্যাটেগরিক্যাল + সংখ্যাত্মক) ডেটা Polynomial Regression এর সঙ্গে ব্যবহার করতে পারি। আপনার সুবিধার জন্য সম্পূর্ণ কোড এখানে:
```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)
```
এটি প্রায় ৯৭% determination coefficient এবং MSE=2.23 (~৮% পূর্বাভাস ত্রুটি) দেবে।
| Model | MSE | Determination |
|-------|-----|---------------|
| `DayOfYear` Linear | 2.77 (১৭.২%) | 0.07 |
| `DayOfYear` Polynomial | 2.73 (১৭.০%) | 0.08 |
| `Variety` Linear | 5.24 (১৯.৭%) | 0.77 |
| All features Linear | 2.84 (১০.৫%) | 0.94 |
| All features Polynomial | 2.23 (৮.২৫%) | 0.97 |
🏆 শুভকামনা! আপনি এক পাঠে চারটি রিগ্রেশন মডেল তৈরী করেছেন, এবং মডেল গুণমান ৯৭% উন্নত করেছেন। রিগ্রেশন এর শেষ অংশে আপনি লজিস্টিক রিগ্রেশন সম্পর্কে শিখবেন যা শ্রেণি নির্ধারণে ব্যবহৃত হয়।
---
## 🚀Challenge
এই নোটবুকে বিভিন্ন ভেরিয়েবল টেস্ট করে দেখুন কিভাবে সহসম্পর্ক মডেলের নির্ভুলতার সাথে সম্পর্কিত।
## [Post-lecture quiz](https://ff-quizzes.netlify.app/en/ml/)
## Review & Self Study
এই পাঠে আমরা লিনিয়ার রিগ্রেশন শিখেছি। রিগ্রেশনের আরো গুরুত্বপূর্ণ ধরণ রয়েছে। Stepwise, Ridge, Lasso এবং Elasticnet টেকনিক সম্পর্কে পড়ুন। আরও জানার জন্য ভালো একটি কোর্স হলো [Stanford Statistical Learning course](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning)।
## Assignment
[Build a Model](assignment.md)
---
**অস্বীকৃতি**:
এই নথিটি কৃত্রিম বুদ্ধিমত্তা অনুবাদ সেবা [Co-op Translator](https://github.com/Azure/co-op-translator) ব্যবহার করে অনূদিত হয়েছে। যদিও আমরা সঠিকতার জন্য চেষ্টা করি, দয়া করে চোখ বুলিয়ে নিন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল নথিটি তার নিজস্ব ভাষায় কর্তৃপক্ষসূত্র হিসাবে বিবেচিত হওয়া উচিত। গুরুত্বপূর্ণ তথ্যের জন্য পেশাদার মানব অনুবাদের পরামর্শ দেওয়া হয়। এই অনুবাদের ব্যবহারে কোনো ভুলবোঝাবুঝি বা ভুল ব্যাখ্যার জন্য আমরা দায়ী নই।