# स्किकिट-लर्न प्रयोग गरी रिग्रेसन मोडेल तयार पार्नुहोस्: रिग्रेसन चार तरिकाले
## शुरुवातकर्ताको नोट
लाइनर रिग्रेसन तब प्रयोग गरिन्छ जब हामी **संख्यात्मक मान** (उदाहरणका लागि, घरको मूल्य, तापक्रम, वा बिक्री) भविष्यवाणी गर्न चाहन्छौं।
यो इनपुट फीचर र आउटपुट बीचको सम्बन्धलाई सर्वोत्तम प्रतिनिधित्व गर्ने सिधा रेखा खोज्छ।
यस पाठमा, हामी अवधारणा बुझ्नमा केन्द्रित छौं र पछि थप उन्नत रिग्रेसन प्रविधिहरू अन्वेषण गर्नेछौं।

> इन्फोग्राफिक द्वारा [डासानी मडिपल्ली](https://twitter.com/dasani_decoded)
## [पाठ अघि क्विज](https://ff-quizzes.netlify.app/en/ml/)
> ### [यो पाठ R मा उपलब्ध छ!](../../../../2-Regression/3-Linear/solution/R/lesson_3.html)
### परिचय
अहिलेसम्म तपाईंले रिग्रेसन के हो भनेर पम्पकिन मूल्य निर्धारण डाटासेटबाट संकलित नमुना डाटाको साथ अन्वेषण गर्नुभएको छ जुन यो पाठ भर प्रयोग गरिनेछ। तपाईंले यसलाई म्याटप्लट्लिब प्रयोग गरी भीजरूपमा पनि प्रदर्शन गर्नुभएको छ।
अब तपाईं एमएलका लागि रिग्रेसनमा अझ गहिराइमा जान तयार हुनुहुन्छ। जबकि भीजरूपले डाटालाई बुझ्न मद्दत गर्छ, मेसिन लर्निङको वास्तविक शक्ति _मोडेलहरू प्रशिक्षण_बाट आउँछ। मोडेलहरू ऐतिहासिक डाटामा प्रशिक्षण हुन्छन् जसले स्वचालित रूपमा डाटा निर्भरता समात्छ र नयाँ डाटाका लागि परिणाम भविष्यवाणी गर्न अनुमति दिन्छ जुन मोडेलले पहिले देखेन।
यस पाठमा, तपाईं दुई प्रकारका रिग्रेसनहरूमा थप जान्न हुनेछ: _मूलभूत लाइनर रिग्रेसन_ र _पोलिनोमियल रिग्रेसन_, साथै यी प्रविधिहरूमा आधारित गणित। ती मोडेलहरूले हामीलाई विभिन्न इनपुट डाटामा निर्भर गरी पम्पकिनको मूल्य भविष्यवाणी गर्न अनुमति दिनेछन्।
[](https://youtu.be/CRxFT8oTDMg "ML for beginners - Understanding Linear Regression")
> 🎥 माथिको तस्वीरमा क्लिक गरी लाइनर रिग्रेसनको छोटो भिडियो हेर्नुहोस्।
> यस पाठक्रमभरि, हामी कम गणितीय ज्ञान रहने धारणा गर्छौं, र अन्य क्षेत्रबाट आएका विद्यार्थीहरूका लागि यसलाई सजिलो बनाउने प्रयास गर्दछौं, त्यसैले नोटहरू, 🧮 कलआउटहरू, चित्रहरू, र अन्य सिकाइ उपकरणहरूलाई ध्यानमा राख्नुहोस्।
### पूर्वआवश्यकता
अबसम्म तपाईं पम्पकिन डाटाको संरचनासँग परिचित हुनुहुन्छ जुन हामीले अध्ययन गर्दैछौं। यो डाटा यस पाठको _notebook.ipynb_ फाइलमा प्रीलोड र प्रि-क्लिन गरिएको अवस्थामा छ। फाइलमा, पम्पकिन मूल्य प्रति बुषेल नयाँ डाटा फ्रेममा देखाइएको छ। पक्का गर्नुहोस् कि तपाईं भिजुअल स्टुडियो कोडमा कर्नेलहरूमा यी नोटबुकहरू चलाउन सक्नुहुन्छ।
### तयारी
स्मरणका लागि, तपाईं यस डाटालाई लोड गर्दै हुनुहुन्छ ताकि यससँग सम्बन्धित प्रश्नहरू सोध्न सक्नुहोस्।
- पम्पकिन किन्ने सबैभन्दा उपयुक्त समय कहिले हो?
- मिनिएचर पम्पकिनको केसको मूल्य कति हुन सक्छ?
- के म तिनीहरूलाई आधा-बुषेल बास्केटमा किन्ने वा 1 1/9 बुषेल बाकसद्वारा किन्ने?
यस डाटामा अझै खोतलिरहौं।
अघिल्लो पाठमा, तपाईंले Pandas डाटा फ्रेम सिर्जना गर्नुभयो र मूल डाटासेटको एक भाग प्रयोग गरी मूल्य बुषेल अनुसार सामान्यीकरण गर्नुभयो। यद्यपि, त्यति गर्दा तपाईंले करिब 400 डेटाप्वाइन्ट मात्र सङ्ग्रह गर्न सक्नुभयो र ती पनि केवल पतन महिनाहरूका लागि मात्र।
यस पाठको सम्बन्धित नोटबुकमा हामीले प्रीलोड गरिएको डाटा पुनः हेर्नुहोस्। डाटा प्रीलोड छ र एक प्रारम्भिक स्क्याटरप्लट चार्ट गरिएको छ जुन महिना डाटा देखाउँछ। सायद हामी थप सफाई गरेर डाटाको प्रकृतिबारे थप विवरण प्राप्त गर्न सक्छौं।
## एक रेखीय रिग्रेसन रेखा
पाठ 1 मा सिकेझैं, लाइनर रिग्रेसन अभ्यासको लक्ष्य भनेको एउटा रेखा प्लट गर्न सक्नु हो जुन:
- **चरहरूबीच सम्बन्ध देखाउँछ।** चरहरूबीचको सम्बन्ध देखाउने
- **भविष्यवाणी गर्ने।** नयाँ डेटाप्वाइन्ट त्यहि रेखासँग कसरी सम्बन्धित हुन्छ भनी सही भविष्यवाणी गर्ने
यहाँको रेखा निर्माण **कमसेकम-वर्ग रिग्रेसन (Least-Squares Regression)** मा सामान्य छ। “कमसेकम-वर्ग” त्यस्तो प्रक्रिया प्रकट गर्छ जसले मोडेलको कुल त्रुटि न्यूनतम गर्छ। हरेक डाटाप्वाइन्टका लागि, हामी मौलिक बिन्दु र हाम्रो रिग्रेसन रेखाबीचको उभिएको दूरी (अवशिष्ट भनिने) मापन गर्छौं।
यी अन्तरहरूलाई वर्ग गरेर दुई मुख्य कारणले:
1. **दिशा भन्दा परिमाण:** हामी -5 को त्रुटिलाई +5 जत्तिकै मान्न चाहन्छौं। वर्ग गर्दा सबै मान सकारात्मक हुन्छन्।
2. **आउटलियरहरूलाई दण्ड:** वर्गले ठूला त्रुटि थप trọng दिन्छ, जसले रेखालाई टाढा रहेका पोइन्टहरू नजिक राख्न बाध्य पार्छ।
त्यसपछि ती सबै वर्ग मानहरू जम्मा गर्छौं। हाम्रो लक्ष्य भनेको त्यो विशेष रेखा पत्ता लगाउनु हो जहाँ यो अन्तिम जम्मा सबैभन्दा सानो हुन्छ— त्यसैले यसको नाम “कमसेकम-वर्ग” हो।
> **🧮 मलाई गणित देखाऊ**
>
> यो रेखालाई, जसलाई _सर्वोत्तम मेल रेखा_ भनिन्छ, [एक समीकरणद्वारा](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 को मान गणना गर्नुहोस्। यदि तपाईं लगभग $4 तिर्दै हुनुहुन्छ भने, यो अप्रिल हुनुपर्छ! इन्फोग्राफिक [जेन लुपर](https://twitter.com/jenlooper) द्वारा
>
> गणितले रेखाको ढलान देखाउनुपर्छ, जुन y-अवरोधमा निर्भर गर्दछ, जहाँ `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 को बीचमा सबै ठाउँ छरिएका छन् भने कम सहसम्बन्ध हुन्छ।
एक राम्रो रिग्रेसन मोडेल त्यो हो जसको सहसम्बन्ध गुणांक उच्च हुन्छ (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`](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` बीच सम्बन्ध अनुमान गर्न सक्छौं। तलको स्क्याटरप्लटले पछि चित्रण गरेको सम्बन्ध देखाउँछ:
आउनुस् `corr` function प्रयोग गरी सहसम्बन्ध छ कि छैन जाँचौं:
```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)
```
हाम्रो अन्वेषणले देखाउँछ कि किसिमले मूल्यमा महिना भन्दा बढी प्रभाव पार्छ। हामी यो बार ग्राफबाट देख्न सक्छौं:
```python
new_pumpkins.groupby('Variety')['Price'].mean().plot(kind='bar')
```
अहिले हामी केवल एक किसिम 'पाइ प्रकार' मा केन्द्रित हुँ र मूल्यमा मितिले कस्तो प्रभाव पार्छ जाँचौं:
```python
pie_pumpkins = new_pumpkins[new_pumpkins['Variety']=='PIE TYPE']
pie_pumpkins.plot.scatter('DayOfYear','Price')
```
यदि अब हामी `corr` फङ्क्शन प्रयोग गरी `Price` र `DayOfYear` को सहसम्बन्ध गणना गर्यौं भने, लगभग `-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` गर्नुपर्यो। लाइनर रिग्रेसनले २D एर्रे इनपुट अपेक्षा गर्छ, जहाँ एर्रेको प्रत्येक पंक्ति इनपुट फीचरहरूको वेक्टर हुन्छ। हाम्रो केसमा, हाम्रो केवल एक इनपुट भएकोले 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` हुनेछ, जुन वर्षको सुरुको मूल्य सङ्केत गर्दछ।
हाम्रो मोडेल कति सही छ भनेर हेर्नको लागि, हामी टेस्ट डेटासेटमा मूल्यहरू पूर्वानुमान गर्न सक्छौं, र त्यस पछि हाम्रा पूर्वानुमानहरू अपेक्षित मानहरूसँग कति नजिक छन् मापन गर्न सक्छौं। यसलाई root mean square error (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}%)')
```
हाम्रो त्रुटि लगभग २ पोइन्ट्स छ, जुन ~१७% हो। धेरै राम्रो छैन। मोडेल गुणस्तरको अर्को सूचकांक **coefficient of determination** हो, जुन यसरी प्राप्त गर्न सकिन्छ:
```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)
```
## Polynomial Regression
अर्को प्रकारको Linear Regression हो Polynomial Regression। कहिलेकाहीँ भेरिएबलहरूबीच रेखीय सम्बन्ध हुन्छ - जस्तै भोल्युम अनुसार कद्दु बढ्यो भने मूल्य पनि बढ्छ - तर कहिलेकाहीँ यी सम्बन्धहरू समतल वा सिधा रेखाको रूपमा प्लट गर्न सकिँदैन।
✅ यहाँ [अझ केही उदाहरणहरू](https://online.stat.psu.edu/stat501/lesson/9/9.8) छन् जुन Polynomial Regression प्रयोग गर्न सकिन्छ
मेरो तारिख र मूल्यबीचको सम्बन्ध फेरि हेर्नुहोस्। के यो scatterplot आवश्यक रूपमा सिधा रेखाले विश्लेषण गर्नुपर्छ भन्ने देखिन्छ? मूल्यहरू त कहिलेकाहीँ घटबढ हुन सक्दैन? यस अवस्थामा, तपाईं polynomial regression प्रयास गर्न सक्नुहुन्छ।
✅ Polynomial गणितीय अभिव्यक्तिहरू हुन् जसमा एक वा बढी भेरिएबल र गुणांकहरू हुन सक्छन्
Polynomial regression ले गैररेखीय डाटालाई राम्रोसँग फिट गर्न घुमाउरो रेखा बनाउँछ। हाम्रो मामलामा, यदि हामी `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 features मोडेलमा थप्छ र त्यसपछि रिग्रेसन प्रशिक्षित गर्छ:
```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)` प्रयोग गर्दा हामी इनपुट डाटाबाट सबै दोस्रो डिग्रीका polynomial समावेश गर्नेछौं। हाम्रो मामलामा यसको अर्थ केवल `DayOfYear`2 हुनेछ, तर यदि दुई इनपुट भेरिएबलहरू X र Y छन् भने यसले X2, XY र Y2 जोड्नेछ। हामी उच्च डिग्री polynomial पनि प्रयोग गर्न सक्छौं यदि आवश्यक छ भने।
पाइपलाइनहरूलाई `LinearRegression` वस्तु जस्तै नै प्रयोग गर्न सकिन्छ, अर्थात् हामी pipeline लाई `fit` गर्न सक्छौं र त्यसपछि `predict` प्रयोग गरी पूर्वानुमान नतिजा प्राप्त गर्न सक्छौं। यहाँ टेस्ट डेटा र अनुमानित घुमाउरो देखाइएको छ:
Polynomial Regression प्रयोग गर्दा, हामी अलिकति कम MSE र उच्च गत्यात्मक गुणांक (determination) पाउन सक्छौं, तर धेरै फरक पर्दैन। हामीले अन्य विशेषताहरूलाई पनि ध्यानमा लिनुपर्छ!
> तपाईं देख्न सक्नुहुन्छ कि न्यूनतम कद्दुको मूल्यहरू लगभग Halloween को आसपास देखिन्छ। तपाईं यसलाई कसरी व्याख्या गर्नुहुन्छ?
🎃 बधाई छ, तपाईं एउटा यस्तो मोडेल सिर्जना गर्नुभएको छ जसले पाई कद्दुहरूको मूल्य पूर्वानुमान गर्न मद्दत गर्न सक्छ। तपाईं सजिलै सबै कद्दु प्रजातिहरूका लागि एउटै तरिका पुन: गर्न सक्नुहुन्छ, तर त्यो थोरै अलमलिलो हुनेछ। अब हामी कसरी हाम्रो मोडेलमा कद्दुको प्रजाति ध्यानमा राख्ने जान्न छौं!
## Categorical Features
आदर्श संसारमा, हामी एउटै मोडेलले विभिन्न कद्दु प्रजातिहरूका मूल्य पूर्वानुमान गर्न सक्न चाहन्छौं। यद्यपि, `Variety` स्तम्भ `Month` जस्ता स्तम्भहरूभन्दा फरक छ किनभने यसमा गैर-संख्यात्मक मानहरू छन्। यस्तो स्तम्भहरूलाई **categorical** भनिन्छ।
[](https://youtu.be/DYGliioIAE0 "ML for beginners - Categorical Feature Predictions with Linear Regression")
> 🎥 माथिको तस्वीरमा क्लिक गरेर क्याटेगोरिकल विशेषताहरू प्रयोग गर्ने छोटकरी भिडियो हेर्नुहोस्।
यहाँ तपाईं देख्न सक्नुहुन्छ कि औसत मूल्य प्रजातिमा कसरि निर्भर छ:
प्रजातिलाई ध्यानमा राख्न, हामीले पहिले यसलाई सङ्ख्यात्मक रूपान्तरण (encoding) गर्नुपर्छ। यसका केही तरिकाहरू छन्:
* सरल **सङ्ख्यात्मक इन्कोडिङ** ले विभिन्न प्रजातिहरूको तालिका बनाउँछ र त्यसपछि प्रजातिको नामलाई तालिकामा रहेको अनुक्रमणिका (index) द्वारा प्रतिस्थापन गर्छ। यो रेखीय रिग्रेसनको लागि राम्रो विचार होइन, किनभने रिग्रेसनले अनुक्रमणिकाको वास्तविक संख्यात्मक मानलाई लिन्छ र यसको गुणांकसँग परिणाममा जोड्छ। हाम्रो मामलामा, अनुक्रमणिका र मूल्य बीचको सम्बन्ध स्पष्ट रूपमा गैर-रेखीय छ, भले अनुक्रमणिकाहरू विशेष तरिकाले क्रमबद्ध गरे पनि।
* **One-hot encoding** ले `Variety` स्तम्भलाई चार फरक स्तम्भहरूद्वारा प्रतिस्थापन गर्छ, प्रत्येक प्रजातिका लागि एक स्तम्भ। प्रत्येक स्तम्भमा `1` हुन्छ यदि सो पङ्क्ति त्यो प्रजातिको हो भने र `0` अन्यथा। यसको मतलब रेखीय रिग्रेसनमा चार गुणांकहरू हुनेछन्, प्रत्येक कद्दु प्रजातिको लागि, जुन त्यो विशेष प्रजातिको लागि "सुरुवाती मूल्य" (वा "अतिरिक्त मूल्य") को जिम्मेवार हुनेछ।
तलको कोडले देखाउँछ कसरी एक प्रजातिलाई 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 प्रजातिको रूपमा इनपुट प्रयोग गरी प्रशिक्षित गर्न, हामीलाई `X` र `y` लाई ठीकसँग आरम्भ गर्नुपर्छ:
```python
X = pd.get_dummies(new_pumpkins['Variety'])
y = new_pumpkins['Price']
```
बाकी कोड तेस्तै छ जुन हामीले माथि Linear Regression प्रशिक्षित गर्न प्रयोग गरेका थियौं। यदि तपाईं यसलाई प्रयास गर्नुहुनेछ भने, तपाईं देख्नु हुनेछ कि माध्य वर्गमूल त्रुटि लगभग उस्तै छ, तर हामीलाई धेरै उच्च determination गुणांक (~७७%) प्राप्त हुन्छ। अझ सटीक पूर्वानुमानहरूका लागि, हामी अन्य categorical विशेषताहरू पनि र संख्यात्मक विशेषताहरू जस्तै `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 २.८४ (१०%) र determination ०.९४ दिन्छ!
## सबैलाई एक साथ राख्दै
सबैभन्दा राम्रो मोडेल बनाउन, हामी माथि दिइएको नमूनाको मिश्रित (one-hot encoded categorical + numeric) डाटालाई 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 गुणांक र MSE=२.२३ (~८% पूर्वानुमान त्रुटि) देला।
| मोडेल | MSE | Determination |
|-------|-----|---------------|
| `DayOfYear` Linear | २.७७ (१७.२%) | ०.०७ |
| `DayOfYear` Polynomial | २.७३ (१७.०%) | ०.०८ |
| `Variety` Linear | ५.२४ (१९.७%) | ०.७७ |
| सबै विशेषताहरू Linear | २.८४ (१०.५%) | ०.९४ |
| सबै विशेषताहरू Polynomial | २.२३ (८.२५%) | ०.९७ |
🏆 राम्रो काम! तपाईंले एउटै पाठमा चार वटा Regression मोडेलहरू सिर्जना गर्नुभयो र मोडेलको गुणस्तर ९७% सम्म बढाउनुभयो। Regression को अन्तिम भागमा, तपाईं Logistic Regression बारे जान्नु हुनेछ जुन वर्गहरू निर्धारण गर्न प्रयोग हुन्छ।
---
## 🚀Challenge
यस नोटबुकमा विभिन्न भेरिएबलहरू परीक्षण गर्नुहोस् ताकि कसरि सहसम्बन्ध (correlation) मोडेलको सटीकता अनुसार जान्छ बुझ्न सकियोस्।
## [पाठ-पछि प्रश्नोत्तरी](https://ff-quizzes.netlify.app/en/ml/)
## पुनरावलोकन र आत्मअध्ययन
यस पाठमा हामीले Linear Regression बारे सिक्यौं। अन्य महत्वपूर्ण Regression प्रकारहरू पनि छन्। Stepwise, Ridge, Lasso र Elasticnet प्रविधिहरूको बारेमा पढ्नुहोस्। थप जान्न एक राम्रो कोर्स हो [Stanford Statistical Learning course](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning)
## असाइनमेन्ट
[मोडेल बनाउनुहोस्](assignment.md)
---
**अस्वीकरण**:
यस दस्तावेजलाई AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) प्रयोग गरी अनुवाद गरिएको हो। हामी सटीकताको प्रयास गर्छौं भने पनि, कृपया जानकारि हुनुहोस् कि स्वचालित अनुवादमा त्रुटिहरू वा गलतफहमीहरू हुनसक्छन्। मूल दस्तावेज आफ्नो मूल भाषामै अधिकारिक स्रोत मानिनु पर्छ। महत्वपूर्ण जानकारीको लागि व्यावसायिक मानव अनुवाद सिफारिस गरिन्छ। यस अनुवादको प्रयोगबाट उत्पन्न कुनै पनि गलतफहमी वा व्याख्यामा हामी जिम्मेवार छैनौं।