簡體   English   中英

SVM 分類器 n_samples, n_splits 問題 sklearn Python

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM