# Scikit-learn ఉపయోగించి రిగ్రెషన్ మోడల్ ను నిర్మించండి: రిగ్రెషన్ నాలుగు విధాలుగా
## ప్రారంభిక గమనిక
లీనియర్ రిగ్రెషన్ అనేది మనం ఒక **న్యూమరిక్ విలువను** (ఉదాహరణకు, ఇంటి ధర, ఉష్ణోగ్రత, లేదా అమ్మకాలు) అంచనా వేసేటప్పుడు ఉపయోగిస్తాం.
ఇది ఇన్పుట్ ఫీచర్లు మరియు అవుట్పుట్ మధ్య సంబంధాన్ని ఉత్తమంగా ప్రతిబింబించే సరియైన రేఖ కనుగొనడం ద్వారా పనిచేస్తుంది.
ఈ పాఠంలో, మేము ఈ ఆలోచనను బాగా అర్థం చేసుకోవడంపై దృష్టి సారిస్తాము, తరువాత మరింత అభివృద్ధి చెందిన రిగ్రెషన్ సాంకేతికతలను పరిశీలిస్తాము.

> ఇన్ఫోగ్రాపిక్ రూపొందించిన [Dasani Madipalli](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 "మెషిన్ లెర్నింగ్ ప్రారంభవారికి - లీనియర్ రిగ్రెషన్ అర్థం చేసుకోవడం")
> 🎥 లీనియర్ రిగ్రెషన్ సంక్షిప్త వీడియో అవలోకనానికి పై చిత్రం పై క్లిక్ చేయండి.
> ఈ కోర్సు మొత్తం, మేము కనీస గణిత జ్ఞానంతో ఉన్నవారిని అనుకుంటూ, ఇతర రంగాల నుండి వచ్చిన మైత్రియులకు అనువుగా చేయాలని చూస్తున్నాం, కావున గమనికలు, 🧮 గణిత బొమ్మలు, డయాగ్రామ్లు మరియు ఇతర నేర్చుకోవడంలో సహాయక సాధనాల కోసం చూస్తూ ఉండండి.
### ముందు జ్ఞానం
మీకు ఇప్పటివరకు మనం పరిశీలిస్తున్న పుంప్కిన్ డేటా నిర్మాణం తెలుసు అనుకోవచ్చు. దీనిని ఈ పాఠం యొక్క _notebook.ipynb_ ఫైల్ లో ముందుగా లోడ్ చేసి, శుభ్రపరిచిన రూపంలో పొందవచ్చు. ఆ ఫైల్లో పుంప్కిన్ ధరను బషెల్ ప్రధానంగా కొత్త డేటా ఫ్రేమ్ లో ప్రదర్శించబడింది. Visual Studio Code లో kernel లను ఉపయోగించి ఈ నోట్బుక్స్ ను నడుపగలగడం నిర్ధారించుకోండి.
### రెడీ కావడం
గమనికగా, మీరు ఈ డేటా లోడ్ చేస్తున్నారు తద్వారా దాని పట్ల ప్రశ్నలు అడగడానికి.
- పుంప్కిన్లు కొనుగోలు చేయడానికి ఉత్తమ సమయం ఎప్పుడు?
- మినీ పుంప్కిన్ల కేప్ ధర ఎంత ఊహించగలవు?
- వాటిని సగం బషెల్ బాస్కెట్లలో కొనాలి లేదా 1 1/9 బషెల్ బాక్స్లోనా?
దీనిపై మరింత లోతుగా పరిశోధిద్దాం.
మునుపటి పాఠంలో, మీరు ఒక Pandas డేటా ఫ్రేమ్ సృష్టించి, అసలు డేటా సెట్ లోని ఒక భాగంతోpopulate చేసి, ధరలను బషెల్ ఆధారంగా స్తాండర్డైజ్ చేశారు. అలా చేసినప్పుడు మీరు సుమారుగా 400 డేటాపాయింట్లు మాత్రమే సేకరించగలిగారు మరియు فقط వేసవి నెలల కోసం మాత్రమే.
ఈ పాఠంలోని సహాయక నోట్బుక్లో ముందుగానే లోడ్ చేసిన డేటాను చూడండి. డేటా ముందే లోడ్ చేయబడింది మరియు ప్రారంభ స్కాటర్ ప్లాట్ నెలల డేటాని చూపిస్తుంది. మరింత శుభ్రపరిచి డేటా స్వభావం గురించి కొంత స్పష్టత పొందవచ్చు.
## ఒక లీనియర్ రిగ్రెషన్ రేఖ
మీరు పాఠం 1 లో ఎక్కడ నేర్చుకున్నదానిని అనుసరించి, లీనియర్ రిగ్రెషన్ వ్యాయామం లక్ష్యం ఒక రేఖను గీసే అవకాశం:
- **చరాలను చూపండి**: చరాల మధ్య సంబంధాన్ని ప్రదర్శించండి
- **అంచనాలు చేయండి**: కొత్త డేటాపాయింట్ ఆ రేఖకు సంబంధించి ఎక్కడ పడుతుందో సరిగ్గా అంచనా వేయండి
**లీస్ట్-స్క్వేర్ రిగ్రెషన్** ఈ రకమైన ఒక రేఖ గీసే మార్గం. "లీస్ట్-స్క్వేర్" అనే పదం మన మోడల్ లో తప్పిదాన్ని తగ్గించే ప్రక్రియను సూచిస్తుంది. ప్రతి డేటాపాయింట్ కోసం, మనం నిజమైన పాయింట్ మరియు రిగ్రెషన్ రేఖ మధ్య నిలువరేఖా దూరం (రెసిడ్యుయల్) కొలుస్తాము.
ఈ దూరాలను రెండు ముఖ్య కారణాల వల్ల స్క్వేర్ చేస్తాము:
1. **దిశ కంటే పరిమాణం**: మనం -5 లో తప్పిదాన్ని +5 లో తప్పిదం లాంటివిగా తలచాలి. స్క్వేరింగ్ అన్ని విలువలను ధనాత్మకంగా మార్చుతుంది.
2. **అతిరేక పాయింట్లకు కఠినంగా నిందించడం**: స్క్వేరు తప్పిదం పెద్దదైతే, ఆ రేఖ తప్పిదం ఎక్కువ ఉన్న పాయింట్లకు సమీపంగా ఉంటుందని చెబుతుంది.
మేము ఆ స్క్వేర్డ్ విలువలను కలుపుతాము. మన లక్ష్యం ఆ చివరి మొత్తం విలువ కనిష్టమయ్యే రేఖ కనుగొనడం.
> **🧮 నాకు గణితం చూపించు**
>
> ఈ రేఖ, _లైన్ ఆఫ్ బెస్ట్ ఫిట్_ అంటారు, [సమీకరణ](https://en.wikipedia.org/wiki/Simple_linear_regression) ద్వారా వ్యక్తమవుతుంది:
>
> ```
> Y = a + bX
> ```
> `X` అనేది 'వివరణాత్మక చర'గా పిలవబడుతుంది. `Y` అనేది 'ఆధారపడి ఉన్న చర'. రేఖ యొక్క స్లోప్ `b` మరియు `a` అనేది y-ఇంటర్సెప్ట్, అంటే `X = 0` ఉన్నప్పుడు `Y` విలువ.
>
>
>
> మొదట స్లోప్ `b` లెక్కించండి. ఇన్ఫోగ్రాఫిక్ రూపొందించిన [Jen Looper](https://twitter.com/jenlooper)
>
> మరొక మాటలో చెప్పాలంటే, మన పుంప్కిన్ డేటా అసలు ప్రశ్న మేరకు: "నెలకు పుంప్కిన్ ధర అంచనా వేయాలి" అనుకుంటే, `X` ధరకి సంబంధించినది, మరియు `Y` అమ్మకాల నెలకు సంబంధించినది.
>
>
>
> Y విలువను లెక్కించండి. మీరు సుమారుగా $4 చుట్టూ చెల్లిస్తుంటే అది తప్పకుండా ఏప్రిల్ కావాలి! ఇన్ఫోగ్రాఫిక్ డిజైన్ చేసిన [Jen Looper](https://twitter.com/jenlooper)
>
> ఈ సమీకరణ లెక్కింపు పద్ధతి slope ను ప్రదర్శించాలి, ఇది ఇంటర్సెప్ట్ మీద ఆధారపడి ఉంటుంది, అంటే `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)**. స్కాటర్ ప్లాట్ ఉపయోగించి ఈ గుణకం త్వరగా గమనించవచ్చు. ఒక రేఖలో పాయింట్లు సరిగా అమర్చబడి ఉంటే, అది అధిక సహసంబంధం అని, కానీ పాయింట్లు విస్తృతంగా చురుకుగా చల్లబడితే సహసంబంధం తక్కువ అని అర్థం.
ఒక మంచి లీనియర్ రిగ్రెషన్ మోడల్ అంటే లీస్ట్-స్క్వేర్ రిగ్రెషన్ పద్ధతిలో గల సహసంబంధ గుణకం 1కి దగ్గరగా ఉండటం.
✅ ఈ పాఠం యొక్క నోట్బుక్ నడబడించి, నెల మరియు ధర మధ్య స్కాటర్ ప్లాట్ని పరిశీలించండి. మీ విజువల్ అనుభవం ద్వారా పుంప్కిన్ అమ్మకాల నెల మరియు ధర మధ్య డేటా అధిక సహసంబంధం లేదా తక్కువ ఉందా? మీరు `Month`మే కాకుండా *సంవత్సరం లో రోజుల సంఖ్య* (DayOfYear) ని అంటే మరింత సూక్ష్మాతీస్థితిని ఉపయోగిస్తే ఇది మారుతుందా?
కింది కోడ్లో, మేము డేటాను శుభ్రపరిచినట్లు భావిస్తాము, మరియు `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 ప్రారంభవారికి - సహసంబంధం కోసం వెతుకుతాం: లీనియర్ రిగ్రెషన్ యొక్క కీలకం")
> 🎥 సహసంబంధ సందర్శన సంక్షిప్త వీడియో కోసం పై చిత్రాన్ని క్లిక్ చేయండి.
మునుపటి పాఠం నుండి మీరు చూసినట్టు, వేర్వేరు నెలల సగటు ధర ఇలా ఉంటుంది:
ఇది కొంత సహసంబంధం ఉండే సూచన చేస్తుంది, మరియు మేము `Month` మరియు `Price` మధ్య, లేదా `DayOfYear` మరియు `Price` మధ్య సంబంధాన్ని అంచనా వేసే లీనియర్ రిగ్రెషన్ మోడల్ శిక్షణ ఇస్తే ఎలా ఉంటుందో చూడవచ్చు. క్రింద స్కాటర్ ప్లాట్ ఆ తర్వాత సంబంధాన్ని చూపిస్తుంది:
`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)
```
మన పరిశోధన ద్వారా కనిపించిందంటే రకం విక్రయ తేదీ కంటే ధర మీద ఎక్కువ ప్రభావం చూపుతుంది. దీన్ని బార్ గ్రాఫ్ ద్వారా చూడగలం:
```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')
```
ఇప్పటి `Price` మరియు `DayOfYear` మధ్య సహసంబంధం `corr` ఫంక్షన్ ద్వారా లెక్కించితే సుమారు `-0.27` వస్తుంది, అంటే అంచనా మోడల్ శిక్షణ సరైనది.
> లీనియర్ రిగ్రెషన్ మోడల్ శిక్షణ మొదలుపెట్టేముందు, డేటా శుభ్రంగా ఉందని నిర్ధారించుకోవాలి. లీనియర్ రిగ్రెషన్ లో లెక్కలు లేకపోవడం వల్ల సరిగ్గా పని చేయదు, అందుకే ఖాళీ செல్లను తీసివేయడం బాగా ఉంటుంది:
```python
pie_pumpkins.dropna(inplace=True)
pie_pumpkins.info()
```
ఇంకో పద్ధతి ఖాళీ విలువలను సంబంధిత కాలమ్ యొక్క సగటు విలువలతో భర్తీ చేయడం.
## సింపుల్ లీనియర్ రిగ్రెషన్
[](https://youtu.be/e4c_UP2fSjg "ML ప్రారంభవారికి - 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` చేయాల్సి వచ్చింది. లీనియర్ రిగ్రెషన్ 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)
```
`fit` చేసిన తరువాత `LinearRegression` ఆబ్జెక్ట్ రిగ్రెషన్ యొక్క అన్ని సహగుణాలను కలిగి ఉంటుంది, వాటిని `.coef_` ప్రాపర్టీ ఉపయోగించి యాక్సెస్ చేయవచ్చు. మన కేసులో, ఒకే ఒక్క సహగుణం ఉంది, అది సుమారు `-0.017` ఉండాలి. దీని అర్థం ఏమిటంటే, ధరలు కాలక్రమేణా కొంత క్షీణిస్తున్నట్లు కనిపిస్తోంది, రోజుకు సుమారు 2 సెంట్లు తగ్గుతుంటాయి. రిగ్రెషన్ యొక్క 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}%)')
```
మన తప్పిదం సుమారు 2 పాయింట్ల చుట్టూ ఉంది, ఇది ~17%. చాలా మంచి కాదు. మోడల్ నాణ్యతకు మరొక సూచిక **coefficient of determination** అని పిలవబడుతుంది, దాన్ని ఇలా పొందవచ్చు:
```python
score = lin_reg.score(X_train,y_train)
print('Model determination: ', score)
```
ఈ విలువ 0 అయితే, మోడల్ ఇన్{}పుట్ డేటాను పరిగణనలోకి తీసుకోలేదు, మరియు *చాలా చెత్త లీనియర్ అంచనావాది* (worst linear predictor) లాగా పని చేస్తుంది, ఇది ఫలితపు సరాసరి విలువ మాత్రమే. విలువ 1 అంటే మనం అన్ని ఆశించిన అవుట్పుట్లను సరిగ్గా అంచనా వేయగలమని అర్థం. మన కేసులో, coefficient సుమారు 0.06, ఇది చాలా తక్కువ.
మనం టెస్ట్ డేటాను రిగ్రెషన్ రేఖతో కలిసి కూడా చిత్రీకరించవచ్చు, మన కేసులో రిగ్రెషన్ ఎలా పని చేస్తుందో మెరుగ్గా చూడటానికి:
```python
plt.scatter(X_test,y_test)
plt.plot(X_test,pred)
```
## పోలినోమియల్ రిగ్రెషన్
లెనియర్ రిగ్రెషన్ యొక్క మరో రకం పోలినోమియల్ రిగ్రెషన్. కొన్నిసార్లు వేరియబుల్స్ మధ్య లీనియర్ సంబంధం ఉంటుంది — వాల్యూమ్ లో మెగా తూర్పులో గుమ్మడికాయ పెరిగితే ధర కూడా పెరుగుతుంది — కానీ ఈ సంబంధాలు సాధారణంగా సమతలమైన లేదా సరాసరి లైన్ గా చూపించలేము.
✅ ఇక్కడ [ఇంకా కొన్ని ఉదాహరణలు](https://online.stat.psu.edu/stat501/lesson/9/9.8) ఉన్నాయి, ఇవి పోలినోమియల్ రిగ్రెషన్ అవసరం కావచ్చు
Date మరియు Price మధ్య సంబంధం మరోసారి చూడండి. ఈ స్కాటర్ప్లాట్ సరాసరి లైన్తో తప్పనిసరిగా విశ్లేషించవలసినది అనిపిస్తుందా? ధరలు మార్పు చెందలేవా? ఈ సందర్భంలో, మీరు పోలినొమియల్ రిగ్రెషన్ ప్రయత్నించవచ్చు.
✅ పోలినొమియల్స్ అనేవి ఒకదాని కంటే ఎక్కువ వేరియబుల్స్ మరియు సహగుణాల కలయికలు ఉండే గణిత అభివ్యక్తులు
పోలినోమియల్ రిగ్రెషన్ వక్రీభవించిన రేఖను సృష్టిస్తుంది, అంతర్జాతీయ డేటాను బాగా సరిపోల్చేందుకు. మన కేసులో, మనం `DayOfYear` ఛైక్రమంలో చదరపు వేరియబుల్ చేర్చితే, మనం మన డేటాను పారాబాలిక్ వక్రీభవంలో సరిపోల్చగలము, ఇది ఏడాది లో ఒక నిర్దిష్ట స్థానంలో కనిష్టం ఉంటుంది.
స్కైకిట్-లెర్న్ లో డేటా ప్రాసెసింగ్ యొక్క వివిధ దశలను కలిపే వినియోగకరమైన [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`2 మాత్రమే అవుతుంది, కానీ ఇన్{}పుట్ వేరియబుల్స్ X మరియు Y ఉంటే, ఇది X2, XY మరియు Y2 చేర్చుతుంది. మనం ఎక్కువ డిగ్రీ పోలినోమియల్స్ కూడా ఉపయోగించవచ్చు.
Pipeline లను ఆరంభ లీనియర్ రిగ్రెషన్ ఆబ్జెక్ట్ వలెనే ఉపయోగించవచ్చు, అంటే pipeline `fit` చేసి, తర్వాత `predict` ఉపయోగించి అంచనా ఫలితాలను తీసుకోవచ్చు. ఇది టెస్ట్ డేటా, మరియు సన్నిహిత వక్రీభవాన్ని చూపే గ్రాఫ్:
పోలినోమియల్ రిగ్రెషన్ ఉపయోగించి, మనం కొంచెం తక్కువ MSE మరియు ఎక్కువ determination పొందవచ్చు, కానీ చాలా పెద్దగా కాదు. ఇతర ఫీచర్లను పరిగణనలోకి తీసుకోవాలి!
> మీరు గమనించవచ్చు, కనిష్ట పండ్లు ధర్నం హాలోవీన్ దినచర్యలో ఉన్నట్లు కనిపిస్తోంది. దీన్ని ఎలా వివరించగలరు?
🎃 శుభాకాంక్షలు, మీరు ఇప్పుడు పి గుమ్మడికాయ ధర అంచనా వేయగలిగే మోడల్ సృష్టించారని. మిగిలిన అన్ని గుమ్మడికాయ రకాలకు ఇదే ప్రక్రియను పునరావృతం చేయవచ్చు, కానీ అది జీజ్ఞాస కలిగిన పని. మనం ఇప్పుడు మన మోడల్ లో గుమ్మడికాయ జాతిని పరిగణనలోకి ఎలా తీసుకోవచ్చో నేర్చుకుందాం!
## వర్గీకరణ ఫీచర్లు
స ideaal లో, మనం ఒకే మోడల్ ఉపయోగించి వేర్వేరు గుమ్మడికాయ జాతుల ధరలను అంచనా వేయగలగాలి. కానీ, `Variety` కాలమ్ నిర్వహణలో `Month` లా కాదు, ఎందుకంటే దీని లోనివి సంఖ్యాత్మక (numeric) విలువలు కావు. ఇలాంటి కాలమ్స్ ను **categorical** అని పిలుస్తారు.
[](https://youtu.be/DYGliioIAE0 "ML for beginners - Categorical Feature Predictions with Linear Regression")
> 🎥 కేటగిరీ ఫీచర్లు ఎలా ఉపయోగించాలో ఒక చిన్న వీడియో సమీక్ష కోసం పై చిత్రాన్ని క్లిక్ చేయండి.
ఇక్కడ మీరు గమనించవచ్చు సరాసరి ధర వేరియటీలపై ఆధారపడి ఉంటుందని:
వేరియిటీని పరిగణించాలంటే, ముందుగా దాన్ని సంఖ్యాత్మక రూపంలోకి మార్చాలి, లేదా **ఎంకోడ్** చేయాలి. మనం దీన్ని చేయగల వివిధ మార్గాలు ఉన్నాయి:
* సులభమైన **న్యూమరిక్ ఎంకోడింగ్** వేరియటీల పట్టిక తయారు చేసి, అప్పుడు వేరియటీ పేరును ఆ పట్టికలో ఉన్న సూచికతో మార్చుతుంది. ఇది లీనియర్ రిగ్రెషన్ కొరకు సరైన విధానం కాదు, ఎందుకంటే లీనియర్ రిగ్రెషన్ సూచిక యొక్క అసలు సంఖ్యాపరమైన విలువను తీసుకుని కొన్ని సహగుణాలతో బహుగుణింపజేస్తుంది. మన కేసులో, సూచిక సంఖ్య మరియు ధర మధ్య సంబంధం స్పష్టంగా లీనియర్ కానిది, చిత్తడుగా సూచికలు యథావిధిగా అమర్చినా కూడా.
* **వన్-హాట్ ఎంకోడింగ్** `Variety` కాలమ్ ను 4 వేరువేరు కాలమ్స్ గా మార్చుతుంది, ఒక్కో వేరియటీ కి ఒకటి. ప్రతి కాలమ్ ఆ వరుస వేరియటీకి సరిపోతే `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% వరకు పెరుగుతుంది. ఇంకా ఖచ్చితమైన అంచనాలు పొందటానికి, మేము మరింత 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 2.84 (10%) మరియు determination 0.94 అవుతుంది!
## అన్నిటిని కలిపితే
మంచి మోడల్ ను సృష్టించడానికి, మనం కాంబిన్డ్ (వన్-హాట్ ఎంకోడ్ చేసిన categorical + సంఖ్యాపరమైన) డేటాను పై ఉదాహరణ నుండి పోలినోమియల్ రిగ్రెషన్ తో కలిపి వాడవచ్చు. మీ సౌలభ్యం కోసం పూర్తి కోడ్ ఇక్కడ ఉంది:
```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 సుమారు 97% మరియు 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 |
🏆 బాగుంది! మీరు ఒక పాఠంలో నాలుగు రిగ్రెషన్ మోడల్స్ సృష్టించి, మోడల్ నాణ్యతను 97% కావరకు మెరుగుపర్చారు. రిగ్రెషన్ యొక్క తుది భాగంలో, మీరు కేటగిరీలను నిర్ధారించేందుకు లాజిస్టిక్ రిగ్రెషన్ గురించి నేర్చుకుంటారు.
---
## 🚀సవాలు
ఈ నోట్బుక్ లో వేర్వేరు వేరియబుల్స్ ను పరీక్షించి చూడండి, వాటి సహ సంబంధం మోడల్ ఖచ్చితత్వానికి ఎలా సంబంధించినదో చూడండి.
## [పోస్ట్-లెక్షర్ క్విజ్](https://ff-quizzes.netlify.app/en/ml/)
## సమీక్ష & స్వీయ అధ్యయనం
ఈ పాఠంలో మనం లినియర్ రిగ్రెషన్ గురించి నేర్చుకున్నాం. మరిన్ని ముఖ్యమైన రిగ్రెషన్ రకాలు ఉన్నాయి. స్టెప్వైజ్, రిడ్జి, లాస్సో మరియు ఎలాస్టిక్నెట్ సాంకేతికతలను చదవండి. మరింత తెలుసుకోడానికి మంచి కోర్సు [స్టాన్ఫోర్డ్ స్టాటిస్టికల్ లెర్నింగ్ కోర్సు](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning)
## అసైన్మెంట్
[మోడల్ సృష్టించండి](assignment.md)
---
**జాప్యం**:
ఈ పత్రం AI అనువాద సేవ [Co-op Translator](https://github.com/Azure/co-op-translator) ఉపయోగించి అనువదించబడింది. మేము ఖచ్చితత్వానికి ప్రయత్నిస్తున్నప్పటికీ, ఆటోమేటెడ్ అనువాదాలలో లోపాలు లేదా తప్పిదాలు ఉండొచ్చు. మੂల పత్రం దాని స్వదేశి భాషలో అధికారిక మూలం గా పరిగణించాలి. ముఖ్య సమాచారం కోసం వృత్తిపరమైన మానవ అనువాదం సూచించబడుతుంది. ఈ అనువాదం ఉపయోగించే కారణంగా ఏర్పడే ఏదైనా తప్పుదోవ లేదా దుర్వినియోగం కోసం మేము బాధ్యత వహించము.