Free tutorials & notes in Hindi & English · Clean code examples 🧰 मुफ़्त PDF और फ़ोटो टूल्स →
🤖 Week 7 – Machine Learning Core  ·  दिन 38

दिन 38: Linear Regression: House Prices

⏱ 2 hours📶 Intermediate🎯 100% self-study
दिन 38 / 60

✅ आज आप सीखेंगे

  • विचार: data से होकर एक सीधी line
  • Slope और intercept business भाषा में
  • Least squares – “best fit” का मतलब
  • MAE, RMSE और R² से evaluate
  • Residual plots और कब line काफ़ी नहीं

🏢 असली दुनिया में

Pune का एक property portal “price estimate” button चाहता है। Seller flat का size डालता है और तुरंत सही कीमत देखता है। आज आप एक feature – area – से version 1 बनाएँगे और सीखेंगे कि यह कितना ग़लत हो सकता है।

विचार

price = intercept + slope × area। Slope बताता है एक extra square foot कितने lakh जोड़ता है; intercept वह जगह है जहाँ line शून्य area पर मिलती है।

Python
import pandas as pd
from sklearn.linear_model import LinearRegression
h = pd.read_csv("house_prices.csv")
pune = h[h["city"] == "Pune"]
X, y = pune[["area_sqft"]], pune["price_lakh"]
lr = LinearRegression().fit(X, y)
print(f"price ≈ {lr.intercept_:.2f} + {lr.coef_[0]:.4f} × area")
print(f"→ every extra 100 sqft adds about ₹{lr.coef_[0] * 100:.2f} lakh")
for a in [600, 1000, 1500]:
    print(f"{a} sqft → ₹{lr.predict(pd.DataFrame({'area_sqft': [a]}))[0]:.1f} lakh")
price ≈ 2.50 + 0.0502 × area → every extra 100 sqft adds about ₹5.02 lakh 600 sqft → ₹32.6 lakh 1000 sqft → ₹52.7 lakh 1500 sqft → ₹77.9 lakh
Python
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
h = pd.read_csv("house_prices.csv"); pune = h[h["city"] == "Pune"]
lr = LinearRegression().fit(pune[["area_sqft"]], pune["price_lakh"])
x = pd.DataFrame({"area_sqft": range(400, 3000, 50)})
fig, ax = plt.subplots(figsize=(9, 4.2))
ax.scatter(pune["area_sqft"], pune["price_lakh"], s=14, alpha=0.5, color="#4f46e5", label="flats in Pune")
ax.plot(x["area_sqft"], lr.predict(x), color="#dc2626", lw=2.5, label="best-fit line")
s = pune.sample(6, random_state=3)
for _, r in s.iterrows():
    p = lr.predict(pd.DataFrame({"area_sqft": [r.area_sqft]}))[0]
    ax.plot([r.area_sqft, r.area_sqft], [r.price_lakh, p], color="#f59e0b", lw=1.5)
ax.set_xlabel("area (sqft)"); ax.set_ylabel("price (₹ lakh)"); ax.legend()
ax.set_title("Orange lines = errors (residuals). Least squares makes their squares as small as possible")
plt.show()
Pune flats का scatter, best-fit regression line और residual lines
Line ऊर्ध्वाधर दूरियों के वर्गों का जोड़ न्यूनतम करती है।

हाथ से least squares

Python
import numpy as np
import pandas as pd
h = pd.read_csv("house_prices.csv"); pune = h[h["city"] == "Pune"]
x, y = pune["area_sqft"].to_numpy(), pune["price_lakh"].to_numpy()
slope = ((x - x.mean()) * (y - y.mean())).sum() / ((x - x.mean()) ** 2).sum()
intercept = y.mean() - slope * x.mean()
print(f"by formula : slope={slope:.5f} intercept={intercept:.3f}")
print(f"np.polyfit : {np.polyfit(x, y, 1).round(5)}")
by formula : slope=0.05024 intercept=2.503 np.polyfit : [0.05024 2.50279]

Line कितनी अच्छी है?

Python
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.dummy import DummyRegressor
from sklearn.metrics import mean_absolute_error, root_mean_squared_error, r2_score
h = pd.read_csv("house_prices.csv"); pune = h[h["city"] == "Pune"]
X_tr, X_te, y_tr, y_te = train_test_split(pune[["area_sqft"]], pune["price_lakh"], test_size=0.25, random_state=7)
for name, m in [("baseline (mean price)", DummyRegressor()), ("linear regression", LinearRegression())]:
    p = m.fit(X_tr, y_tr).predict(X_te)
    print(f"{name:22s} MAE={mean_absolute_error(y_te, p):5.2f}  RMSE={root_mean_squared_error(y_te, p):5.2f}  R²={r2_score(y_te, p):5.3f}")
baseline (mean price) MAE=19.87 RMSE=25.24 R²=-0.019 linear regression MAE= 7.44 RMSE= 9.28 R²=0.862
Metricमतलबकब अच्छा
MAEऔसत absolute error, lakh मेंछोटा; समझाना आसान
RMSEMAE जैसा पर बड़ी गलतियों को ज़्यादा सज़ाछोटा; MAE के क़रीब = कम बड़ी चूकें
R²Price के बदलाव का कितना हिस्सा समझाया (0–1)1 के क़रीब; 0 = mean से बेहतर नहीं
💼 Business भाषा में कहें

“जो flats model ने नहीं देखे, उन पर estimate औसतन लगभग ₹7.4 lakh ग़लत है, और अकेला area कीमतों के लगभग 86% अंतर समझाता है।”

Residuals: line क्या चूकती है

Python
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
h = pd.read_csv("house_prices.csv"); pune = h[h["city"] == "Pune"].copy()
lr = LinearRegression().fit(pune[["area_sqft"]], pune["price_lakh"])
pune["pred"] = lr.predict(pune[["area_sqft"]]); pune["resid"] = pune["price_lakh"] - pune["pred"]
fig, ax = plt.subplots(1, 2, figsize=(11, 3.8))
ax[0].scatter(pune["pred"], pune["resid"], s=12, alpha=0.6, color="#0891b2"); ax[0].axhline(0, color="#dc2626")
ax[0].set_xlabel("predicted price"); ax[0].set_ylabel("residual"); ax[0].set_title("Residuals vs prediction")
ax[1].scatter(pune["metro_km"], pune["resid"], s=12, alpha=0.6, color="#f59e0b"); ax[1].axhline(0, color="#dc2626")
ax[1].set_xlabel("metro distance (km)"); ax[1].set_title("Residuals fall with metro distance → missing feature!")
plt.tight_layout(); plt.show()
print("corr(residual, metro_km) =", round(pune["resid"].corr(pune["metro_km"]), 2), "| corr(residual, age) =", round(pune["resid"].corr(pune["age_years"]), 2))
corr(residual, metro_km) = -0.65 | corr(residual, age) = -0.48
Prediction और metro दूरी के सामने residual plots
Residuals में pattern मतलब model से जानकारी छूट रही है – यहाँ metro दूरी और उम्र।
🧠 Linear regression की मान्यताएँ

लगभग सीधी-line रिश्ता, स्वतंत्र errors, पूरी range में errors का बराबर फैलाव, और बहुत बड़े outliers का दबदबा नहीं। Residual plots से इन्हें जाँचते हैं।

जब सीधी line काफ़ी नहीं

Python
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
from sklearn.metrics import r2_score
w = pd.read_csv("delhi_weather.csv", parse_dates=["date"])
w["doy"] = w["date"].dt.dayofyear
X, y = w[["doy"]], w["avg_temp_c"]
line = LinearRegression().fit(X, y)
curve = make_pipeline(PolynomialFeatures(4), LinearRegression()).fit(X, y)
print("straight line R² =", round(r2_score(y, line.predict(X)), 3))
print("degree-4 curve R² =", round(r2_score(y, curve.predict(X)), 3), "  ← seasons are not a straight line")
straight line R² = 0.036 degree-4 curve R² = 0.589 ← seasons are not a straight line

🏅 आज के Job Skills

✔ Simple linear regression fit करके समझना✔ Slope और intercept समझाना✔ Baseline के सामने MAE, RMSE और R² से evaluate✔ Residual plots से जाँच

Practice tasks

🏋️ Practice – ख़ुद करें

Task 1: Lucknow और Bengaluru के लिए अलग-अलग price ~ area fit करें। Slopes की तुलना करें – buyers के लिए क्या मतलब?
Solution देखें
Python
import pandas as pd
from sklearn.linear_model import LinearRegression
h = pd.read_csv("house_prices.csv")
for c in ["Lucknow", "Bengaluru"]:
    d = h[h["city"] == c]; m = LinearRegression().fit(d[["area_sqft"]], d["price_lakh"])
    print(c, "₹", round(m.coef_[0] * 100, 2), "lakh per extra 100 sqft")
Lucknow ₹ 3.75 lakh per extra 100 sqft Bengaluru ₹ 5.73 lakh per extra 100 sqft
Task 2: Study hours से student का average predict करें। Test set पर R² क्या है?
Solution देखें
Python
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
st = pd.read_csv("students_performance.csv")
a, b, c, d = train_test_split(st[["study_hours"]], st["average"], test_size=0.25, random_state=0)
print(round(LinearRegression().fit(a, c).score(b, d), 3))
0.632
Task 3: Telecom data में total_charges को tenure_months पर regress करें। Slope समझाएँ।
Solution देखें
Python
import pandas as pd
from sklearn.linear_model import LinearRegression
t = pd.read_csv("telecom_churn.csv").dropna()
m = LinearRegression().fit(t[["tenure_months"]], t["total_charges"])
print("Each extra month ≈ ₹", round(m.coef_[0]), "more total charges")
Each extra month ≈ ₹ 761 more total charges

Quick quiz

🧠 Quick Quiz – ख़ुद को जाँचें

1. 0.06 (lakh per sqft) का slope मतलब…
0.06 lakh = ₹6,000।
2. R² = 0 मतलब…
R² mean baseline से तुलना करता है।
3. RMSE, MAE से बहुत बड़ा हो तो…
वर्ग करने से बड़ी गलतियाँ बढ़ती हैं।
4. Residuals में साफ़ pattern बताता है…
Features जोड़ें या model का रूप बदलें।
5. “Least squares” क्या न्यूनतम करता है?
यही best-fit line तय करता है।

Interview corner

💼 Interview Corner

Non-technical व्यक्ति को R² समझाइए।

“हमारा model लगभग 80% समझाता है कि flats की कीमतें अलग क्यों हैं; बाकी 20% उन चीज़ों से है जो model नहीं जानता।” इसे ठोस बनाने के लिए rupees में MAE जोड़ें।

MAE या RMSE – कौन सा report करेंगे?

Stakeholders के लिए MAE क्योंकि यह साधारण units में और पढ़ने में आसान है। जब बड़ी गलतियाँ ख़ास महँगी हों तब RMSE। अक्सर दोनों बताएँ।

सारांश

  • Linear regression least squares से y = intercept + slope × x fit करता है।
  • Slope = x की एक unit पर y का बदलाव।
  • Test data पर evaluate: mean baseline के सामने MAE, RMSE, R²।
  • Residual patterns छूटे features दिखाते हैं।
➡️ आगे

Day 39: सभी features के साथ multiple regression, और model को ईमानदार रखने के लिए Ridge व Lasso।

अक्सर पूछे जाने वाले प्रश्न (FAQ)

क्या intercept negative हो सकता है?
हाँ – यह बस वह जगह है जहाँ line area = 0 पर मिलती है, जो किसी असली flat का नहीं। Data range के बाहर इसका मतलब न निकालें।
सिर्फ़ R² क्यों नहीं?
R² अच्छा दिख सकता है जबकि rupees में errors business के लिए अभी भी बड़े हों। हमेशा MAE/RMSE के साथ बताएँ।
← Data Science (60 Days)
🔗

Share this topic with a friend

यह topic किसी दोस्त को भेजें

Found it useful? Send it to a classmate learning the same thing.

अच्छा लगा? जो दोस्त यही सीख रहा है, उसे भेज दीजिए।

अगला topicदिन 39: Multiple Regression, Ridge और Lasso आपकी प्रगति: 38 / 60 (63%) · Lesson 39 / 60 आगे बढ़ें →

यह lesson कैसा लगा?

आपकी राय से हम content और बेहतर बनाते हैं।

अपना review और सुझाव लिखें (वैकल्पिक)

Review approve होने के बाद आपका नाम और शहर इसके साथ public दिख सकते हैं। Email या phone न लिखें।

▶ CodingEasily on YouTube

Video से सीखें – आसान Hindi में

चुनी हुई video: RDBMS भाग 3 – Class XI Commerce IT

▶ Channel subscribe करें