टाइमसीरीज़ डेटा का क्रॉस-वैलिडेशन

Python में Time Series Data के लिए Machine Learning

Chris Holdgraf

Fellow, Berkeley Institute for Data Science

scikit-learn के साथ क्रॉस-वैलिडेशन

# "split" मेथड पर इटरेट करने से train/test इंडिस मिलते हैं
for tr, tt in cv.split(X, y):
    model.fit(X[tr], y[tr])
    model.score(X[tt], y[tt])
Python में Time Series Data के लिए Machine Learning

क्रॉस-वैलिडेशन प्रकार: KFold

  • KFold क्रॉस-वैलिडेशन आपका डेटा बराबर साइज़ के कई "folds" में बाँटता है
  • यह सबसे आम क्रॉस-वैलिडेशन रूटीन में से एक है

      from sklearn.model_selection import KFold
      cv = KFold(n_splits=5)
      for tr, tt in cv.split(X, y):
          ...
    
Python में Time Series Data के लिए Machine Learning

मॉडल प्रेडिक्शंस का विज़ुअलाइज़ेशन

fig, axs = plt.subplots(2, 1)

# हर लूप में वैलिडेशन के लिए चुनी गई इंडिस प्लॉट करें
axs[0].scatter(tt, [0] * len(tt), marker='_', s=2, lw=40)
axs[0].set(ylim=[-.1, .1], title='टेस्ट सेट इंडिस (color=CV loop)', 
           xlabel='कच्चे डेटा की इंडेक्स')

# हर इटरेशन पर मॉडल की प्रेडिक्शंस प्लॉट करें
axs[1].plot(model.predict(X[tt]))
axs[1].set(title='हर CV लूप पर टेस्ट सेट प्रेडिक्शंस', 
           xlabel='प्रेडिक्शन इंडेक्स')
Python में Time Series Data के लिए Machine Learning

KFold CV व्यवहार का विज़ुअलाइज़ेशन

Python में Time Series Data के लिए Machine Learning

डेटा को shuffle करने पर एक नोट

  • कई CV इटरेटर क्रॉस-वैलिडेशन के दौरान डेटा को shuffle करने देते हैं.
  • यह तभी सही है जब डेटा i.i.d. हो, जो टाइमसीरीज़ आम तौर पर नहीं होती.
  • टाइमसीरीज़ पर प्रेडिक्शन करते समय डेटा को shuffle नहीं करना चाहिए.

      from sklearn.model_selection import ShuffleSplit
    
      cv = ShuffleSplit(n_splits=3)
      for tr, tt in cv.split(X, y):
          ...
    
Python में Time Series Data के लिए Machine Learning

शफल्ड CV व्यवहार का विज़ुअलाइज़ेशन

Python में Time Series Data के लिए Machine Learning

टाइम सीरीज़ CV इटरेटर का उपयोग

  • अभी तक, हमने क्रॉस-वैलिडेशन में समय के रैखिक क्रम को तोड़ा है
  • लेकिन सामान्यतः आपको अतीत के डेटा की भविष्यवाणी के लिए भविष्य के datapoints का उपयोग नहीं करना चाहिए
  • एक तरीका: हमेशा past का ट्रेनिंग डेटा लेकर future की भविष्यवाणी करें
Python में Time Series Data के लिए Machine Learning

टाइम सीरीज़ क्रॉस-वैलिडेशन इटरेटर का विज़ुअलाइज़ेशन

# क्रॉस-वैलिडेशन इटरेटर इम्पोर्ट और इनिशियलाइज़ करें
from sklearn.model_selection import TimeSeriesSplit
cv = TimeSeriesSplit(n_splits=10)

fig, ax = plt.subplots(figsize=(10, 5))
for ii, (tr, tt) in enumerate(cv.split(X, y)):
    # ट्रेनिंग और टेस्ट इंडिस प्लॉट करें
    l1 = ax.scatter(tr, [ii] * len(tr), c=[plt.cm.coolwarm(.1)], 
                    marker='_', lw=6)
    l2 = ax.scatter(tt, [ii] * len(tt), c=[plt.cm.coolwarm(.9)], 
                    marker='_', lw=6)
    ax.set(ylim=[10, -1], title='TimeSeriesSplit behavior', 
           xlabel='data index', ylabel='CV iteration')
    ax.legend([l1, l2], ['Training', 'Validation'])
Python में Time Series Data के लिए Machine Learning

TimeSeriesSplit क्रॉस-वैलिडेशन इटरेटर का विज़ुअलाइज़ेशन

Python में Time Series Data के लिए Machine Learning

scikit-learn में कस्टम स्कोरिंग फंक्शन

def myfunction(estimator, X, y):
    y_pred = estimator.predict(X)
    my_custom_score = my_custom_function(y_pred, y)
    return my_custom_score
Python में Time Series Data के लिए Machine Learning

scikit-learn के लिए कस्टम कॉरिलेशन फंक्शन

def my_pearsonr(est, X, y):
    # प्रेडिक्शंस बनाकर वेक्टर में बदलें 
    y_pred = est.predict(X).squeeze()

    # numpy के "corrcoef" फंक्शन से कॉरिलेशन मैट्रिक्स निकालें
    my_corrcoef_matrix = np.corrcoef(y_pred, y.squeeze())

    # मैट्रिक्स से एकल कॉरिलेशन वैल्यू लौटाएँ
    my_corrcoef = my_corrcoef[1, 0]
    return my_corrcoef
Python में Time Series Data के लिए Machine Learning

अभ्यास करते हैं!

Python में Time Series Data के लिए Machine Learning

Preparing Video For Download...