官术网_书友最值得收藏!

1.4 實驗室小試牛刀

實踐是檢驗真理的唯一標準,設置“實驗室小試牛刀”環(huán)節(jié)正是為了檢驗學習的成果。通過將學習的理論和方法應用到實際問題中,加深對理論和方法的理解,鞏固學習到的知識。這里設置了兩個小項目:第一個是使用PyTorch中的Tensor完成復雜的科學計算;第二個是使用PyTorch完成線性擬合的項目。涉及的數據請在隨書代碼chapter1文件夾的datas文件夾中查找。

1.4.1 塔珀自指公式

PyTorch中的Tensor對標的是NumPy科學計算庫,提供了和NumPy類似的接口,并且支持CPU和GPU計算。我們要完成的科學計算叫作塔珀自指公式。塔珀自指公式是杰夫·塔珀(Jeff Tupper)發(fā)現的自指公式,此公式的二維圖像與公式本身的外觀一樣。塔珀自指公式如下:

式中,符號[x]代表向下取整,如[4.2]=4;mod(a,b)表示a除以b得到的余數,如mod(11,6)=5。現在取一個常數k,具體如下。

在0≤x≤106和kyk+16范圍內會將滿足此不等式的值用黑點繪制出來,不滿足的就保持空白,這樣許多組xy的取值繪圖就是塔珀自指公式繪圖,如圖1.15所示。

圖1.15 塔珀自指公式繪圖

此時出現了一個表示它本身的點圖圖像,當然只是取了y軸正半軸很小的一塊區(qū)域。我們還可以沿y軸上下移動,就會看到塔珀自指公式能畫出幾乎所有的圖形,如數學最基礎的算式1+1=2,就是在k為如下所示的值時在kyk+16范圍內出現的,如圖1.16所示。

圖1.16 用塔珀自指公式繪制“1+1=2”

反之,如果已經有一張106px×17px的小圖片,能找到相應的k值嗎?應如何找到?其實這個過程并不復雜,按照下面幾個步驟操作即可。

(1)從小圖片最左下角的像素開始,如果空白則記為0,如果有著色則記為1。然后向上移動一行,按此規(guī)則計算出相應的0或1。

(2)第一列處理完后,向右移動再從第二列底部向上開始照此計算。然后計算第三列、第四列、第五列,直至處理完整個106×17范圍內的像素。

(3)按照整個順序將這串1802位的“0/1”字符,從二進制數轉成十進制數,并且乘以17,得到就是k的值。

關于塔珀自指公式,國外已經做成了JS交互的工具,直接通過網頁就可以訪問。讀者可以自行嘗試。

對于任意的xy,輸入塔珀自指公式并判斷等式是否成立。這實際上就是考驗讀者對Tensor上算子的使用和學習能力。雖然不是每個算子都有講解,但是通過查字典及Help命令,完全可以完成上述任務。下面提供了樣例代碼,可以做完了再看。

這其實就是堆砌公式而已,您做出來了嗎?

1.4.2 看看你畢業(yè)了能拿多少

在很多為應屆畢業(yè)生服務的微信公眾號上可以看到“畢業(yè)薪酬預測”“職業(yè)生涯預測”等趣味性預測。這些預測實際上就是簡單的回歸模型,通常會讓測試者輸入畢業(yè)學校信息、專業(yè)信息、熟練使用的技能或做選擇題,提交后就可以預測自己的薪酬。實際上,這些趣味性測試是有根據的。筆者了解到,一家教育行業(yè)公司所做的模型基于收集到的大量特征(如學校、區(qū)域及薪酬分布等信息),然后進行模型訓練,最終能夠做出比較符合實際的預測。

本節(jié)使用一份脫敏的數據來完成“迷你”版的“畢業(yè)薪酬預測”,該項測試會使用回歸模型,并使用PyTorch完成模型搭建、模型訓練及預測。本次實驗的數據包含“專業(yè)”“城市”“薪酬”“綜合能力”等字段,如圖1.17所示。

圖1.17 數據樣本

這份脫敏的數據共有19個特征:專業(yè)、學歷編碼、專業(yè)編碼、是否是高薪專業(yè)、是否是熱門專業(yè)、工作所在地的緯度、工作所在地的經度、是否是專科、是否是本科、是否是“雙一流”學校、是否是“211”學校、是否是“C9”名校、是否是“Top2”學校(指北京大學和清華大學)、是否是“985”學校、地區(qū)、地區(qū)編碼、所在城市、薪酬、綜合能力指標。有效數據共有255 516條記錄,該數據已經脫敏,現在的業(yè)務需求是,“請設計一個趣味測試,學生輸入專業(yè)、學歷、畢業(yè)院校這3個維度的信息,就可以預測應屆畢業(yè)生畢業(yè)后的薪酬水平”。

先分析業(yè)務,工作中業(yè)務優(yōu)先,魯莽的開始必定會影響到手的年終獎。顯然,薪酬預測是一個連續(xù)的結果,因此屬于回歸問題。我們要做的是使用專業(yè)、學歷和畢業(yè)院校等信息建立一個如下所示的方程:

薪酬=w1·專業(yè)+w2·學歷+w3·畢業(yè)院校+…

使用數據集訓練模型可以得到w1w2w3,…的權重,訓練好之后便可以在測試數據集上測試。首先需要考慮的是影響薪酬的因素,最重要的莫過于行業(yè),不同的行業(yè)之間存在巨大的薪酬差別。而在學校學什么專業(yè)在很大程度上會決定學生畢業(yè)后從事的行業(yè),專業(yè)的優(yōu)勢實際上就是畢業(yè)后行業(yè)的優(yōu)勢,并且數據集中有“專業(yè)”這一特征,這個點可以滿足。影響薪酬的另一個因素是學歷,從大樣本分布來看,學歷越高薪酬也就越高,這是當前的普遍事實,低學歷者當老板而高學歷者上街討飯的例子畢竟很少見,學歷可以作為薪酬預測的依據。另外,與稍差的學校畢業(yè)的學生相比,好學校畢業(yè)的學生更容易找到高薪的工作,學校的影響力不容忽視,因此也用于薪酬預測的依據。中國地大物博,區(qū)位差異很明顯,同樣性質的工作在東部發(fā)達地區(qū)和西部欠發(fā)達地區(qū),薪酬的差異是很大的,因此在做模型的時候需要考慮區(qū)位差異,訓練數據中的“經度”“緯度”“城區(qū)”“城市”等體現了區(qū)位的特征,可以考慮用于模型中。而從輸入的“學校信息”能夠擴展獲取到學校的等級,如是否是“985/211”等,也可以獲取到學校所在的區(qū)位信息,該區(qū)位信息正好可以用來提供“地區(qū)差異”特征,從而能夠代入方程中進行薪酬的預測。

經過上述分析讀者應該會有清晰的思路,由于篇幅有限,本實驗只提供模型訓練及測試的代碼;模型的部署讀者可自行完成,或許可以在微信公眾號中實現這樣一個有趣并且是有一定數據依據的趣味測試。讀者還可以拓寬思路,加入性格測試、工作態(tài)度測試、左右腦測試、思維靈敏度測試等。

即使確定了是回歸模型,也不能使用PyTorch神經網絡直接做回歸分析,這可以當作入門神經網絡的“Hello Word”程序。先了解神經網絡的結構及基本用法,后面章節(jié)再繼續(xù)深入闡述。

首先回顧數據,從圖1.17中可以發(fā)現,對訓練有用的特征中“學歷編碼”“專業(yè)編碼”“緯度”“經度”“地區(qū)編碼”這5個特征都是類別型數據,類別型數據只對有序的對象編碼,其大小沒有意義,所以不能認為東經123°的薪酬比東經102°的高。像這種類別型數據在回歸處理中一般做One-Hot編碼處理。下面先介紹什么是One-Hot編碼。

以“學歷編碼”為例,該數據中學歷編碼為{1,2,3,4,5,…,10,11,12},是一個從1到12的連續(xù)型序列。這里是脫敏的數據,我們完全可以認為“1”代表的是大學學歷,“2”代表中學學歷,因此編號的大小是不能作為高薪的依據的,需要對其做適當的編碼。直觀來說,One-Hot就是有多少個狀態(tài)就有多少個比特,而且只有一個比特為1,其他全為0的一種碼制。因此,“學歷編碼”的One-Hot編碼如圖1.18所示。

由圖1.18可以看出,學歷編碼“10”的One-Hot編碼為[0 0 0 0 0 0 0 0 0 1 0 0],只有一個位置上的元素為1,其余全部為0。One-Hot編碼格式的轉換可以借助Pandas等數據處理工具。

圖1.18 “學歷編碼”的One-Hot編碼

1.類別型數據的One-Hot編碼

借助Pandas可以快速實現One-Hot編碼,下面分別處理“學歷編碼”“專業(yè)編碼”“緯度”“經度”“地區(qū)編碼”,調用get_dummies方法進行One-Hot編碼。

運行完成后得到的數據如圖1.19所示。

圖1.19 對類別型數據運用One-Hot編碼后的數據

經過One-Hot編碼后,特征從19個上升到328個。特征工程在算法應用的整個過程中是非常關鍵的,消耗的時間也是最多的,一份好的特征決定了模型能達到的上限,所有的模型都是在盡量逼近這個上限。

2.特征的歸一化

類別型數據運用One-Hot編碼后,特征工程的下一步往往是缺失值的處理。缺失值,顧名思義,就是空缺的、沒有的值。對于缺失值一般采用“均值填充”或“中位數填充”,甚至可以訓練一個簡單的模型來擬合缺失值。幸運的是,這份處理后的數據中沒有缺失值,可以不用處理。

另外,特征工程中一個非常重要的操作步驟是特征的歸一化,即將數據進行均值為0、方差為1的轉換。通常,特征的歸一化處理有利于模型快速收斂,增加模型的穩(wěn)定性。歸一化的方法有Min-Max和Z-Score,本節(jié)采用Z-Score做歸一化處理。Z-Score的計算方式如下:

式中,

x1x2x3,…,xn表示特征的原始值,而轉換后的結果y1y2y3,…,yn是均值為0、方差為1的新特征。這里借助Pandas完成“綜合能力”特征的歸一化,因為這個特征相比其他特征“個頭較大”。權重即便是很小的變化,當乘以一個“大塊頭”都將帶來很大的變化,為模型帶來較大的波動,因此選擇“大塊頭”進行歸一化處理。這實際上也是一個堆砌公式的過程,下面是歸一化的實現。

定義方法z_score,傳入series對象,返回新的歸一化之后的series對象,用該對象替換原來的“綜合能力”特征即可。

從輸出結果來看,均值非常接近0,而標準差非常接近1,這正是Z-Score所要達成的目標。用新的“綜合能力”替換原來的,即完成了對數據的處理。通過to_csv保存為新的文件salary_handled.csv。數據預處理就到此為止,特征工程中有很多處理數據的小技巧,如多重共線性的分析、異常值的檢測等。

下面先介紹神經網絡結構,以及如何使用神經網絡完成回歸分析任務。神經網絡包括輸入層、隱藏層和輸出層。現代神經網絡的發(fā)展建立在早期的感知機模型上,涉及的幾個關于感知機的概念如下。

(1)超平面。令w1w2w3,…,wnxi都是實數(R),至少有一個wi不為0,由所有滿足線性方程w1x1+w2x2+w3x3+…+wnxn=y的點X=[x1x2x3,…,xn]組成的集合稱為空間R的超平面。超平面就是集合中的一點X與向量W=[w1w2w3,…,wn]的內積。如果令y=0,對于訓練數據中某個點X做如下分類:

WX=w1x1+w2x2+w3x3+…+wnxn>0,則將X標記為正類。

WX=w1x1+w2x2+w3x3+…+wnxn<0,則將X標記為負類。

(2)線性可分。對于數據集T={(X1,y1),(X2,y2),…,(Xn,yn)},其中,XiRn,yi∈{-1,1},i=1,2,…,N。若存在某個超平面S滿足WX=0,能將數據集中的所有樣本正確分類,則稱數據集線性可分。所謂正確分類,就是WXi>0,則Xi對應的標簽yi=1;若WXi<0,則Xi對應的標簽yi=-1。因此,對于給定的超平面WX=0,數據集T中任何一條數據(Xi,yi),如果滿足yi(WXi)>0,則這些樣本被正確分類;如果某個點(Xi,yi)使yi(WXi)<0則稱超平面對該點分類失敗。

(3)感知機模型。感知機模型的思想很簡單,就是在WX+b的基礎上應用符號函數sign,使正類的預測標簽為1,負類的預測標簽為-1。其形式如下:

f(x)=sign(WX+b)

式中,W是超平面的法向量,b是超平面的截距向量,優(yōu)化的目標就是找到(Wb),將線性可分數據集T盡量正確劃分。找到Wb需要構建優(yōu)化目標,該構建過程前面已有介紹,對于正確分類的點一定滿足yi(WXi)>0,而對錯誤分類的點總是有yi(WXi)<0。我們將注意力集中在錯誤分類的點上,錯誤分類的點到超平面的距離可以表示為

補充一個“-”是為了使距離d是正數。假設所有錯誤分類的點都在集合E中,于是得到整個數據集的損失函數:

最終將尋找Wb的問題轉化為損失函數最小化,即一個最優(yōu)化問題。最后采用梯度下降等優(yōu)化算法便可以找出Wb

感知機模型如圖1.20所示,output=sign(w1x1+w2x2+w3x3+w4x4)。

圖1.20 感知機模型

感知機采用單層線性方程加上sign作為激活函數,使它對線性不可分數據無能為力,上面提到的感知機模型只適合二分類任務,因此這也是感知機模型在工業(yè)界無法使用的原因。1968年馬文·明斯基提出感知機無法解決線性不可分的問題(異或問題),使以感知機模型為代表的神經網絡技術發(fā)展處于“休眠”狀態(tài)。

對于單層感知機無法處理非線性的問題,科學家提出了不同的解決方案。第一種解決方案是增加感知機的層數,并且在數學上證明多層感知機能夠解決任意復雜度的問題,即通過增加網絡的層數解決線性不可分的問題,這也成為后來神經網絡的基礎。第二種解決方案是引入核函數,將低維不可分的數據映射到高維,在核空間進行分類。這一流派成為神經網絡流行之前的“網紅”算法,即SVM。SVM通過不同的核函數將低維數據映射到更加高維的空間中,使樣本變得可分,但這會造成維數過高、計算量過于龐大等問題。

兩種不同的解決方案都取得了巨大的成功。下面介紹的深度神經網絡便脫胎于感知機模型的改進。

3.深度神經網絡

深度神經網絡的前身是感知機模型,對感知機模型做了如下幾方面擴展。

(1)增加隱藏層。隱藏層是輸入層與輸出層中間的網絡層,并且可以有多個隱藏層。這增加了網絡的深度,豐富了網絡的表達能力。圖1.21所示的多層神經網絡有兩個隱藏層(hidden1和hidden2),輸入層有4個神經元,hidden1和hidden2各有3個神經元,最后的輸出層也可以有多個輸出,這樣的改進使神經網絡可以進行多分類任務,而感知機模型只適合二分類任務。

圖1.21 多層神經網絡

(2)修改輸出層。使神經網絡可以有多個輸出,如進行100種圖片的分類,它就是100個類別的多分類任務,因此輸出層有100個結果,每個結果中的數值代表的是對應類別的概率,利用argmax取概率最大的索引對應的類別作為預測的類別。

(3)擴展激活函數。單層感知機的激活函數是sign信號函數,這是一個分段函數,且不連續(xù),因此處理能力有限。在神經網絡中對sign信號函數進行了擴展,引入了很多有效且連續(xù)的激活函數,如ReLU、tanh、Sigmoid、softmax等,通過使用不同的激活函數進一步增強神經網絡的表達能力。

4.深度神經網絡的數學表示

神經網絡是一種模擬大腦神經元工作的數據結構,要參與到數據中進行計算,首先需要進行數學的表示。圖1.22所示的深度神經網絡可分為三大層,分別是輸入層、隱藏層和輸出層。層與層之間是全連接的,也就是說,第i層的任意神經元與第i+1層任意神經元相連,連線表示的是神經元與神經元的權重。雖然神經元看起來很復雜,但是局部結構都是類似的,和前面的感知機一樣,局部仍然是一個線性關系z=∑wixi+b和一個激活函數σz)。

圖1.22 深度神經網絡

以圖1.22所示的深度神經網絡神經元結構為例,b3o2的權重可以表示為,上標4表示第四層神經元,下標23表示第四層的第二個神經元與第三層的第三個神經元相連,將下標反過來表示(下標是23而不是32)是為了便于線性代數的矩陣運算,否則權重需要求一次轉置。

由此可知,表示第k-1層的第b個神經元到第k層的第a個神經元之間的權重,輸入層沒有權重。偏置項b的表示與權重的表示類似。a3的偏置項用表示,上標是所在的網絡層,下標是神經元在層中的索引,這里表示第二層的第三個神經元。

5.深度神經網絡前向傳播的數學原理

下面以圖1.23所示的神經網絡結構為例說明神經網絡前向傳播的數學原理。

圖1.23 神經網絡前向傳播的數學原理

神經元的整體雖然很復雜,但是具有相同的局部特征,仍然是一個線性關系z=∑wixi+b和一個激活函數σ(z)的形式。神經網絡的第一層沒有權重,也沒有偏置項,因此直接看第二層的權重與偏置項的計算過程。對于第二層中a1a2神經元的輸出,有如下所示的數學表達式:

而對于第三層的輸出o1而言,有如下所示的數學表達式:

上面數學表達式中的輸入是第二層輸出的結果,因此xa替換。從上面的數學表達式可以發(fā)現一些規(guī)律:偏置項b的上下標與輸出是一致的;σ激活函數的輸入上下標和偏置項、輸出值的上下標是一致的;每個數學表達式中w的上標保持一致,而下標對應上層每個神經元。將上面的數學表達式一般化,假設第L-1層有m個神經元,第L層有n個神經元,則對于L層的第j個神經元的輸出可表示為如下形式:

上面的公式使用矩陣算法可以使表達式更加簡捷。第L-1層有m個神經元,第L層有n個神經元。將第L層的線性系數w組成一個n×m的矩陣WL,第L層的偏置項b組成一個n×1的向量bL,第L-1層的輸出a組成一個m×1的向量aL-1,第L層未激活前的輸入z組成一個n×1的向量zL,第L層的輸出a組成一個n×1的向量aL。則用矩陣表示為如下形式:

aL=σ(zL)=σ(WLaL-1+bL)

有了上面的矩陣表示,接下來就可以給出深度神經網絡前向傳播算法。

輸入:總層數L,所有隱藏層和輸出層對應的矩陣為W,偏置項對應的向量為b,輸入值向量為x

輸出:輸出層輸出結果向量aL

初始化過程如下。

對于輸入層a1=x

For i=2 to L do:

ai=σ(zi)=σ(Wiai-1+bi)

計算最終的結果即為aL向量。

6.深度神經網絡反向傳播的數學原理

前向傳播完成后會得到輸出結果向量aL,通過與真實數據標簽y進行對比可以構建損失函數,如常見的均方誤差(Mean Squared Error, MSE)損失,由損失函數反向對各層wb求偏導數,進而更新權重參數wb,完成訓練和優(yōu)化。

深度神經網絡反向傳播算法只需要流程上的理解,具體的算法推導過程讀者可以根據自己的精力和時間深入研究與學習。這里只對反向傳播算法的數學原理進行簡單的推導(優(yōu)化算法如梯度下降等,這里只需要知道是用來更新參數的方法即可,具體內容參見第4章)。

由前面的介紹可知,神經網絡的輸出結果為向量aL,和具體的標簽值y進行對比可以得到該次前向傳播的損失。損失函數有很多,如MSELoss、CrossEntropyLoss等。本節(jié)使用MSE來說明BP算法的原理。對于每個樣本,我們期望損失值最小,MSE損失函數如下:

有了損失函數,下面用梯度下降求解每層網絡的權重矩陣W和偏置項向量b。對于輸出層aL=σ(zL)=σ(WLaL-1+bL),代入損失函數有如下形式:

現在只需要針對損失函數中的Wb求偏導數,然后更新權重和偏置項即可完成神經網絡的訓練。

7.使用PyTorch構建神經網絡

前面介紹了神經網絡結構的基礎知識,下面使用PyTorch構建神經網絡。PyTorch對神經網絡中前向傳播、反向傳播、自動微分等復雜的操作進行了封裝,并提供了簡單的接口調用。下面先介紹PyTorch的nn模塊,快速搭建神經網絡。

PyTorch的nn模塊提供了兩種快速搭建神經網絡的方式。第一種是nn.Sequential,將網絡層以序列的方式進行組裝,每個層使用前面層計算的輸出作為輸入,并且在內部會維護層與層之間的權重矩陣及偏置項向量。使用nn.Sequential方式定義模型非常簡單,如下所示的代碼片段定義了一個三層的神經網絡。

輸入層的維度為10,中間隱藏層的維度為20,輸出層的維度為2。中間使用ReLU作為激活函數,與單層感知機中的sign符號函數一樣,ReLU是激活函數的一種,后面章節(jié)會詳細介紹各種不同的激活函數。

另一種常見的搭建神經網絡的方式是繼承nn.Module,需要實現__init__和forward前向傳播兩個方法。同樣,實現上面的三層神經網絡,可以采用繼承nn.Module的方式,具體如下。

采用繼承nn.Module的方式,需要我們自己實現forward方法,forward方法接收輸入網絡的數據x,經過網絡中不同層函數的處理,最后返回線性函數linear2的處理結果作為最終的預測輸出值。

8.定義神經網絡結構

前面處理好的數據共有328列,其中“薪酬”為標簽。將“薪酬”單獨列出,并從數據集DataFrame中刪除,混洗打亂后劃分出訓練集和測試集,使用前20萬條數據作為訓練集,剩下的數據作為測試集。

現在訓練集中特征數量為327,則對應的輸入神經元為327個,借助神經網絡可以將過多的特征進行壓縮,因此設計第一個隱藏層的神經元為100個,第二個隱藏層的神經元為20個,輸出層的神經元為1個(因為是回歸任務,輸出只有一個值)。薪酬預測神經網絡模型結構如圖1.24所示。

圖1.24 薪酬預測神經網絡模型結構

神經網絡實際上是線性方程的組合,相比直接使用327個特征作為線性方程的變量,神經網絡使用多個隱藏層將特征進行壓縮,壓縮后的特征擁有20個維度,維度更低,便于線性方程的求解。

下面使用PyTorch中基于Module的神經網絡的方式搭建該神經網絡,代碼實現如下。

四層神經網絡搭建好之后直接使用SalaryNet便可以實例化一個模型,使用方式為salaryModel=SalaryNet(327,100,20,1)。

有了模型還需要定義損失函數,因為PyTorch優(yōu)化的依據是使損失函數的值最小。這里我們使用MSE損失函數,PyTorch中已經定義好該損失函數,按如下方式使用即可。

有了損失,還需要根據損失進行優(yōu)化,PyTorch實現了很多優(yōu)化器,如梯度下降、Adam等,下面使用Adam優(yōu)化器進行優(yōu)化。

所有優(yōu)化器的輸入基本上都是一樣的,即需要優(yōu)化參數和學習率。這里直接通過salaryModel的parameters方法便可以獲取網絡層中所有需要優(yōu)化的權重矩陣及偏置項,指定學習率為0.001。學習率的設置是很關鍵的,學習率過大,優(yōu)化過程容易出現波動,學習率過小,又會使模型收斂緩慢。學習率設置為0.001是最常見的技巧,后面章節(jié)會介紹其他方式的學習率的設置。

下面開始編寫訓練過程。模型需要多次迭代,而每次完整的迭代被視為一個epoch。在迭代過程中,每次取一批數據進行訓練,記錄每次訓練的損失,用于可視化展示。

訓練過程的代碼如下。

每訓練10次,保留一次Loss,并判斷模型的性能是否有所提升,如果比之前模型的性能有所提升,則使用torch.save將模型保存到model.ckpt文件中,模型訓練過程截圖如圖1.25所示。

圖1.25 模型訓練過程截圖

模型訓練完成后,變量loss_holder所保存的訓練步驟及損失的數據可以用于訓練過程的可視化,借助Matplotlib可以方便快速地進行數據可視化。

xticks方法用于設置x軸上的刻度,整個訓練過程的損失可視化結果如圖1.26所示。

從可視化結果可以看出,大概迭代30 000(3000×10,因為每隔10次保留一次Loss)次,模型損失就趨于平緩,繼續(xù)訓練模型的性能已經沒有太大的提升空間,這個時候其實就可以停止模型的訓練。訓練好的模型保存在model.ckpt文件中,接下來使用訓練好的模型在測試數據集上進行測試,測試代碼如下。

圖1.26 Loss與訓練步驟可視化

將預測值與目標值分別保存在results和targets數組中,用于可視化。如果預測結果results和targets接近,則以result和target分別作為x軸與y軸對應的值,可視化的結果接近于直線y=x。理論上,如果預測完全準確,所有的點都將落在直線y=x上。首先進行可視化數據準備。

借助scatter繪制散點圖,代碼如下。

預測值和目標值的可視化結果如圖1.27所示。

從可視化結果可以看出,在薪酬為20 000之前的數據,預測值和目標值組成的點基本上在直線y=x附近。超過20 000的薪酬預測出現了散亂和波動,而根據實際情況,超過20 000的數據是很少見的,甚至是異常數據,因此模型下一步要優(yōu)化的目標可以放到訓練數據中的“高薪”離群數據進行清洗及整理。這是一個負反饋過程,這個任務讀者可自行嘗試。

至此,“薪酬預測模型”已經全部完成,相信讀者對神經網絡的認識會更加清晰。1.5節(jié)是輕松愉快的“補充營養(yǎng)時間”。

圖1.27 預測值和目標值的可視化結果

主站蜘蛛池模板: 电白县| 大埔县| 江永县| 汾西县| 肇东市| 蛟河市| 青州市| 清涧县| 蒲城县| 融水| 沂源县| 宝丰县| 夏津县| 保德县| 承德县| 旅游| 江北区| 岳普湖县| 靖边县| 琼海市| 盈江县| 连平县| 常熟市| 清苑县| 兰坪| 棋牌| 宝清县| 宁夏| 丰镇市| 盐池县| 荣昌县| 丹东市| 辉南县| 信宜市| 酒泉市| 宣恩县| 玛纳斯县| 景德镇市| 白银市| 阿坝| 阳原县|