आपकी पहली प्रेडिक्शन: लीनियर रिग्रेशन (linear regression)
scikit-learn की मदद से डेटा पर एक सीधी रेखा (straight line) फिट करें, नंबर्स प्रेडिक्ट करने के लिए इसका इस्तेमाल करें, और एक आसान बेसलाइन से तुलना करें ताकि आपको पता चले कि क्या यह सच में मददगार है।
60 सेकंड में
आपकी पहली प्रेडिक्शन: लीनियर रिग्रेशन (linear regression)
scikit-learn की मदद से डेटा पर एक सीधी रेखा (straight line) फिट करें, नंबर्स प्रेडिक्ट करने के लिए इसका इस्तेमाल करें, और एक आसान बेसलाइन से तुलना करें ताकि आपको पता चले कि क्या…
prediction = slope × feature + interceptscikit-learn का तरीका (pattern)
- 1
बनाएं (Create)
model = LinearRegression() - 2
फ़िट करें (ट्रेन करें)
model.fit(X_train, y_train)सबसे बेहतरीन स्लोप ढूंढता है। - 3
प्रेडिक्ट करें (Predict)
model.predict(X_new)नई पंक्तियों (rows) के लिए नंबर्स देता है।
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
# Made-up data: wedding guests and kg of rice cooked. Not real figures.
rng = np.random.default_rng(1)
guests = rng.integers(50, 500, 25)
rice_kg = 0.15 * guests + 5 + rng.normal(0, 4, 25)
X = guests.reshape(-1, 1) # scikit-learn wants a 2-D table
model = LinearRegression().fit(X, rice_kg)
print("Slope (kg per guest):", round(model.coef_[0], 3))
print("Intercept (kg):", round(model.intercept_, 2))
print("Prediction for 250 guests:", round(model.predict([[250]])[0], 1), "kg")
xs = np.array([[50], [500]])
plt.scatter(guests, rice_kg, label="made-up examples")
plt.plot(xs, model.predict(xs), color="red", label="learned line")
plt.xlabel("guests"); plt.ylabel("rice (kg)"); plt.legend()एरर नापना
| माप (Measure) | इसका क्या मतलब है | नोट्स |
|---|---|---|
| MAE (मीन एब्सोल्यूट एरर) | गलती का औसत साइज़ | लेबल वाली ही यूनिट; समझाना आसान है |
| RMSE (रूट मीन स्क्वेर्ड एरर) | MAE की तरह ही है, लेकिन बड़ी गलतियों पर ज़्यादा पेनल्टी लगाता है | लेबल वाली ही यूनिट |
| R² (R-स्क्वेर्ड) | मॉडल वेरिएशन के कितने हिस्से को समझा पाता है | 1 एकदम सटीक है, 0 का मतलब केवल औसत प्रेडिक्ट करने से बेहतर कुछ नहीं; नेगेटिव भी हो सकता है |
हमेशा बेसलाइन से तुलना करें
train_test_split का इस्तेमाल करते हैं। "ईमानदारी से काम करना" यूनिट में इसे और गहराई से समझाया गया है।जब सीधी रेखा गलत आकार साबित हो
और देखें और पढ़ें
लैब
एक फ़ीचर का इस्तेमाल करके डायबिटीज डेटासेट पर लीनियर रिग्रेशन, जिसे अलग रखे गए टेस्ट सेट पर स्कोर किया गया और बेसलाइन से तुलना की गई।
समस्या
diabetes डेटासेट में 442 मरीज़ हैं, हर एक के 10 माप (पहले से स्केल्ड हैं, इसलिए वैल्यूज़ 0 के आसपास छोटे नंबर्स हैं), और एक नंबर जो मापता है कि एक साल बाद बीमारी कितनी आगे बढ़ी। यह सिर्फ़ सिखाने के लिए एक डेटासेट है, कोई मेडिकल सलाह नहीं।
- स्टार्टर कोड रन करें। यह फ़ीचर के रूप में केवल
bmiकॉलम का इस्तेमाल करता है और डेटा को स्प्लिट करता है। modelनाम से एकLinearRegressionबनाएं और इसे केवल ट्रेनिंग पंक्तियों पर फ़िट करें।test_maeकैलकुलेट करें: टेस्ट पंक्तियों पर मॉडल का मीन एब्सोल्यूट एरर।baseline_maeकैलकुलेट करें: यदि आप हर टेस्ट पंक्ति के लिए ट्रेनिंग औसत प्रेडिक्ट करते हैं तो आने वाला टेस्ट एरर।- दोनों को प्रिंट करें। क्या मॉडल बेसलाइन से बेहतर प्रदर्शन करता है? कितने अंतर से?
प्रैक्टिस लैब
कोड में बदलाव करें और इसे रन करें। Python आपके ब्राउज़र में चलता है — हमारे सर्वर पर कुछ नहीं भेजा जाता।
कोई आउटपुट नहीं। वैल्यूज़ देखने के लिए print(...) जोड़ें।
आपका काम तब पूरा होगा जब
कठिन सवाल
उत्तर देखने से पहले ख़ुद जवाब देने की कोशिश करें। अगर आप इनके जवाब दे सकते हैं, तो आप पाठ समझ गए हैं।
Q1बेसलाइन को ट्रेनिंग औसत का ही इस्तेमाल क्यों करना चाहिए, टेस्ट औसत का क्यों नहीं?दिखाएं
असल इस्तेमाल में आपको नई पंक्तियों के जवाब पता नहीं होते, इसलिए आप उनका औसत नहीं जान सकते। टेस्ट औसत का इस्तेमाल करने से बेसलाइन को टेस्ट सेट की जानकारी चोरी-छिपे मिल जाएगी। मॉडल और बेसलाइन दोनों को सिर्फ़ उसी जानकारी का इस्तेमाल करना चाहिए जो ट्रेनिंग के समय मालूम थी।
Q2एक दूसरा फ़ीचर, <code>s5</code> जोड़ें, ताकि X में दो कॉलम हों। आप क्या उम्मीद करते हैं, और आप यह कैसे जांचेंगे कि यह सिर्फ़ किस्मत का खेल नहीं है?दिखाएं
संभवतः टेस्ट एरर कम हो जाएगा, क्योंकि एक और माप अतिरिक्त जानकारी जोड़ता है। यह जांचने के लिए कि यह सिर्फ़ एक स्प्लिट की किस्मत नहीं है, कई अलग-अलग random_state वैल्यूज़ के साथ इसे दोहराएं, या क्रॉस-वैलिडेशन (ट्रेन, वैलिडेशन और टेस्ट सेट वाले पाठ में) का इस्तेमाल करें, और देखें कि क्या यह सुधार ज़्यादातर समय बना रहता है।
अक्सर पूछे जाने वाले सवाल
scikit-learn को सिर्फ़ एक फ़ीचर के लिए भी X 2-D टेबल के रूप में क्यों चाहिए होता है?
क्योंकि वही कोड एक फ़ीचर के लिए भी काम करना चाहिए और सौ फ़ीचर्स के लिए भी। X हमेशा पंक्तियां गुणा कॉलम (rows by columns) होता है। reshape(-1, 1) एक सपाट लिस्ट को एक कॉलम में बदल देता है, या आप एक कॉलम वाला DataFrame भी पास कर सकते हैं।
क्या बड़े स्लोप का मतलब है कि फ़ीचर महत्वपूर्ण है?
अपने आप में नहीं। स्लोप यूनिट पर निर्भर करता है। प्रति ग्राम का स्लोप प्रति किलोग्राम के स्लोप के सामने बहुत छोटा दिखता है। फ़ीचर्स की सही तुलना करने के लिए, पहले उन्हें स्केल करें, और फिर भी सावधान रहें: आपस में जुड़े फ़ीचर्स अजीब तरह से क्रेडिट आपस में बांट सकते हैं।
क्या लीनियर रिग्रेशन कारण और प्रभाव (cause and effect) को दिखाता है?
नहीं। यह डेटा में सिर्फ़ एक पैटर्न ढूंढता है। गर्मियों में आइसक्रीम की बिक्री और डूबने की घटनाएं दोनों साथ में बढ़ती हैं, लेकिन एक दूसरे का कारण नहीं है। कारणों को समझने के लिए सावधानीपूर्वक स्टडी डिज़ाइन की ज़रूरत होती है, सिर्फ़ एक फ़िट की गई रेखा की नहीं।
random_state क्या है?
एक नंबर जो रैंडम चॉइस को तय (फ़िक्स) कर देता है, जैसे कि कौन सी पंक्तियां टेस्ट सेट में जाएंगी। वही नंबर हर बार वही स्प्लिट देता है, ताकि आपके नतीजों को दोबारा दोहराया जा सके।
पाठ का टेस्ट
5 सवाल। पास होने और इस पाठ को पूरा करने के लिए 3 सही होने चाहिए (60%)।