|
|
4 months ago | |
|---|---|---|
| .. | ||
| solution | 7 months ago | |
| README.md | 4 months ago | |
| assignment.md | 7 months ago | |
| notebook.ipynb | 12 months ago | |
README.md
Scikit-learn वापरून रिग्रेशन मॉडेल तयार करा: रिग्रेशन चार पद्धती
नवशिक्यांसाठी नोट
लिनीअर रिग्रेशनचा वापर आपण जेव्हा संख्यात्मक मूल्य (उदाहरणार्थ, घराची किंमत, तापमान, किंवा विक्री) भाकीत करू इच्छितो तेव्हा केला जातो. हे इनपुट वैशिष्ट्ये आणि आउटपुट यामधील संबंध सर्वोत्तम दर्शविणारी सरळ रेषा शोधून काम करते.
या धड्यात, आम्ही अधिक प्रगत रिग्रेशन तंत्रे शिकण्यापूर्वी संकल्पना समजून घेण्यावर लक्ष केंद्रित करू.

इन्फोग्राफिक दासानी मदीपाली यांच्याकडून
पूर्व-व्याख्यान क्विझ
हा धडा R मध्येही उपलब्ध आहे!
परिचय
आत्तापर्यंत आपण रिग्रेशन म्हणजे काय हे कदाचित पाहिले आहे, ज्यासाठी आपण भोपळा किंमत डेटासेटमधून संकलित नमुना डेटा वापरला आहे जो संपूर्ण धडक्यादरम्यान वापरला जाईल. आपण त्याचे Matplotlib वापरून दृश्यांकन देखील केलेले आहे.
आता आपण मशीन लर्निंगसाठी रिग्रेशनमध्ये अधिक खोलवर जाण्यास तयार आहात. दृश्यांकन केल्याने डेटा समजण्यास मदत होते, पण मशीन लर्निंगची खरी ताकद मॉडेल्स प्रशिक्षण मध्ये आहे. मॉडेल्सला ऐतिहासिक डेटावर प्रशिक्षण दिले जाते ज्यामुळे ते डेटा अवलंबित्वे स्वयंचलितपणे पकडू शकतात, आणि त्यांनी अद्याप पाहिलेला नसलेला नवीन डेटा साठी परिणामांची भाकीत करण्याची परवानगी देतात.
या धड्यात, आपण दोन प्रकारच्या रिग्रेशनबद्दल अधिक शिकणार आहोत: मूलभूत लिनीअर रिग्रेशन आणि बहुपदीय रिग्रेशन, तसेच या तंत्रांमागील काही गणित समजून घेणार आहोत. या मॉडेल्समुळे आपण भिन्न इनपुट डेटानुसार भोपळ्याच्या किंमती भाकीत करू शकू.
🎥 वरील प्रतिमेवर क्लिक करा लिनीअर रिग्रेशनचा संक्षिप्त व्हिडिओ आढावा पाहण्यासाठी.
संपूर्ण अभ्यासक्रमामध्ये, आम्ही गणिताचे कमी ज्ञान धरतो, आणि इतर क्षेत्रांमधून येणाऱ्या विद्यार्थ्यांसाठी ते सुलभ बनवण्याचा प्रयत्न करतो, त्यामुळे लक्ष ठेवा नोट्स, 🧮 कॉलआउट्स, आकृती आणि इतर शिकण्याच्या साधनांसाठी जी समज वाढविण्यात मदत करतात.
पूर्वअट
आपण आता भोपळा डेटाच्या संरचनेशी परिचित असाल ज्याचा आपण अभ्यास करतोय. हा डेटा या धड्याच्या notebook.ipynb फाईलमध्ये प्रीलोड आणि प्री-क्लीन केलेला सापडेल. फाईलमध्ये भोपळ्याची किंमत प्रत्येक बुशेलसाठी नवीन डेटा फ्रेममध्ये दाखवली आहे. हे notebook Visual Studio Code मधील कर्नलमध्ये चालवू शकता याची खात्री करा.
तयारी
स्मरणार्थ, आपण हा डेटा लोड करता जेणेकरून त्याबाबत प्रश्न विचारता येतील.
- भोपळा खरेदीसाठी सर्वोत्तम वेळ कधी आहे?
- लहान भोपळ्यांच्या केसची किंमत काय अपेक्षित करू शकतो?
- मी त्यांना अर्धा बुशेल टोपल्या मध्ये खरेदी करावे का की 1 1/9 बुशेल बॉक्सने? चला या डेटामध्ये अधिक खोलवर पाहू.
यापूर्वीच्या धड्यात आपण Pandas डेटा फ्रेम तयार केला होता आणि मूळ डेटासेटचा भाग वापरून किंमती बुशेलनुसार प्रमाणित केला. मात्र, त्यामुळे केवळ सुमारे ४०० डेटापॉइंट्स मिळाले आणि तेही फक्त शरद ऋतूतील महिनेकरिता.
या धड्याच्या संलग्न नोटबुकमध्ये प्रीलोड केलेला डेटा पहा. डेटा प्रीलोड केला आहे आणि प्रारंभिक स्कॅटरप्लॉट तयार केला आहे जे महिना डेटाचा दाखला देतो. कदाचित आपण डेटा अजून स्वच्छ करुन त्याची निसर्ग अधिक जाणून घेऊ शकू.
एक लिनीअर रिग्रेशन रेषा
आपण धडा 1 मध्ये शिकलो तसे, लिनीअर रिग्रेशनचा उद्दिष्ट रेषा अशी काढणे आहे जी:
- चल संबंध दाखवते. चलांच्या संबंध दर्शविणे
- भाकीत करणे. नवीन डेटापॉइंट एखाद्या विशिष्ट ठिकाणी येईल का ते अचूक भाकीत करणे.
हे सहसा लीस्ट-स्क्वेअर्स रिग्रेशन वापरून केले जाते. "लीस्ट-स्क्वेअर्स" शब्द म्हणजे आपल्या मॉडेलमधील एकूण त्रुटी कमी करते असे तंत्र. प्रत्येक डेटा पॉइंटसाठी आपण खऱ्या पॉइंट आणि रिग्रेशन लाइनमधील उभी अंतर (रेजिड्युअल) मोजतो.
आपण या अंतराला दोन मुख्य कारणांसाठी वर्गाकार करतो:
-
परिमाणाकडे अधिक महत्त्व: -5 वजा 5 या त्रुटींना समान समजण्यासाठी वर्गाकार सर्व मूल्ये सकारात्मक करतो.
-
आउटलायरला दंड देणे: वर्गाकार मोठ्या त्रुटींना अधिक वजन देतो, त्यामुळे रेषा दूर असलेल्या पॉइंट्सजवळ राहायला भाग पाडतो.
आम्ही नंतर या सर्व वर्गाकार मूल्यांची बेरीज करतो. आमचा उद्देश असा आहे की ही अंतिम बेरीज कमीत कमी (सर्वात लहान शक्य मूल्य) होईल—म्हणून त्याला "लीस्ट-स्क्वेअर्स" म्हणतात.
🧮 मला गणित दाखवा
ही रेषा, ज्याला सर्वोत्तम बसणारी रेषा म्हणतात, एका समीकरणाने व्यक्त केली जाऊ शकते:
Y = a + bX
Xहा 'स्पष्टीकरणात्मक चल' (explanatory variable) आहे.Yहा 'आश्रित चल' (dependent variable). रेषेचा उतारbआहे आणिaहा y-अक्षावर छेदनबिंदू आहे, जोX = 0असतानाYचे मूल्य दाखवतो.सर्वप्रथम, उतार
bमोजा. इन्फोग्राफिक जेन लूपर यांनी तयार केला आहे.दुसऱ्या शब्दांत, आणि आपल्या भोपळा डेटाच्या मूळ प्रश्नाकडे पाहता: "महिन्यानुसार भोपळा प्रति बुशेल किंमत भाकीत करा,"
Xही किंमत आणिYही विक्रीचा महिना असेल.
Yची किंमत काढा. जर आपण सुमारे $4 देत असाल, तर तो एप्रिल असायला हवा! इन्फोग्राफिक जेन लूपरहे गणित जो रेषा काढते तो रेषेचा उतार दाखवतो, जो छेदनबिंदूवरही अवलंबून असतो, म्हणजे
X=0असतानाYकुठे असते.आपण Math is Fun या संकेतस्थळावर या मूल्यांच्या गणनेची पद्धत पाहू शकता. तसेच Least-squares calculator येथे जाऊन संख्यांचे मूल्य रेषेवर कसे परिणाम करतात ते पाहू शकता.
सहसंबंध
आणखी एक समजण्याचे टर्म म्हणजे दिलेल्या X आणि Y चलांमधील सहसंबंध गुणांक. स्कॅटरप्लॉट वापरून आपण हा गुणांक पटकन देखील पाहू शकता. जर पॉइंट्स एक नीटसर रेषेत विखुरलेले असतील तर त्यात उच्च सहसंबंध आहे, परंतु सर्वत्र विखुरलेल्या पॉइंट्ससह रेषेत कमी सहसंबंध आहे.
एक चांगला लिनीअर रिग्रेशन मॉडेल तो असेल ज्यात लीस्ट-स्क्वेअर्स रिग्रेशन पद्धतीने रेषेचा सहसंबंध गुणांक जास्त (0 पेक्षा 1 च्या जवळ) असेल.
✅ या धड्याला संलग्न notebook चालवा आणि महिना ते किंमत टेबल पाहा. भोपळा विक्रीसाठी महिना ते किंमत डेटा आपल्या दृश्यात्मक मुल्यांकनानुसार उच्च की कमी सहसंबंध दाखवतो? जर आपण महिना ऐवजी अधिक सूक्ष्म मोजमाप वापरले, उदा. वर्षातील दिवस (वर्षाच्या सुरुवातीपासून वादलेले दिवस) तर ते बदलते का?
खालील कोडमध्ये, आपण गृहित धरू की आम्ही डेटा स्वच्छ केला आहे आणि new_pumpkins नावाचा डेटा फ्रेम तयार केला आहे, जो खालीलप्रमाणे दिसू शकतो:
| ID | महिना | वर्षातील दिवस | विविधता | शहर | पाकेट | कमी किंमत | जास्त किंमत | किंमत |
|---|---|---|---|---|---|---|---|---|
| 70 | 9 | 267 | पाई प्रकार | बाल्टिमोर | 1 1/9 बुशेल कार्टन्स | 15.0 | 15.0 | 13.636364 |
| 71 | 9 | 267 | पाई प्रकार | बाल्टिमोर | 1 1/9 बुशेल कार्टन्स | 18.0 | 18.0 | 16.363636 |
| 72 | 10 | 274 | पाई प्रकार | बाल्टिमोर | 1 1/9 बुशेल कार्टन्स | 18.0 | 18.0 | 16.363636 |
| 73 | 10 | 274 | पाई प्रकार | बाल्टिमोर | 1 1/9 बुशेल कार्टन्स | 17.0 | 17.0 | 15.454545 |
| 74 | 10 | 281 | पाई प्रकार | बाल्टिमोर | 1 1/9 बुशेल कार्टन्स | 15.0 | 15.0 | 13.636364 |
डेटा स्वच्छ करण्यासाठीचा कोड
notebook.ipynbमध्ये उपलब्ध आहे. आपण मागील धड्याप्रमाणेच स्वच्छता केली आहे, आणिDayOfYearस्तंभ खालील व्यक्तीकरण वापरून काढला आहे:
day_of_year = pd.to_datetime(pumpkins['Date']).apply(lambda dt: (dt-datetime(dt.year,1,1)).days)
आता आपण लिनीअर रिग्रेशन मागील गणित समजत असल्याने, चला एक रिग्रेशन मॉडेल तयार करू जेणेकरून आपण भोपळ्यांच्या पैकेजेसपैकी कोणत्या पैकची किंमत सर्वोत्तम असेल हे भाकीत करू शकू. एखाद्या सणासाठी भोपळा खरेदी करणाऱ्याला त्यांच्या खरेदीत अनुकूल करण्यासाठी ही माहिती आवश्यक असू शकते.
सहसंबंध शोधत आहोत
🎥 वरील प्रतिमेवर क्लिक करा सहसंबंध या विषयाचा संक्षिप्त व्हिडिओ आढावा पाहण्यासाठी.
मागील धड्यात आपण कदाचित पाहिले असाल की वेगवेगळ्या महिन्यांची सरासरी किंमत अशी दिसते:
हे सूचित करते की काही सहसंबंध असावा, आणि आपण Month आणि Price किंवा DayOfYear आणि Price यांच्या मधील संबंध भाकीत करण्यासाठी लिनीअर रिग्रेशन मॉडेल प्रशिक्षण देऊ शकतो. खालील स्कॅटरप्लॉट दुसऱ्या संबंधाचा दाखला देतो:
चला corr फंक्शन वापरून सहसंबंध पाहू:
print(new_pumpkins['Month'].corr(new_pumpkins['Price']))
print(new_pumpkins['DayOfYear'].corr(new_pumpkins['Price']))
अशी दिसते की सहसंबंध फारसा मोठा नाही, Month साठी -0.15 आणि DayOfYear साठी -0.17, पण कदाचित दुसरा महत्त्वाचा संबंध असू शकतो. वेगवेगळ्या भोपळा विविधतांच्या किंमती वेगवेगळ्या संचांमध्ये दिसत आहेत. ही कल्पना पुष्टी करण्यासाठी, प्रत्येक भोपळा वर्ग वेगळ्या रंगात दाखवू या. scatter फंक्शनला ax पॅरामीटर देऊन आपण सर्व पॉइंट्स एकाच ग्राफवर प्लॉट करू शकतो:
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)
आपल्या तपासणीने सुचवले आहे की विविधतेचा एकूण किंमतीवर खूप परिणाम होतो, जास्त की विक्री तारखा. हे आम्ही बार ग्राफवर पाहू शकतो:
new_pumpkins.groupby('Variety')['Price'].mean().plot(kind='bar')
सध्या आपण फक्त एका भोपळा विविधतेवर लक्ष ठेवू, ही म्हणजे 'पाई प्रकार', आणि पाहू की विक्रीच्या तारखेचा किंमतीवर कसा परिणाम होतो:
pie_pumpkins = new_pumpkins[new_pumpkins['Variety']=='PIE TYPE']
pie_pumpkins.plot.scatter('DayOfYear','Price')
आता Price आणि DayOfYear मधील सहसंबंध काढल्यास corr फंक्शन वापरून साधारण -0.27 येईल - जे दर्शवते की भाकीत करणारे मॉडेल तयार करणे अर्थपूर्ण आहे.
लिनीअर रिग्रेशन मॉडेल प्रशिक्षण देण्यापूर्वी, डेटा स्वच्छ असल्याची खात्री करणे महत्त्वाचे आहे. लिनीअर रिग्रेशन रिकाम्या मूल्यांसह चांगले काम करत नाही, म्हणून रिकाम्या सेल्स काढणे योग्य ठरते:
pie_pumpkins.dropna(inplace=True)
pie_pumpkins.info()
अधिक एक पद्धत म्हणजे रिकाम्या जागा त्या संबंधित स्तंभाच्या सरासरीने भरणे.
साधी लिनीअर रिग्रेशन
🎥 वरील प्रतिमेवर क्लिक करा लिनीअर आणि बहुपदीय रिग्रेशनचा संक्षिप्त व्हिडिओ आढावा पाहण्यासाठी.
आम्ही लिनीअर रिग्रेशन मॉडेल प्रशिक्षणासाठी Scikit-learn लायब्ररी वापरणार आहोत.
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
आम्ही इनपुट मूल्ये (वैशिष्ट्ये) आणि अपेक्षित आउटपुट (लेबल) वेगळ्या numpy arrays मध्ये विभाजित करून सुरुवात करतो:
X = pie_pumpkins['DayOfYear'].to_numpy().reshape(-1,1)
y = pie_pumpkins['Price']
लक्षात घ्या की Linear Regression पॅकेज योग्यरित्या समजावून घेण्यासाठी आम्हाला इनपुट डेटावर
reshapeकरावी लागली. लिनीअर रिग्रेशन 2D-array इनपुट म्हणून अपेक्षित असतो, ज्यामध्ये प्रत्येक ओळ इनपुट वैशिष्ट्यांच्या व्हेक्टरसाठी असते. आमच्या बाबतीत, फक्त एक इनपुट असल्यामुळे, N×1 आकाराचा arrary हवा आहे, जिथे N म्हणजे डेटासेटचा आकार.
आणि मग, आपण डेटा प्रशिक्षण आणि तपासणी सेटमध्ये विभागतो, जेणेकरून प्रशिक्षणानंतर आपल्याला मॉडेल तपासता येईल:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
शेवटी, वास्तविक लिनीअर रिग्रेशन मॉडेलचे प्रशिक्षण फक्त दोन ओळींमध्ये होते. आपण LinearRegression ऑब्जेक्ट परिभाषित करतो, आणि fit पद्धत वापरून त्यास आपल्या डेटावर लागू करतो:
lin_reg = LinearRegression()
lin_reg.fit(X_train,y_train)
fit केल्यानंतरचा LinearRegression ऑब्जेक्टमध्ये रिग्रेशनचे सर्व गुणांक असतात, जे .coef_ प्रॉपर्टी वापरून पाहता येतात. आपल्या प्रकरणात, फक्त एक गुणांक आहे, जो सुमारे -0.017 असावा. याचा अर्थ किंमती वेळेनुसार थोड्या प्रमाणात कमी होतात, पण फार नाही, दररोज सुमारे 2 सेंट्स. आपण रिग्रेशनचा Y-ऍक्सिसशी छेद बिंदू lin_reg.intercept_ वापरून पाहू शकतो - आमच्या प्रकरणात तो सुमारे 21 असेल, जे वर्षाच्या सुरुवातीच्या किंमतींना दर्शवते.
आपल्या मॉडेलची अचूकता पाहण्यासाठी, आपण टेस्ट डेटासेटवर किंमतींचा अंदाज लावू शकतो, आणि नंतर आपल्या अंदाजित किंमती अपेक्षित किंमतींशी किती जवळ आहेत हे मोजू शकतो. हे root mean square error (RMSE) मेट्रिक वापरून केले जाऊ शकते, जे अपेक्षित आणि अंदाजित किंमतींतील सर्व वर्ग फरकांचा मूळ सरासरी आहे.
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}%)')
आपला त्रुटी सुमारे 2 गुण आहे, जो ~17% आहे. फारच चांगले नाही. मॉडेल गुणवत्ता दर्शविणारा आणखी एक निर्देशांक म्हणजे निर्धारण गुणांक (coefficient of determination), जो खालीलप्रमाणे मिळवता येतो:
score = lin_reg.score(X_train,y_train)
print('Model determination: ', score)
जर हा मूल्य 0 असेल, तर याचा अर्थ मॉडेल इनपुट डेटा लक्षात घेत नाही आणि तो सर्वात वाईट रेषीय भाकीतकार म्हणून काम करतो, जो फक्त निकालाचा सरासरी मूल्य आहे. 1 ची किंमत म्हणजे आपण सर्व अपेक्षित आउटपुट परिपूर्णपणे भाकीत करू शकतो. आमच्या प्रकरणात, हा गुणांक साधारणपणे 0.06 आहे, जो खूप कमी आहे.
आपण टेस्ट डेटासह रिग्रेशन लाइनचा ग्राफ सुद्धा पाहू शकतो, ज्यामुळे रिग्रेशन कसे काम करते हे चांगल्या प्रकारे समजेल:
plt.scatter(X_test,y_test)
plt.plot(X_test,pred)
बहुपदीय रिग्रेशन
रेषीय फलनाचा आणखी एक प्रकार म्हणजे बहुपदीय रिग्रेशन (Polynomial Regression). कधी कधी चलांच्या दरम्यान रेषीय संबंध असतो - जसे की भोपळ्याचा आयतन जितका मोठा, तितकी किंमत जास्त - पण कधी या संबंधांना प्लेन किंवा सरळ रेषेत प्रदर्शित करता येत नाही.
✅ येथे अजून काही उदाहरणे आहेत, ज्यात बहुपदीय रिग्रेशन वापरता येऊ शकतो
“तारीख” आणि “किंमत” यांच्यामधील संबंध पुन्हा पाहा. हा scatterplot असा दिसतो का की तो नेहमीच सरळ रेषेने विश्लेषित केला पाहिजे? किंमती बदलू शकतात का? या परिस्थितीत, आपण बहुपदीय रिग्रेशन वापरू शकतो.
✅ बहुपदी हे गणितीय अभिव्यक्ती आहेत ज्यात एक किंवा अधिक चल आणि गुणांक असू शकतात
बहुपदीय रिग्रेशन गैररेषीय डेटाला चांगल्या प्रकारे बसवण्यासाठी वक्र रेषा तयार करतो. आपल्या प्रकरणात, जर आपण इनपुट डेटामध्ये ‘DayOfYear’ या चलाचा वर्ग महत्त्वाचा समाविष्ट केला, तर आपल्याला आपला डेटा पॅराबोलिक वक्रासह बसवता येईल, ज्याचा किमान बिंदू वर्षाच्या एका विशिष्ट ठिकाणी असेल.
Scikit-learn मध्ये डेटा प्रक्रिया एकत्र करण्यासाठी उपयुक्त pipeline API उपलब्ध आहे. pipeline म्हणजे estimators चा साखळ. आपल्या प्रकरणात, आपण एक पाइपलाइन तयार करू ज्यात आधी बहुपदीय गुणधर्म जोडले जातील आणि नंतर रिग्रेशन प्रशिक्षित केला जाईल:
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) वापरल्याचा अर्थ आपल्याला इनपुट डेटातील सर्व दुसऱ्या दर्जाचा बहुपदीय समाविष्ट करायचा आहे. आपल्या बाबतीत म्हणजे फक्त DayOfYear2 असेल, पण जर दोन इनपुट चल X आणि Y असतील, तर हे X2, XY आणि Y2 जोडेल. आपण हवे असल्यास उच्च दर्जाचे बहुपदी देखील वापरू शकतो.
पाइपलाइनचा वापर LinearRegression ऑब्जेक्टसारखा केला जाऊ शकतो, म्हणजे आपण पाइपलाइनला fit करू शकतो आणि नंतर predict वापरून अंदाज मिळवू शकतो. खाली ग्राफिक दाखविते की टेस्ट डेटा आणि सुमारे जवळचे वक्र कसे दिसते:
बहुपदीय रिग्रेशन वापरून आपल्याला थोडे कमी MSE आणि जास्त निर्धारण मिळू शकते, पण महत्त्वपूर्ण फरक नाही. आपल्याला अन्य गुणधर्म देखील लक्षात घ्यावे लागतील!
आपण पाहू शकता की, भोपळ्यांच्या किमती Halloween च्या सुमारास जवळजवळ किमान असतात. आपण हे कसे समजावता?
🎃 अभिनंदन, आपण असा मॉडेल बनवला आहे ज्याचा वापर पाय भोपळ्यांच्या किंमती भाकीत करण्यासाठी होऊ शकतो. आपण कदाचित सारखा प्रक्रिया सर्व भोपळ्यांच्या प्रकारांसाठी करू शकता, पण ते वेळखाऊ होईल. आता आपण आपल्या मॉडेलमध्ये भोपळ्याचा प्रकार कसा समाविष्ट करायचा ते शिकू!
वर्गवारी गुणधर्म (Categorical Features)
आदर्श जगात आपल्याला वेगवेगळ्या भोपळ्यांच्या प्रकारांसाठी किंमती भाकीत करायच्या असतात, तोही समान मॉडेल वापरून. पण Variety कॉलम इतर कॉलम्ससारखा नाही जसे Month, कारण त्यात अंकात्मक नसलेले मूल्य आहे. अशा कॉलम्सना categorical म्हणतात.
🎥 वरच्या चित्रावर क्लिक करा, वर्गवारी गुणधर्म वापरून थोडक्यात व्हिडिओ पाहण्यासाठी.
येथे आपण पाहू शकतो की सरासरी किंमत प्रकारावर कशी अवलंबून आहे:
प्रकार विचारात घेण्यासाठी, आपल्याला प्रथम त्याला अंकात्मक स्वरूपात रूपांतरित करणे किंवा कोडिंग करणे आवश्यक आहे. असे करण्याचे काही मार्ग आहेत:
- सोप्या न्यूमेरिक एनकोडिंग मध्ये वेगवेगळ्या प्रकारांसाठी एक तक्ता तयार केला जातो, आणि नंतर त्या तक्त्यातील इंडेक्सनी नाम बदला जातो. पण रेषीय रिग्रेशनसाठी हा चांगला विचार नाही, कारण रेषीय रिग्रेशन इंडेक्समधील अंकात्मक मूल्य घेतो आणि त्याला गुणांकाने गुणून निकालात जोडतो. आमच्या प्रकरणात इंडेक्स नंबर आणि किंमतीत गैररेषीय संबंध स्पष्ट आहे, अगदी आपण इंडेक्स विशिष्ट क्रमाने ठेवला तरीही.
- वन-हॉट एनकोडिंग मध्ये
Varietyकॉलमला 4 वेगळ्या कॉलम्समध्ये बदलले जाते, प्रत्येक कॉलम एका प्रकारासाठी. प्रत्येक कॉलम1असेल जर त्या रो वर दिलेल्या प्रकाराचा डेटा असेल, आणि 0 अन्यथा. याचा अर्थ, रेषीय रिग्रेशनमध्ये चार गुणांक असतील, एक प्रत्येक भोपळ्याच्या प्रकारासाठी, जो त्या खास प्रकारासाठी “प्रारंभ किंमती” (किंवा “अतिरिक्त किंमती”) साठी जबाबदार असेल.
खालील कोड वन-हॉट एनकोडिंग कसा करायचा याचे उदाहरण दाखवतो:
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 डेटा योग्य प्रकारे इनिशियलाइझ करावा लागतो:
X = pd.get_dummies(new_pumpkins['Variety'])
y = new_pumpkins['Price']
उर्वरित कोड अगदी अगोदर वापरलेले रेषीय रिग्रेशनसारखेच आहे. जर आपण हे वापरले तर आपल्याला रविवारी चतुर्थांश त्रुटी सुमारे अगदी समान मिळेल, पण निर्धारण गुणांक खूप जास्त (~77%) मिळेल. अजूनही अचूक भाकितांसाठी, आपण अनेक वर्गवारी गुणधर्म तसेच अंकात्मक गुणधर्म जसे की Month किंवा DayOfYear देखील विचारात घेऊ शकतो. सगळे गुणधर्म एकत्र करण्यासाठी join वापरू शकतो:
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%) आणि निर्धारण 0.94 मिळतो!
एकत्र करून सर्व काही
सर्वात उत्तम मॉडेल बनवण्यासाठी, आपण जोडलेले (वन-हॉट एनकोड केलेले वर्गवारी + अंकात्मक) डेटा वर बहुपदीय रिग्रेशनचा उपयोग करू शकतो. आपल्यासाठी येथे संपूर्ण कोड आहे:
# प्रशिक्षण डेटा सेट करा
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)
हे आपल्याला अंदाजे 97% ची सर्वोत्तम निर्धारण गुणांक आणि MSE=2.23 (~8% भाकीत त्रुटी) देईल.
| मॉडेल | MSE | निर्धारण |
|---|---|---|
DayOfYear Linear |
2.77 (17.2%) | 0.07 |
DayOfYear Polynomial |
2.73 (17.0%) | 0.08 |
Variety Linear |
5.24 (19.7%) | 0.77 |
| सर्व गुणधर्म Linear | 2.84 (10.5%) | 0.94 |
| सर्व गुणधर्म Polynomial | 2.23 (8.25%) | 0.97 |
🏆 छान! आपण एकाच धड्यात चार रिग्रेशन मॉडेल्स तयार केले आणि मॉडेल गुणवत्ता 97% पर्यंत सुधारली. रिग्रेशनच्या अंतिम विभागात, आपण Logistic Regression बद्दल शिकाल ज्याचा उपयोग वर्ग ठरविण्यासाठी होतो.
🚀आव्हान
हा नोटबुक वापरून विविध चल तपासून पहा, आणि तपासा की सहसंबंध मॉडेलच्या अचूकतेशी कसा संबंधित आहे.
पोस्ट-लेक्चर क्विझ
पुनरावलोकन व स्वअध्ययन
या धड्यात आपण Linear Regression बद्दल शिकलो. रिग्रेशनचे आणखी महत्त्वाचे प्रकार आहेत. Stepwise, Ridge, Lasso आणि Elasticnet तंत्रांबद्दल वाचा. अधिक शिकण्यासाठी एक चांगला अभ्यासक्रम म्हणजे Stanford Statistical Learning course.
असाईनमेंट
अस्वीकरण: हा दस्तऐवज AI भाषांतर सेवेचा वापर करून Co-op Translator द्वारे भाषांतरित केला आहे. आम्ही अचूकतेसाठी प्रयत्नशील असलो तरी, कृपया याचा विचार करा की स्वयंचलित भाषांतरांमध्ये त्रुटी किंवा चुकीची माहिती असू शकते. मूळ दस्तऐवज त्याच्या स्थानिक भाषेतच अधिकृत स्रोत मानला पाहिजे. महत्त्वाच्या माहितीसाठी व्यावसायिक मानवी भाषांतर शिफारसीय आहे. या भाषांतराच्या वापरामुळे उद्भवणाऱ्या चुका किंवा गैरसमजांसाठी आम्ही जबाबदार नाही.





