歡迎關注我的專欄( つ??ω??)つ【人工智能通識】
接著前一篇文章房屋建議租金機器學習算法思路繼續(xù)分析似枕,這次我們著重思考怎么評估我們的算法盖淡。
方法分析
上一篇我們用隨機暴力試探得到中
的值,大約是34凿歼,但是這個暴力隨機的方法好不好褪迟?
評估一個算法可以從幾個方面考慮:
- 算法的結果準不準,不管白貓黑貓答憔,抓到老鼠就好貓味赃。
- 算法的訓練train的速度快不快,性能好不好虐拓,一年只抓到一只老鼠的也不是好貓心俗。
- 算法是不是可以被理解,如果自家的貓只要一念咒語就會出現(xiàn)一只死老鼠蓉驹,這樣的貓也太恐怖了城榛。
第2點性能評估容易,只要在train函數(shù)加入時間輸出就可以了态兴,如果進一步考慮的話可以跟蹤輸出cost值的下降曲線吠谢,看它是否能比較快的到達最終結果,畢竟最后那些+0.1又-0.1來回震蕩的時間沒啥意義诗茎。
第3點可理解性也不難工坊,畢竟算法是我們自己寫的献汗,絕大多數(shù)時候我們自己還是可以解釋清楚貓是怎么抓老鼠的,比如我們這個暴力靠近的方法中間沒有任何魔法王污。
第1點稍微麻煩些罢吃,怎么知道34這個結果是不是足夠好?很簡單昭齐,用用就知道尿招,我們用這個34來預測些未知的房屋面積,看看是不是靠譜阱驾,有多靠譜就好了就谜。
性能評估
我們準備用plotly把100次循環(huán)中cost下降的情況繪制出來,下面的代碼執(zhí)行繪圖:
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()
如果執(zhí)行這個代碼會出現(xiàn)一個圖:
這是因為我們沒有在train
函數(shù)中更新繪圖數(shù)據(jù)里覆。
修改上面的train
函數(shù):
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價值就不再降低丧荐,也就是已經(jīng)達到最優(yōu)值34左右了,整個耗時4.34秒喧枷,但其中大部分時間(30多次之后)純粹是在做無意義的震蕩虹统。
沒有對比就沒有傷害,初來乍到的我們目前還不好說這個算法的性能是否夠好隧甚,但是车荔,可以把這個作為一個參考,在此基礎上進行優(yōu)化戚扳。
精準度評估
我們的模型是否好用忧便?我們需要用事實來檢測,我們的模型只使用了100個樣本進行訓練帽借,我們可以拿另外100個樣本讓它來評估一下茬腿,給出推薦租金,然后我們再對比這個推薦租金和真實租金之間的差距宜雀,可以把它作為模型的精準度切平。
評估函數(shù)及執(zhí)行評估代碼:
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 i in 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左右,還是可以的覆旭。
你可以嘗試調整更多參數(shù)退子,不同的樣本范圍岖妄、不同的a值進行測試。更多的進一步修正我們后續(xù)慢慢改進寂祥。
恭祝各位除夕快樂荐虐!預祝大家新的一年,萬事如意丸凭,訓練速度越來越快福扬,模型精度越來越高ヽ(???)ノ!惜犀!
歡迎關注我的專欄( つ??ω??)つ【人工智能通識】
每個人的智能新時代
如果您發(fā)現(xiàn)文章錯誤铛碑,請不吝留言指正;
如果您覺得有用虽界,請點喜歡汽烦;
如果您覺得很有用,歡迎轉載~
END