人工智慧通識-程式設計-機器學習演算法的思路評估
歡迎關注我的專欄( つ•̀ω•́)つ【人工智慧通識】
接著前一篇文章 房屋建議租金機器學習演算法思路 繼續分析,這次我們著重思考怎麼評估我們的演算法。
方法分析
的值,大約是34,但是這個暴力隨機的方法好不好?
評估一個演算法可以從幾個方面考慮:
- 演算法的結果準不準,不管白貓黑貓,抓到老師就好貓。
- 演算法的訓練train的速度快不快,效能好不好,一年只抓到一隻老鼠的也不是好貓。
- 演算法是不是可以被理解,如果自家的貓只要一念咒語就會出現一隻死老鼠,這樣的貓也太恐怖了。

第2點效能評估容易,只要在train函式加入時間輸出就可以了,如果進一步考慮的話可以跟蹤輸出cost值的下降曲線,看它是否能比較快的到達最終結果,畢竟最後那些+0.1又-0.1來回震盪的時間沒啥意義。
第3點可理解性也不難,畢竟演算法是我們自己寫的,絕大多數時候我們自己還是可以解釋清楚貓是怎麼抓老鼠的,比如我們這個暴力靠近的方法中間沒有任何魔法。
第1點稍微麻煩些,怎麼知道34這個結果是不是足夠好?很簡單,用用就知道,我們用這個34來預測些未知的房屋面積,看看是不是靠譜,有多靠譜就好了。
效能評估
我們準備用plotly把100次迴圈中cost下降的情況繪製出來,下面的程式碼執行繪圖:
import plotly.offline as py import plotly.graph_objs as go py.init_notebook_mode() costData=go.Scatter( x=[n for n in range(100)], y=[0 for n in range(100)], ) costLayout = go.Layout( title='Cost下降曲線', autosize=False, width=500, height=500, xaxis=dict( autorange=False, range=(0, 100), dtick=10, showline=True, mirror='ticks', title='Loops', rangemode='tozero' ), yaxis=dict( autorange=True, showline=True, mirror='ticks', title='Costs', rangemode='tozero' ), ) costFig = go.FigureWidget([costData],costLayout) costFig train()
如果執行這個程式碼會出現一個圖:

這是因為我們沒有在 train
函式中更新繪圖資料。
修改上面的 train
函式:
import time def train(): start = time.time() lastA = 1 lastCost = 0 learnRate = 1 for i in range(100): newA = lastA + learnRate newCost = getCost(newA) if newCost > lastCost: learnRate = learnRate * (-1) lastCost = newCost lastA = newA #更新costFig dataY = list(costFig.data[0]['y']) dataY[i] = newCost costFig.data[0]['y'] = dataY end = time.time() print('>耗時:{}毫秒 '.format(end - start)) return newA
執行得到:

可以從圖中看到33次左右之後cost價值就不再降低,也就是已經達到最優值34左右了,整個耗時4.34秒,但其中大部分時間(30多次之後)純粹是在做無意義的震盪。
沒有對比就沒有傷害,初來乍到的我們目前還不好說這個演算法的效能是否夠好,但是,可以把這個作為一個參考,在此基礎上進行優化。
精準度評估
我們的模型 是否好用?我們需要用事實來檢測,我們的模型只使用了100個樣本進行訓練,我們可以拿另外100個樣本讓它來評估一下,給出推薦租金,然後我們再對比這個推薦租金和真實租金之間的差距,可要把它作為模型的精準度。
評估函式及執行評估 程式碼:
def evaluate(a): cost_li=[] for n in range(0,100): item=df.loc[n] area=float(item['area']) predict=a*area offset=float(item['money'])-predict cost_li.append(offset) return cost_li evalLi=evaluate(34.8)
對評估結果繪圖。
import random import plotly.offline as py import plotly.graph_objs as go py.init_notebook_mode() evalData=go.Scatter( x=[n for n in range(100)], y=[evalLi[i] for iin range(len(evalLi))], ) evalLayout = go.Layout( title='預測評估', autosize=False, width=500, height=500, xaxis=dict( autorange=False, range=(0, 100), dtick=10, showline=True, mirror='ticks', title='Loops', rangemode='tozero' ), yaxis=dict( autorange=False, range=(-10000, 10000), showline=True, mirror='ticks', title='Offsets', ), ) evalFig = go.FigureWidget([evalData],evalLayout) evalFig print('平均偏差:{}'.format(sum(evalLi)/len(evalLi)))
對於100~200之間的樣本預測,得到很大的偏差-512,差距很大。而且分佈非常不均勻,很多片場都超過正負1000,就是預測租金和實際租金相差超過1000元,這個還是很糟糕的。

如果我們改為預測0~100個樣本(就是train也使用的這個樣本範圍),那麼平均偏差只有-300左右,還是可以的。
你可以嘗試調整更多引數,不同的樣本範圍、不同的a值進行測試。更多的進一步修正我們後續慢慢改進。
恭祝各位除夕快樂!預祝大家新的一年,萬事如意,訓練速度越來越快,模型精度越來越高ヽ(✿゚▽゚)ノ!!
歡迎關注我的專欄( つ•̀ω•́)つ【人工智慧通識】
每個人的智慧新時代
如果您發現文章錯誤,請不吝留言指正;
如果您覺得有用,請點喜歡;
如果您覺得很有用,歡迎轉載~
END