2025, Sep 30 03:31
GridSearchCV के साथ रिग्रेशन में फीचर/टारगेट ट्रांसफॉर्मेशन का परीक्षण
रिग्रेशन में फीचर व टारगेट ट्रांसफॉर्मेशन का व्यवस्थित मूल्यांकन: मैनुअल पाइपलाइन बनाम Pipeline और GridSearchCV, साथ TransformedTargetRegressor का उपयोग.
एक ही रिग्रेशन सेटअप में फीचर्स और टारगेट पर कई तरह के ट्रांसफॉर्मेशन का मूल्यांकन करना आम ज़रूरत है। सीधा तरीका है कि कुछ पाइपलाइन खुद बनाएं, उन्हें एक-एक करके फिट करें और मेट्रिक्स की तुलना करें। यह काम करता है, लेकिन जैसे ही विकल्पों का दायरा बढ़ता है, आपको GridSearchCV जैसा कुछ चाहिए—एक ऐसा एकीकृत तरीका, जो मान्य संयोजनों को व्यवस्थित रूप से गिने और सर्वश्रेष्ठ मॉडल चुने।
बेसलाइन: पूर्वनिर्धारित पाइपलाइनों पर मैनुअल लूप
निम्न पैटर्न कई पाइपलाइन बनाता है, हर एक को वही प्रशिक्षण डेटा पर फिट करता है, और यह तय करने के लिए MSE और R2 दर्ज करता है कि कौन-सा वैरिएंट बेहतर चलता है।
import numpy as np
import pandas as pd
from sklearn.preprocessing import FunctionTransformer, PowerTransformer
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import make_pipeline
from sklearn.metrics import mean_squared_error
from sklearn.compose import TransformedTargetRegressor
model_space = {
    'linear': LinearRegression(),
    'power': make_pipeline(PowerTransformer(), LinearRegression()),
    'log': make_pipeline(FunctionTransformer(np.log, np.exp), LinearRegression()),
    'log_sqrt': TransformedTargetRegressor(
        regressor=make_pipeline(FunctionTransformer(np.log, np.exp), LinearRegression()),
        func=np.sqrt,
        inverse_func=np.square
    )
}
scores_df = pd.DataFrame()
for label, algo in model_space.items():
    algo.fit(X_train, y_train)
    y_pred_eval = algo.predict(X_eval)
    y_pred_train = algo.predict(X_train)
    r2_val = algo.score(X_train, y_train)
    scores_df.at[label, 'MSE'] = mean_squared_error(y_train, y_pred_train)
    scores_df.at[label, 'R2'] = r2_val
best_key = scores_df['R2'].idxmax()
यह तरीका सरल और पारदर्शी है। आप ठीक-ठीक जानते हैं कि किन पाइपलाइनों को आजमाया, हर फिटेड ऑब्जेक्ट तक उसकी कुंजी से पहुँचा जा सकता है, और जो भी डायग्नोस्टिक्स चाहिए, उन्हें सहेज सकते हैं।
सीमाएँ क्या हैं
जैसे ही आप ट्रांसफॉर्मेशनों का अधिक व्यवस्थित सर्वे करना चाहते हैं, मैनुअल लूप बोझिल हो जाता है। आप कुछ खास संयोजनों को बाहर रखना चाह सकते हैं, टारगेट ट्रांसफॉर्मेशन को केवल कुछ फीचर ट्रांसफॉर्म्स के साथ जोड़ना चाह सकते हैं, और मूल्यांकन सेटिंग्स को सुसंगत रखना चाहते हैं। ठीक यही स्थिति scikit-learn के GridSearchCV के लिए है, जो आपको वैध विकल्पों को सूचीबद्ध करने और उसी स्पेस से सर्वश्रेष्ठ एस्टीमेटर चुनने देता है।
कई पैरामीटर ग्रिड्स के साथ GridSearchCV की ओर बढ़ना
खोज को संरचित करने का लचीला तरीका है कि दो स्टेप वाला एक सामान्य Pipeline परिभाषित करें और फिर पैरामीटर ग्रिड्स की सूची पास करें। एक से अधिक ग्रिड का उपयोग करने से “अनावश्यक” या अमान्य मिश्रणों को केवल सूचीबद्ध न करके आसानी से रोका जा सकता है। जब टारगेट को बदलना हो, तब यह TransformedTargetRegressor को भी समायोजित कर लेता है।
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import FunctionTransformer, PowerTransformer
from sklearn.linear_model import LinearRegression
from sklearn.compose import TransformedTargetRegressor
import numpy as np
base_flow = Pipeline([
    ('transformer', None),
    ('estimator', LinearRegression())
])
param_maps = [
    {'transformer': [FunctionTransformer(np.log, np.exp), PowerTransformer()]},
    {
        'transformer': [FunctionTransformer(np.log, np.exp)],
        'estimator': [
            TransformedTargetRegressor(
                regressor=LinearRegression(),
                func=np.sqrt,
                inverse_func=np.square
            )
        ]
    }
]
searcher = GridSearchCV(base_flow, param_maps, cv=5)
searcher.fit(X_mat, y_vec)
chosen = searcher.best_estimator_
यह सेटअप केवल वही संयोजन मूल्यांकित करता है जिन्हें आप स्पष्ट रूप से अनुमति देते हैं। पहला ग्रिड फीचर ट्रांसफॉर्मेशन की पड़ताल करता है जो सीधे LinearRegression में फीड होते हैं। दूसरा ग्रिड एक रास्ता जोड़ता है जहाँ फीचर्स को log से ट्रांसफॉर्म किया जाता है और टारगेट को TransformedTargetRegressor के जरिये बदला जाता है। यह ढांचा अनचाहे पेयरिंग्स को डिज़ाइन से ही रोकता है और सर्च स्पेस को पढ़ने में आसान रखता है।
हाथ से बनी डिक्शनरी की तुलना में एक समझौता खोजयोग्यता का है। मैनुअल लूप में हर मॉडल आपकी उंगलियों पर होता है। GridSearchCV के साथ आपको best_estimator_ मिलता है और आप cv_results_ देख सकते हैं, लेकिन अलग-अलग फिटेड मॉडेल्स उतने सीधे उपलब्ध नहीं होते।
यह क्यों मायने रखता है
जब आप ट्रांसफॉर्मेशनों की तुलना एकसमान तरीके से करते हैं, तो तदर्थ फैसले घटते हैं और कॉन्फ़िगरेशन नियंत्रण में रहता है। एक ही सर्च ऑब्जेक्ट मूल्यांकन लॉजिक को समेकित करता है, समान क्रॉस-वैलिडेशन सेटिंग्स सक्षम करता है, और फीचर पाइपलाइनों के साथ टारगेट ट्रांसफॉर्मेशन को भी जोड़ता है।
निष्कर्ष
यदि आप कई रिग्रेशन ट्रांसफॉर्मेशन आजमा रहे हैं, तो नामित स्टेप्स वाली एक सामान्य Pipeline से शुरुआत करें और पैरामीटर ग्रिड्स की सूची में केवल वही संयोजन गिनें जिन्हें आप सच में चाहते हैं। GridSearchCV से फिट करें और best_estimator_ के जरिये विजेता एस्टीमेटर प्राप्त करें। अगर आपको कस्टम निरीक्षण के लिए हर फिटेड वैरिएंट हाथ में रखना है, तो साधा डिक्शनरी-और-लूप पैटर्न अब भी व्यावहारिक विकल्प है। मूल्यांकन के समय जितने नियंत्रण और स्वचालन की जरूरत हो, उसके अनुरूप रास्ता चुनें।