अध्याय ३ · खण्ड I · 24 मिनेट
कोडमा रेखीय रिग्रेसन
रिग्रेसन मोडेलले सङ्ख्या पूर्वानुमान गर्छ। रेखीय रिग्रेसनले उत्तर फिचरहरूको भारित योग जोड अफसेट हो भन्ने मान्छ। सरल, छिटो, व्याख्यायोग्य, र झन्डै हरेक सङ्ख्यात्मक पूर्वानुमान समस्याका लागि बलियो आधार।
वर्गीकरणकर्ताले श्रेणी छान्छ। रिग्रेसर ले सङ्ख्या पूर्वानुमान गर्छ। आकार — fit, predict, मूल्याङ्कन — उही हो; लोस फङ्क्सन र मेट्रिक्स फरक छन्। यो खण्डले रेखीय रिग्रेसन परिचय गराउँछ, सबैभन्दा सरल र सबैभन्दा प्रयोग हुने रिग्रेसर। यसले लक्ष्य फिचरहरूको भारित योग जोड अफसेट हो भन्ने मान्छ। छिटो, व्याख्यायोग्य, र आधारका रूपमा अचम्मलाग्दो रूपमा राम्रोसँग काम गर्छ। तपाईंलाई अन्ततः अझ आकर्षक चाहिँदा पनि, तपाईं पहिले रेखीय रिग्रेसन fit गर्नुहुन्छ “सजिलो” कस्तो देखिन्छ थाहा पाउन।
मानसिक मोडेल
रेखीय रिग्रेसनले मान्छ:
predicted_value = w1 * feature1 + w2 * feature2 + ... + wn * featuren + b
भार w1, w2, ..., wn र अफसेट b नब हुन्। तालिमले तिनका लागि मान भेट्छ जसले लोस — सामान्यतया mean squared error (MSE), तालिम सेटभर (actual - predicted)² को औसत — घटाउँछ।
त्यो पूरै तस्बिर हो। दुई फिचरसँग काठमाडौं भाडा पूर्वानुमानका लागि:
predicted_rent = w_size * size_sqft + w_location * location_score + b
w_size = 30, w_location = 12000, b = -5000 भार भएको मोडेलले भाडा पूर्वानुमान गर्थ्यो:
predicted_rent = 30 * size_sqft + 12000 * location_score + 5000
600 sqft फ्ल्याट location_score 3 सँगका लागि:
predicted_rent = 30 * 600 + 12000 * 3 - 5000 = 18000 + 36000 - 5000 = 49000 NPR/month
सम्भाव्य। मोडेल राम्रो छ कि छैन ती भारले वास्तवमा डाटा फिट गर्छन् कि गर्दैनन् मा निर्भर हुन्छ — जुन .fit() ले पत्ता लगाउँछ।
रेखीय रिग्रेसन तालिम
scikit-learn कक्षा: LinearRegression। अन्य सबै जस्तै उही इन्टरफेस:
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
import numpy as np
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42,
)
model = LinearRegression()
model.fit(X_train, y_train)
predictions = model.predict(X_test)
print(f"MAE: {mean_absolute_error(y_test, predictions):.0f}")
print(f"RMSE: {np.sqrt(mean_squared_error(y_test, predictions)):.0f}")
print(f"R²: {r2_score(y_test, predictions):.3f}")
तीन मेट्रिक्स, प्रत्येक फरक प्रश्नका लागि उपयोगी:
- MAE (Mean Absolute Error) — पूर्वानुमान त्रुटिको औसत आकार, लक्ष्यको उही एकाइमा। NPR मा भाडा पूर्वानुमानका लागि, “MAE = 4500” को अर्थ सामान्य पूर्वानुमान त्रुटि लगभग रु 4,500/महिना छन्। सहज।
- RMSE (Root Mean Squared Error) — MAE जस्तै तर ठूला त्रुटिलाई बढी दण्ड दिन्छ। लक्ष्यको एकाइमा पनि। सधैं ≥ MAE।
- R² (R-squared, “coefficient of determination”) — मोडेलले व्याख्या गरेको लक्ष्यमा भिन्नताको अनुपात। सामान्यतया 0 (मोडेलले केही थप्दैन) देखि 1 (पूर्ण फिट) सम्म। शोरयुक्त वास्तविक-संसार समस्यामा 0.6 देखि 0.8 सामान्य छ।
व्याख्यायोग्य भाडा मोडेलका लागि, गैर-प्राविधिक stakeholders लाई रिपोर्ट गर्न NPR मा MAE मेट्रिक हो। R² ML अभ्यासकर्ताले पहिले जाँच्ने हो।
गुणक पढ्ने
for name, coef in zip(X.columns, model.coef_):
print(f" {name:25s} {coef:+10.2f}")
print(f" {'intercept':25s} {model.intercept_:+10.2f}")
आउटपुट (चित्रात्मक):
size_sqft +28.45
bedrooms +5234.10
bathrooms +3812.55
location_score +11342.78
has_balcony +2104.30
intercept -3420.00
यसलाई ठूलो स्वरमा पढ्नुहोस्। हरेक अतिरिक्त वर्ग फुट आकारले पूर्वानुमानित भाडामा लगभग रु 28 थप्छ। हरेक अतिरिक्त कोठाले रु 5,234 थप्छ। स्थान-स्कोरको हरेक एकाइले रु 11,343 थप्छ। बालकोनी रु 2,104 मूल्यको छ। intercept भनेको तपाईंले सबै फिचर शून्यमा भएको काल्पनिक फ्ल्याटका लागि पूर्वानुमान गर्ने कुरा हो — एक्लै अर्थहीन सङ्ख्या, तर मोडेललाई चाहिने क्यालिब्रेसन।
उपयोगी sanity check: के चिन्ह र परिमाण तपाईंको सहज ज्ञानसँग मेल खान्छन्? यदि “bedrooms” ले नकारात्मक भार पाएको छ भने, केही गलत छ — या त डाटासँग, फिचरसँग, वा तिनी कसरी सहसम्बन्धित छन् (अधिक कोठाले शहर केन्द्रबाट टाढा सँग सहसम्बन्ध राख्न सक्छ, र त्यो सहसम्बन्धले हावी गर्न सक्छ)। छानबिन गर्नुहोस्।
रेखीय रिग्रेसन कहिले पर्याप्त छ — र कहिले होइन
छोटो, इमानदार सूची।
रेखीय रिग्रेसन पर्याप्त हुन्छ जब:
- फिचर र लक्ष्यबीचको सम्बन्ध लगभग रेखीय हुन्छ (सीधा-रेखा, बाङ्गो होइन)। धेरै कुराका लागि — भाडा बनाम आकार, आय बनाम अनुभव, दूरी बनाम यात्रा समय — यो वास्तवमै लगभग रेखीय छ।
- तपाईं थोरै फिचरसँग व्याख्यायोग्य मोडेल चाहनुहुन्छ।
- तपाईंलाई ल्यापटपमा सेकेन्डमा तालिम दिन सक्ने छिटो आधार चाहिन्छ।
- तपाईंको डाटासेट सानो छ (केही हजार पङ्क्ति भन्दा कम) — लचिला मोडेल overfit हुनेछन्।
रेखीय रिग्रेसन संघर्ष गर्छ जब:
- सम्बन्ध वास्तवमै गैर-रेखीय हुन्छ (भाडा बनाम शहर केन्द्रबाट दूरी U-आकार हो, रेखीय होइन)।
- फिचर अन्तरक्रिया गर्छन् (आकारको प्रभाव तपाईं थमेलमा हुनुहुन्छ कि ललितपुरमा निर्भर हुन्छ)।
- लक्ष्य सीमित छ (रेखीय रिग्रेसनले नकारात्मक भाडा पूर्वानुमान गर्न सक्छ, जुन असम्भव हो)।
अध्याय 3 खण्ड 3 ले गैर-रेखीय केसमा के लिने देखाउनेछ। अहिलेलाई, रेखीय रिग्रेसन हरेक रिग्रेसन समस्याका लागि तपाईंको सुरुवात बिन्दु हो।
regularisation बारे टिप्पणी
सादा LinearRegression ले तपाईंसँग पङ्क्ति सङ्ख्याको तुलनामा धेरै फिचर हुँदा overfit हुन सक्छ। दुई सामान्य संस्करणले ठूला भारका लागि सानो दण्ड थप्छन्, जसले सामान्यीकरण सुधार्छ:
Ridge— squared भारको योग दण्ड दिन्छ। सबै भार समान रूपमा घटाउँछ।Lasso— पूर्ण भारको योग दण्ड दिन्छ। कम-उपयोगी फिचरका भारलाई ठ्याक्कै शून्य मा तान्छ — फिचर छनोटका लागि उपयोगी।
उही इन्टरफेस:
from sklearn.linear_model import Ridge, Lasso
ridge = Ridge(alpha=1.0)
ridge.fit(X_train, y_train)
lasso = Lasso(alpha=0.1)
lasso.fit(X_train, y_train)
alpha पारामिटरले दण्डको बल नियन्त्रण गर्छ। ठूलो alpha → अधिक घटाइ → सरल मोडेल। हामी अध्याय 5 मा हाइपरपारामिटर ट्युनिङ (कसरी alpha छान्ने) राम्रोसँग ओगट्नेछौं।
अधिकांश परियोजनाका लागि, सादा LinearRegression सही सुरुवात बिन्दु हो; धेरै सहसम्बन्धित फिचर हुँदा Ridge मा र फिचर छनोट चाहँदा Lasso मा पुग्नुहोस्।
सानो कार्यगत उदाहरण
खेल्न केही नक्कली डाटा उत्पन्न गर्नुहोस्:
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
rng = np.random.default_rng(42)
n = 200
size_sqft = rng.uniform(200, 1500, size=n)
bedrooms = rng.integers(1, 5, size=n)
location_score = rng.uniform(1, 5, size=n)
# साँचो सम्बन्ध + शोर
rent = 25 * size_sqft + 4000 * bedrooms + 10000 * location_score + rng.normal(0, 5000, size=n)
X = pd.DataFrame({"size_sqft": size_sqft, "bedrooms": bedrooms, "location_score": location_score})
y = pd.Series(rent, name="rent")
model = LinearRegression()
model.fit(X, y)
print("Recovered weights:")
for name, coef in zip(X.columns, model.coef_):
print(f" {name:20s} {coef:+8.2f}")
print(f" {'intercept':20s} {model.intercept_:+8.2f}")
तपाईंले 25, 4000, 10000 को धेरै नजिकका भार देख्नुपर्छ — मोडेलले शोरयुक्त डाटाबाट साँचो सम्बन्ध पुन: प्राप्त गर्छ। यो नियन्त्रित सेटिङमा रिग्रेसनको जादू हो। वास्तविक डाटामा, अवश्य, “साँचो सम्बन्ध” गन्दो हुन्छ र भारले धेरै कुराहरू सन्तुलन गर्नुपर्छ; तर प्रक्रिया समान छ।
आफ्नो बुझाइ जाँच्नुहोस्
Quick check
—एक टिम सदस्यले काठमाडौं भाडा पूर्वानुमानका लागि रेखीय रिग्रेसन तालिम दिन्छन्। रिपोर्ट गरिएको MAE 4,200 NPR छ। तिनले वास्तविक-सम्पत्ति क्लाइन्टलाई यो व्याख्या गर्न चाहन्छन्। सर्वोत्तम व्याख्या कुन हो?
Quick check
—तपाईंको रेखीय रिग्रेसनका गुणक अधिकांश समझदार देखिन्छन् — तर `bedrooms` को *नकारात्मक* भार (−2,100) छ। नतिजा रिपोर्ट गर्नुअघि सबैभन्दा विचारशील अर्को चरण के हो?
अब के आउँछ
तपाईंले यन्त्रिक कुरा बुझ्नुभयो। अर्को खण्डले वास्तविक, नेपाल-विशिष्ट समस्यामा रेखीय रिग्रेसन प्रयोग गर्छ: लिस्टिङको सानो डाटासेटबाट काठमाडौं घर भाडा पूर्वानुमान। हामी डाटा सङ्कलन, फिचर इन्जिनियरिङ, तालिम, मूल्याङ्कन, र एउटा सीधा रेखा पर्याप्त नहुँदा के गर्ने हिँड्नेछौँ।