R的機器學習 模型效能提公升探索 神經網路

2021-08-03 08:57:11 字數 3603 閱讀 2267

網上有很多介紹神經網路原理的文章,本質上機器學習就是乙個分類器;而神經網路是乙個模擬神經元學習的高階分類器,當然,神經網路也是個黑箱模型。本章使用神經網路對之前的iris資料集再次進行**。

在學習神經網路的時候,常常在回想人類的學習過程;這是個比較有思辨意義的過程。人類從出生的時候,往往就是一張白紙,可以理解成什麼都不懂。然後在小時候受到周圍環境的影響和教育,比如父母告訴孩子,水如果冒煙了(沸騰),就很熱,不要碰。小孩子聽到這句話的第一反應就是,哦,我總結了乙個規律,冒煙的透明液體=很熱。這個就是乙個簡單的通過已有的知識進行學習的過程,學習出來一套規律,用於**未來;但是有一天這個孩子看到了液氮,同樣是冒煙,但是卻很涼,這個對於乙個小孩子來說可能有些超出他的認知,他覺得之前看到的規律不在適用,所以需要修正他的認知,這個過程其實就是乙個知識迭代,不斷用新環境去總結規律;到這了,小孩子知總結了乙個規律:只要超過了物質的沸點,就會強烈揮發。這個結合另一條規律:液體的沸點一般都很高,得出之前的結論:冒煙的透明液體≈很熱;雖然這個結論大部分時間是對的,但是由於掌握更深層次的規律,可以去**有不同引入引數的情況。

多說一點,很多時候在爭論的先天後天的問題,其實不可否認的是,環境對乙個人的塑造和影響是巨大的,乙個人從出生下來,接觸的環境的豐富程度決定了他的輸出,模擬到機器學習,如果兩個同樣演算法,乙個輸入1萬條資料訓練,乙個輸入1億條資料訓練,那麼可能兩個演算法的精確度有天壤之別,簡單來說,這就是乙個馬太效應,乙個更好的演算法(階級更高的人)有更高的準確度,從而可以有更多測試訓練學習的機會(更豐富的教育資源),反過來不斷的迭代自己(不斷的成長),最後行程最優質的演算法(更高的階級)。

扯得稍微有點遠,神經網路就是乙個模擬人類學習的演算法。對剛才的例子進行擴充套件,比如我們有五種物質,水、油、乾冰、液氮、木頭,分別看到他們冒煙的時候的冷熱程度。

首先看乙個0層的神經網路,也就是不分層,如果不分層可以簡單認為是記憶,無法進行**,當然如果強行來說,記憶是最初等的學習,

materials results

1 水 熱

2 油 熱

3 乾冰 冷

4 液氮 冷

5 木頭 熱

這個分類器其實也就是分了兩類,熱的是水、油、木頭,冷的是乾冰和液氮。當然這個也可以**,比如我看到一盒乾冰在冒煙,我可以很直接的說,這個很涼!

有沒有發現,這通常都是小孩子做的事情,這個階段的神經網路還不會總結經驗,只能進行簡單的記憶並應用。

但是自然界的事情很少有一模一樣的,人不能兩次踏入同一條河流。所以如果我們加上乙個層,或者說,神經網路通過模擬(其實對於機器來說,他們只知道樸素的數學關係,不知道內在聯絡,不過反過來想想,我們人類也是通過樸素的數學關係,「創造」了一套解釋而已,何其相似),首先對特徵值進行分類,然後再次分類的話,大概機器的學習過程是這樣的:

materials layer1 results

1 水 液體 熱

2 油 液體 熱

3 乾冰 氣體 冷

4 液氮 氣體 冷

5 木頭 固體 熱

中間那個就是乙個新的層,這個就比第乙個記憶厲害了很多,總結了乙個小規律,也就是在訓練集中,看到「氣體冒煙都是冷的」這個規律,反過來就是「非氣體冒煙都是熱的」。這個簡單學習模型,看似比三歲小孩知道的就多了。再次強調,機器不一定是這樣分類的,其實我們也不是這麼分類的,自然界的都是現有規律,然後去定義,在機器的語言中,可能液體是乙個複雜的公式,我們加這個公式為液體罷了。在這裡,當我們**乙醚(乙醚沸點34.6度),可能就會有問題,因為乙醚也是液體,但為什麼不熱呢?

所以我還可以更精準的新增層:

materials layer1 layer2 results

1 水 液體 沸點高 熱

2 油 液體 沸點高 熱

3 乾冰 氣體 沸點低 冷

4 液氮 氣體 沸點低 冷

5 木頭 固體 沸點高 熱

這樣我們的結論就是沸點高的液體冒煙是熱的之類的,就可以更精準的確定乙醚之類的液體了。

下面拿我們最熟悉的iris集畫圖說明下:

先看下圖,因為我的ggplot修改了主題更美觀,其實不修改主題圖形是一致的:

iris2

library(ggplot2)

ggplot(data=iris2)+geom_point(aes(x=petal.length,

y=petal.width,

colour=as.factor(species)),size=3)+

theme1+

ggtitle('iirs

species~petal.length+petal.width')

為了更好理解,先取兩個變數,兩個分類,拋掉setosa這個類,看下圖形:

這裡取了petal length和petal width兩個變數,去**是versicolor還是virgina類。

如果簡單來分類,可以用一條直線在紅綠交接的地方劃一刀,但是也許分不乾淨,常用的分類曲線不是直線,因為直線不可微,一般用到乙個s型的函式:

通過這個s型函式,我們可以基於輸入訊號來進行分類。大於閾值就是1,也就是第一類,小於閾值就是0,也就是第二類。

如果把iris資料集進行拓展,可以發現特徵值有4個,分類值有三個,理論上說,乙個平面內很難劃分三個分類,所以需要新增更多的節點,把所有變數考慮進去的話,就是乙個典型的用神經網路進行分類的案例。

神經網路的包有很多,這裡用下rsnns包

random_order

iris$species

iris$species[iris$species=="setosa"]

iris$species[iris$species=="versicolor"]

iris_train

iris_test

library(rsnns)

neu_m

用rssns包建模,然後進行**:

neu_p

[,1:4])

最後看下準確率:

confusionmatrix

(iris_test[,5],neu_p)

得到:

predictions

targets 1 2 3

1 13 0 0

2 0 16 1

3 0 0 15

準確率是(13+16+15)/(13+16+15+1)=97.8%

機器學習模型效能提公升方案

機器學習最有價值的部分是 建模。這是在歷史資料上訓練模型並對新資料進行 的模型的開發。關於 建模的首要問題是 如何獲得更好的結果?這份備忘單包含了多年以來我的最佳應用程式,以及我對頂尖的機器學習從業人員和比賽獲勝者的學習所總結出的最佳建議。有了本指南,您不僅會得到解脫和提公升的效能,甚至可以在 問題...

如何評估機器學習模型的效能

機器學習的模型效能評估,主要是確定在trainingset中的誤差,更重要的是在測試集的誤差,對新模型的學習能力,也就是所謂的泛化能力。因此資料集的確定尤為重要,將樣本資料集分為trainingset 和 testingset,資料集的劃分要注意如下兩個方面 1 盡量保證trainingset 和 ...

深度學習 提公升模型分類效能的幾點思考

使用cnn做文字分類已經有一段時間了,之前在封閉式測試集中模型的表現還是不錯的。但是,拿到實際環境彙總測試,問題就來了。模型過擬合嚴重,泛化能力弱。最終帶來的結果是,使用者體驗不佳。改進的方面 1 改變字元向量為詞向量。實際發現,以字元為單元的模型,在資料量少的情況下 10w以下 更容易過擬合,詞向...