根據統計學習理論,在樣本量確定的情況下,必須控制模型的複雜度以防止模型的學習結果「過擬合」,即「奧卡姆剃刀」原理,這就讓我們為了控制模型的複雜度而無法使用高維模型進行學習,可能導致「欠擬合」的結果。

但是我偶然找到了一種正則化的數據挖掘方法,可以在樣本量不大的情況下,使用非常大的VC維的挖掘方法,並取得較高的準確率。在這一演算法下,隨著模型複雜度的增加,欠擬合風險降低,而過擬合風險不會增加,換言之,經驗風險逐步減少,結構風險也逐步減少(隨之增加的只有計算時間),模型複雜度趨向於無窮大時,泛化誤差最小。

(一般的數據挖掘模式如下)

(這種新方法下的模式如下)

那麼在這種演算法下,在用機器學習解決實際問題時,可以不再使用「模型的可解釋性」、「奧卡姆剃刀」等難以準確定義的概念,也無需考慮Lasso、Ridge等常規的正則化中的懲罰係數,並且可以基於少量數據開展深度學習。個人認為它對機器學習理論的發展有很大的價值。

舉例而言:

有500個樣本,屬性為X0、X1、X2、X3、X4、X5,類標記為Y,實際上的 Y 的表達式為:

(X與Y的真實關係如上)

其中,I(·) 是示性函數,每個X的取值範圍都是{-1,0,1},而u是隨機變數,取值範圍為{-2,-1,0,1,2}(均勻分布)。取300個作為訓練樣本,另200個作為測試樣本。

在此模式中,X與Y的關係非常複雜,且噪音很大,因此採用線性回歸、SVM、決策樹、隨機森林、AdaBoost等方法都不能取得較好的效果,它們 要麼無法找到X與Y的正確內在關係,要麼因維度太大導致過擬合。

但是採用上文提到的方法,則可以達到不錯的效果(以pearson相關係數和spearman相關係數作為評價):

本文方法的效果遠超主流的機器學習演算法

因此想請教一下各位如下兩個問題:

(1) 類似的演算法業界是否已有?是否已被普遍使用?

(2) 若無,這一演算法對機器學習理論的發展是否有較大意義?


贊同樓上說的,ML/DL業界領先於學界,無論是應用方面還是理論方面都是遙遙領先,許多超前模型都是某些企業的「核心機密」


機器學習領域確實是有大量先進模型是不會被公開出來的,也就是說已經在學術上公開的最前沿最先進的模型並不是真正最前沿的。尤其是在有類似量化交易這樣的行業存在時,很多預測模型的價值並不在於模型本身的優點,而在於自己知道這個模型別人不知道。所以當你研究出新興成果時,第一要做的就是把它藏好自己再不斷改進,而不是來網路上交流共享出來。假如確實真的是革命性突破,既不要因此就覺得自己牛飛天了,也不要覺得可能是自己民科了。能突破現有模型一是因為當然你的水平高,二是因為其他大牛們選擇不公開所以現有公開模型本身就落後,能有突破是非常不容易的但又不是獨一無二的。我以前也做出過一個類似優點的東西,也是專門針對高維小樣本的高噪音數據,只不過比較適用於xy是連續分布的。黑科技性的預測模型都是在理論上有根本性創新(這裡是指有形式非常複雜但意義較為簡潔的大量手推公式研究),並且這種理論能夠直接運用到實際,如果只是現有模型拆開重組修改些細節,這隻能叫活學活用不叫創新突破。現在網路上、各種群里有很多技術很水的伸手黨,喜歡打著學習交流的旗號空手套白狼,利用耿直老實科研人員在研發後期的小迷茫和迫切希望被認可的心態,竊取其研究成果,這是最最無恥的行為。


能否進一步描述一下你的模型?你定義的模型複雜度是什麼?

從目前得到的信息看,你的模型複雜度指標沒有準確地衡量模型真實的複雜度。


乾量化挖因子吧,發財指日可待


1.所以你的演算法是?

2. 你其他模型的實驗時候調參了嗎?

我按照他的思路復現了一下測試代碼

from random import choice
from DaPy import SeriesSet, Series, describe, corr
from sklearn.tree import DecisionTreeRegressor as DT
from sklearn.linear_model import LinearRegression as LR

value = (-1, 0, 1)
error = (-2, -1, 0, 1, 2)

def function(row):
val = choice(error) - 1
val += 1 if row[0] == row[1] else 0
val -= 1 if row[0] + row[2] == row[1] + row[3] else 0
val += row[4] ** 2
val += 1 if row[5] &> row[4] else 0
return val

X = SeriesSet({
X0: Series(choice(value) for i in range(500)),
X1: Series(choice(value) for i in range(500)),
X2: Series(choice(value) for i in range(500)),
X3: Series(choice(value) for i in range(500)),
X4: Series(choice(value) for i in range(500)),
X5: Series(choice(value) for i in range(500)),
})

Y = X.apply(function, axis=0)[C_0]
X.info
print describe(Y)

for model, name in [(DT(), u決策樹), (LR(), u線性回歸)]:
model.fit(X[:300], Y[:300])
Y_predict = model.predict(X[300:])
pearson = corr(Y_predict.tolist(), Y[300:].tolist(), pearson)
spearman = corr(Y_predict.tolist(), Y[300:].tolist(), spearman)
print(u"%s的性能為: %.4f皮爾遜 | %.4f斯皮爾曼" % (name, pearson, spearman))

我發現兩個模型的穩定性都很差,決策樹的皮爾遜係數在0.1-0.35之間波動;線性模型的表現會穩定一些。


感謝大家的回答,我覺得不必糾結於在題設中的 X 和 Y 的關係下應用什麼分類方法比較好,畢竟實際上我們並不知道它倆的真實關係。我只是說題中所說的方法可以一定程度上解決任意概率分布函數下的預測問題。

如果大家對此感興趣,可以隨機生成一些樣本,提交給我 以驗證方法的可行性,可以遵照以下原則:

(1) X 和 Y 的之間的函數關係可以充分複雜,這樣的話可以體現出此方法優於一般的LR、SVM、DT等方法;

(2)X 和 Y 都盡量是離散的,如果是連續的話我也會將其離散化;為保證計算時間不過分長,希望 X 的取值空間不要太大;

(3)隨機擾動項可以大一些,充分模擬現實中overfitting的情況;

數據(包括訓練集的 X 和 Y 及 測試集的 X)可知乎私信我,也可發送至 [email protected]


我感覺這種小樣本小測試集非常不穩定。給你個方法:隨機取樣(train test),訓練,預測,算score,這樣一個流程重複多次,然後算score的std和mean,如果兩個model的mean之差顯著超過這兩個model的std之和再考慮。而且要換不同函數測試穩定性。


覺得不可能。任意learning algorithm的test error隨著model complexity都不會不斷下降的吧…(bias–variance tradeoff)

你兩幅圖上的x軸是不是搞成了training data size?


推薦閱讀:
相关文章