अध्याय ३ · खण्ड III · 26 मिनेट
सीधा रेखा पर्याप्त नहुँदा
रेखीय रिग्रेसनले सीधा-रेखा सम्बन्ध मान्छ। जब साँचो ढाँचा बाङ्गो वा अन्तरक्रियात्मक हुन्छ, रेखीय मोडेलले under-fit हुन्छ। दुई गैर-रेखीय रिग्रेसर — KNeighborsRegressor र DecisionTreeRegressor — ले तपाईंलाई रेखाले नपुग्ने आकार फिट गर्न दिन्छन्।
रेखीय रिग्रेसनले एउटै कुरा मान्छ: उत्तर फिचरहरूको भारित योग हो। जब सत्यमा बाङ्गो, मोड, वा अन्तरक्रिया (आकारको प्रभाव तपाईं कुन छिमेकमा हुनुहुन्छ भन्नेमा निर्भर हुन्छ) हुन्छ, कुनै पनि भारको छनोटले यसलाई राम्रोसँग फिट गर्दैन। पछिल्लो खण्डका residual plots ले ठ्याक्कै यही देखाए। यो खण्डमा हामी दुई लचिला रिग्रेसर — KNeighborsRegressor र DecisionTreeRegressor — भेट्छौँ जसले गैर-रेखीय आकार प्राकृतिक रूपमा फिट गर्छन्। उही fit/predict आकार; धेरै फरक व्यवहार।
आकार समस्या, चित्रित
सानो synthetic उदाहरण। भाडा शहर केन्द्रबाट दूरीमा निर्भर हुन्छ, तर रेखीय रूपमा होइन — सबैभन्दा सस्ता छिमेक 5-10 km बाहिर (उपनगरीय) हुन्छन्, मूल्य 15+ km (ग्रामीण विलासिता) मा फेरि बढ्दै र केन्द्रमा धेरै उच्च।
import numpy as np
import matplotlib.pyplot as plt
rng = np.random.default_rng(42)
distance = rng.uniform(0, 20, 200)
# U-आकार सम्बन्ध: मध्यम दूरीमा सस्तो, नजिक र टाढा महँगो
rent = 60000 - 8000 * distance + 400 * distance**2 + rng.normal(0, 5000, 200)
plt.scatter(distance, rent, alpha=0.5)
plt.xlabel("Distance from centre (km)")
plt.ylabel("Rent (NPR)")
plt.show()
तपाईंले U-आकार देख्नुहुन्छ। यसमा रेखीय रिग्रेसन fit गर्नुहोस् र मोडेलले यसमा सपाट-जस्तै रेखा कोर्छ, जताततै भयानक पूर्वानुमानसहित — 0 km नजिक (under-predict) र 20 km मा (under-predict) उच्च residuals र बीचमा over-predict।
गैर-रेखीय विकल्प 1: k-Nearest Neighbours regression
KNeighborsRegressor ले KNeighborsClassifier जस्तै काम गर्छ, तर श्रेणीमा मत गर्नुको सट्टा, यसले k निकटतम छिमेकीको लक्ष्य मानको औसत निकाल्छ:
from sklearn.neighbors import KNeighborsRegressor
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
model = Pipeline([
("scale", StandardScaler()),
("regressor", KNeighborsRegressor(n_neighbors=10)),
])
model.fit(X_train, y_train)
12 km मा एक नयाँ फ्ल्याटका लागि, k-NN ले फिचर-स्पेसमा 12 km सँग सबैभन्दा नजिकका 10 तालिम फ्ल्याट भेट्छ, तिनको भाडाको औसत निकाल्छ, र त्यो औसतलाई पूर्वानुमानका रूपमा रिपोर्ट गर्छ। समीकरण छैन, फिट भएको बाङ्गो छैन — केवल स्थानीय औसत।
माथिको U-आकार डाटामा, k-NN ले बाङ्गोलाई राम्रोसँग पछ्याउँछ। यसले रेखीयता मान्दैन; यसले कुनै आकार मान्दैन। आकार डाटाबाट आउँछ।
k-NN रिग्रेसनका बलियोपक्ष:
- स्वेच्छाचारी गैर-रेखीय आकार बिनै प्रयास सम्हाल्छ।
- व्याख्या गर्न सजिलो (“हामीले रु 47,000 पूर्वानुमान गर्यौं किनभने त्यो 10 सबैभन्दा समान विगत लिस्टिङहरूको औसत भाडा थियो”)।
- डाटाको वितरणबारे कुनै धारणा छैन।
कमजोरी:
- वर्गीकरण जस्तै: दूरी-आधारित, त्यसैले स्केलिङ अनिवार्य।
- ठूला डाटासेटमा ढिलो (हरेक पूर्वानुमान = हरेक तालिम बिन्दुमा दूरी)।
- फिचर स्पेसका किनार नजिक खराब (30 km टाढा नयाँ फ्ल्याटका 10 निकटतम छिमेकी सम्भवतः 20+ km टाढा हुन्छन्, जुन राम्रो स्थानीय औसतका लागि बनाउँदैनन्)।
गैर-रेखीय विकल्प 2: निर्णय रुख रिग्रेसन
DecisionTreeRegressor ले वर्गीकरणकर्ता जस्तै रुख बनाउँछ, तर हरेक पातले कक्षा लेबलको सट्टा त्यो पातमा पर्ने तालिम बिन्दुका लक्ष्य मानको औसत राख्छ।
from sklearn.tree import DecisionTreeRegressor
model = DecisionTreeRegressor(max_depth=5, random_state=42)
model.fit(X_train, y_train)
रुखले फिचर स्पेसलाई आयताकार क्षेत्रमा विभाजन गर्छ, र हरेक क्षेत्रमा तालिम बिन्दुहरूको औसत भाडा पूर्वानुमान गर्छ। पूर्वानुमान भर्याङ जस्ता देखिन्छन्: क्षेत्रभित्र piecewise-constant, विभाजनमा उफ्रन्दै।
निर्णय रुख रिग्रेसनका बलियोपक्ष:
- स्वेच्छाचारी गैर-रेखीय आकार र अन्तरक्रिया स्वचालित रूपमा सम्हाल्छ।
- फिचर स्केल गर्नुपर्दैन।
- व्याख्यायोग्य (
export_textउही तरिकाले काम गर्छ)। - आउटलायरप्रति सहनशील (एउटा अनौठो बिन्दुले क्षेत्रको औसतलाई धेरै सर्दैन)।
कमजोरी:
- Piecewise-constant पूर्वानुमानले चिकना वास्तविक-संसार सम्बन्धमा कुरूप देखिन सक्छ।
- व्यक्तिगत रुख भङ्गुर हुन सक्छन् — डाटामा सानो परिवर्तनले विभाजन सर्छ।
max_depthबिना overfit हुने प्रवृत्ति (वर्गीकरणकर्ता जस्तै)।
एकल रुख विरलै अन्तिम रिग्रेसन मोडेल हुन्छ। Random forests र gradient boosting — दुवै धेरै रुखका ensembles, दुवै scikit-learn मा regressor कक्षा (RandomForestRegressor, GradientBoostingRegressor) — ले झन्डै सधैं एकल रुख हराउँछन्। हामी तिनलाई अध्याय 5 मा ओगट्छौं।
छेउछाउ तुलना
एउटै U-आकार डाटामा तीन रिग्रेसर:
from sklearn.linear_model import LinearRegression
from sklearn.tree import DecisionTreeRegressor
from sklearn.neighbors import KNeighborsRegressor
from sklearn.metrics import mean_absolute_error
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
distance.reshape(-1, 1), rent, test_size=0.2, random_state=42,
)
models = {
"Linear": LinearRegression(),
"k-NN": KNeighborsRegressor(n_neighbors=10),
"Tree": DecisionTreeRegressor(max_depth=5, random_state=42),
}
for name, model in models.items():
model.fit(X_train, y_train)
pred = model.predict(X_test)
mae = mean_absolute_error(y_test, pred)
print(f"{name:8s} MAE: Rs {mae:.0f}")
आउटपुट (चित्रात्मक):
Linear MAE: Rs 9,820
k-NN MAE: Rs 4,310
Tree MAE: Rs 5,140
रेखीय रिग्रेसनले U-आकारमा सीधा रेखा मार्फत आफ्नो सर्वोत्तम गरिरहेको छ। k-NN र रुख दुवैले आफूलाई बाङ्गोमा आकार दिन्छन् र लगभग आधा गलत पूर्वानुमान गर्छन्।
फिचर-इन्जिनियरिङ छुटाइको बाटो
तपाईंलाई सधैं गैर-रेखीय मोडेल चाहिँदैन। कहिलेकाहीं सही व्युत्पन्न फिचर थप्दा रेखीय मोडेललाई गैर-रेखीय ढाँचा फिट गर्न दिन्छ:
X_engineered = pd.DataFrame({
"distance": distance,
"distance_squared": distance**2,
})
model = LinearRegression()
model.fit(X_engineered, rent)
मोडेलले अब distance_squared मा सकारात्मक भार र distance मा नकारात्मक भारसँग U-आकार उत्पादन गर्न सक्छ। यसले काम गर्छ किनभने मोडेल अझै आफ्ना भारमा रेखीय छ, तर फिचर मा गैर-रेखीय रूपान्तरण समावेश छन्।
यो basis expansion चाल हो, र classical तथ्याङ्कशास्त्रको धेरै यसमा बनेको छ। बहुपद फिचर, अन्तरक्रिया शब्द (size * location_score), र log-रूपान्तरण सबै यहाँ फिट हुन्छन्। scikit-learn सँग PolynomialFeatures छ यी स्वचालित रूपमा उत्पन्न गर्न:
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly.fit_transform(X)
यसले 2 डिग्रीसम्मका सबै अन्तरक्रिया र वर्ग उत्पन्न गर्छ। रेखीय रिग्रेसनसँग जोडिँदा, तपाईंले अचम्मलाग्दो लचिलो मोडेल पाउनुहुन्छ जुन अझै व्याख्यायोग्य छ।
तालिम दायरा बाहिरका पूर्वानुमान
मोडेलहरूबीच सूक्ष्म तर महत्त्वपूर्ण भिन्नता:
- रेखीय रिग्रेसन बहिर्वेशन गर्छ — रेखा विस्तार गरेर तालिम दायरा बाहिरका इनपुटका लागि आत्मविश्वासका साथ पूर्वानुमान गर्छ।
- k-NN र रुख रिग्रेसरहरूले बाँध्छन् — तालिम दायरा बाहिरका इनपुटका लागि पूर्वानुमान केवल निकटतम तालिम छिमेकीसँग मेल खान्छन्, किनभने औसत निकाल्न अरू केही छैन।
बहिर्वेशन उपयोगी हुन्छ कि हुँदैन समस्यामा निर्भर हुन्छ। यो वर्षका लिस्टिङबाट भोलिको भाडा पूर्वानुमान गर्ने मोडेलका लागि, मध्यम बहिर्वेशन ठीक छ। तालिम डाटाका कुनै पनि भन्दा दोब्बर ठूलो भवनमा भाडा पूर्वानुमान गर्ने मोडेलका लागि, रेखीय रिग्रेसनले आत्मविश्वासी सङ्ख्या उत्पादन गर्नेछ जुन बेतरतिब गलत हुनसक्छ — र तपाईंले विश्वास गर्नुहुँदैन।
जब तपाईं रिग्रेसन मोडेल पठाउनुहुन्छ, सधैं तालिम-डाटा दायरा कागजात गर्नुहोस्, र कलरहरूलाई तिनको इनपुट यसभन्दा बाहिर हुँदा चेतावनी दिनुहोस्।
आफ्नो बुझाइ जाँच्नुहोस्
Quick check
—हालैका व्यापार दिनबाट NEPSE बन्द पूर्वानुमान गर्ने रेखीय रिग्रेसनको R² 0.31 छ र स्पष्ट रूपमा बाङ्गो residuals छन्। एक टिम सदस्यले quadratic फिचर (`day_index**2`) मात्र थप्न सुझाव दिन्छन्। के त्यसले काम गर्नेछ?
Quick check
—एक टिम सदस्यले max_depth बिनाको निर्णय रुख रिग्रेसर तालिम दिन्छन् र लगभग-पूर्ण तालिम MAE रिपोर्ट गर्छन्। तिनी परीक्षण MAE दोब्बर छ भन्ने कुरामा छक्क छन्। के भइरहेको छ र उपचार के हो?
अब के आउँछ
अध्याय 3 सकियो। हामीले दुई रिग्रेसर, कार्य गरिएको भाडा-पूर्वानुमान परियोजना, र रेखा पर्याप्त नहुँदा के लिने सिक्यौं। अध्याय 4 Course 03 को सबैभन्दा महत्त्वपूर्ण अवधारणात्मक अध्याय हो: मोडेललाई इमानदारीसाथ कसरी मूल्याङ्कन गर्ने। शुद्धताले झुटो बोल्छ। Precision र recall ले इमानदार कथा भन्छन्। Confusion मेट्रिक्सले असमानता प्रकट गर्छन्। तपाईंलाई कहाँ हेर्ने थाहा नभए Overfitting स्पष्टमा लुक्छ। अध्याय 4 बिना, तपाईंले अहिलेसम्म देखेका कुनै पनि मेट्रिक्स भरपर्दा हुँदैनन्।