[英]SVM classifier n_samples, n_splits problem sklearn Python
我正在嘗試使用基於 O'Reilly 書籍示例(使用 Python 進行金融風險管理的機器學習)的 SVM 模型來預測波動性。 當我完全復制示例(使用 S&P500 數據)時,它運行良好,但現在我在使用特定基金返回數據的這段代碼時遇到了麻煩:
# returns
r = np.array([ nan, 0.0013933 , 0.00118874, 0.00076462, 0.00168565,
-0.00018507, -0.00390753, 0.00307275, -0.00351472])
# horizon
t = 252
# mean of returns
mu = r.mean()
# critical value
z = norm.ppf(0.95)
# realized volatility
vol = r.rolling(5).std()
vol = pd.DataFrame(vol)
vol.reset_index(drop=True, inplace=True)
# SVM GARCH
r_svm = r ** 2
r_svm = r_svm.reset_index()
# inputs X (returns and realized volatility)
X = pd.concat([vol, r_svm], axis=1, ignore_index=True)
X = X.dropna().copy()
X = X.reset_index()
X.drop([1, 'index'], axis=1, inplace=True)
# labels y realized volatility shifted 1 period onward
vol = vol.dropna().reset_index()
vol.drop('index', axis=1, inplace=True)
# linear kernel
svr_lin = SVR(kernel='linear')
# hyperparameters grid
para_grid = {'gamma': sp_rand(),
'C': sp_rand(),
'epsilon': sp_rand()}
# svm classifier (regression?)
clf = RandomizedSearchCV(svr_lin, para_grid)
clf.fit(X[:-1].dropna().values,
vol[1:].values.reshape(-1,))
# prediction
n_vol = clf.predict(X.iloc[-1:])
引發的錯誤是:
ValueError: Cannot have number of splits n_splits=5 greater than the number of samples: n_samples=3.
該代碼適用於更長的返回系列,所以我認為問題是數組的長度,但我不知道如何解決它。 有人可以幫我嗎?
由於您將RandomizedSearchCV
與默認cv
參數一起使用,因此會引發此錯誤。 默認情況下, RandomizedSearchCV
運行 5 折交叉驗證以找到模型的最佳超參數。
5 折交叉驗證意味着將您的訓練數據拆分為 5 個子集,並根據這些拆分訓練 5 個不同的模型。
看起來您的訓練集中的對象少於 5 個,因此無法將您的數據分成 5 份。
要解決此問題,您應該添加更多數據或通過添加cv
參數來減少RandomizedSearchCV
的折疊數:
clf = RandomizedSearchCV(svr_lin, para_grid, cv=2)
我建議收集更多數據,因為 4 個數據點很可能不足以使模型准確或具有預測性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.