【scikit-learn】用Python進(jìn)行機(jī)器學(xué)習(xí)實(shí)驗(yàn)

概要

本文是用Python編程語(yǔ)言來進(jìn)行機(jī)器學(xué)習(xí)小實(shí)驗(yàn)的第一篇螃诅。主要內(nèi)容如下:

  1. 讀入數(shù)據(jù)并清洗數(shù)據(jù)
  2. 探索理解輸入數(shù)據(jù)的特點(diǎn)
  3. 分析如何為學(xué)習(xí)算法呈現(xiàn)數(shù)據(jù)
  4. 選擇正確的模型和學(xué)習(xí)算法
  5. 評(píng)估程序表現(xiàn)的準(zhǔn)確性

讀入數(shù)據(jù) Reading the data

當(dāng)讀入數(shù)據(jù)時(shí)鸿脓,你將面臨處理無效或丟失數(shù)據(jù)的問題祟霍,好的處理方式相比于精確的科學(xué)來說,更像是一種藝術(shù)斧蜕。因?yàn)檫@部分處理適當(dāng)可以適用于更多的機(jī)器學(xué)習(xí)算法并因此提高成功的概率阔墩。

用NumPy有效地咀嚼數(shù)據(jù),用SciPy智能地吸收數(shù)據(jù)

Python是一個(gè)高度優(yōu)化的解釋性語(yǔ)言松捉,在處理數(shù)值繁重的算法方面要比C等語(yǔ)言慢很多,那為什么依然有很多科學(xué)家和公司在計(jì)算密集的領(lǐng)域?qū)①€注下在Python上呢馆里?因?yàn)镻ython可以很容易地將數(shù)值計(jì)算任務(wù)分配給C或Fortran這些底層擴(kuò)展隘世。其中NumPy和SciPy就是其中代表。
NumPy提供了很多有效的數(shù)據(jù)結(jié)構(gòu)鸠踪,比如array丙者,而SciPy提供了很多算法來處理這些arrays。無論是矩陣操作慢哈、線性代數(shù)蔓钟、最優(yōu)化問題、聚類卵贱,甚至快速傅里葉變換滥沫,該工具箱都可以滿足需求侣集。


讀入數(shù)據(jù)操作

這里我們以網(wǎng)頁(yè)點(diǎn)擊數(shù)據(jù)為例,第一維屬性是小時(shí)兰绣,第二維數(shù)據(jù)是點(diǎn)擊個(gè)數(shù)世分。

import scipy as sp
data = sp.genfromtxt('web_traffic.tsv', delimiter='\t')

預(yù)處理和清洗數(shù)據(jù)

當(dāng)你準(zhǔn)備好了你的數(shù)據(jù)結(jié)構(gòu)用于存儲(chǔ)處理數(shù)據(jù)后,你可能需要更多的數(shù)據(jù)來確保預(yù)測(cè)活動(dòng)缀辩,或者擁有了很多數(shù)據(jù)臭埋,你需要去思考如何更好的進(jìn)行數(shù)據(jù)采樣。
在將原始數(shù)據(jù)(raw data)進(jìn)行訓(xùn)練之前臀玄,對(duì)數(shù)據(jù)進(jìn)行提煉可以起到很好的作用瓢阴,有時(shí),一個(gè)用提煉的數(shù)據(jù)的簡(jiǎn)單的算法要比使用原始數(shù)據(jù)的高級(jí)算法的表現(xiàn)效果要好健无。這個(gè)工作流程被稱作特征工程(feature engineering)荣恐。Creative and intelligent that you are, you will immediately see the results。

由于數(shù)據(jù)集中可能還有無效數(shù)值(nan)累贤,我們可以事先看一下無效值的個(gè)數(shù):

hours = data[:,0]
hits = data[:,1]
sp.sum(sp.isnan(hits))

用下面的方法將其過濾掉:

#cleaning the data
hours = hours[~sp.isnan(hits)]
hits = hits[~sp.isnan(hits)]

為了將數(shù)據(jù)給出一個(gè)直觀的認(rèn)識(shí)叠穆,用Matplotlib的pyplot包來將數(shù)據(jù)呈現(xiàn)出來。

import matplotlib.pyplot as plt
plt.scatter(hours,hits)
plt.title("Web traffic over the last month")
plt.xlabel("Time")
plt.ylabel("Hits/hour")
plt.xticks([w*7*24 for w in range(10)],
 ['week %i'%w for w in range(10)])
plt.autoscale(tight=True)
plt.grid()
plt.show()

其顯示效果如下:


選擇合適的學(xué)習(xí)算法

選擇一個(gè)好的學(xué)習(xí)算法并不是從你的工具箱中的三四個(gè)算法中挑選這么簡(jiǎn)單臼膏,實(shí)際上有更多的算法你可能沒有見過硼被。所以這是一個(gè)權(quán)衡不同的性能和功能需求的深思熟慮的過程,比如執(zhí)行速度和準(zhǔn)確率的權(quán)衡渗磅,,可擴(kuò)展性和易用性的平衡嚷硫。

現(xiàn)在,我們已經(jīng)對(duì)數(shù)據(jù)有了一個(gè)直觀的認(rèn)識(shí)夺溢,我們接下來要做的是找到一個(gè)真實(shí)的模型论巍,并且能推斷未來的數(shù)據(jù)走勢(shì)烛谊。

用逼近誤差(approximation error)來選擇模型

在很多模型中選擇一個(gè)正確的模型风响,我們需要用逼近誤差來衡量模型預(yù)測(cè)性能,并用來選擇模型丹禀。這里状勤,我們用預(yù)測(cè)值和真實(shí)值差值的平方來定義度量誤差:

def error(f, x, y):
    return sp.sum((f(x)-y)**2)

其中f表示預(yù)測(cè)函數(shù)。

用簡(jiǎn)單直線來擬合數(shù)據(jù)

我們現(xiàn)在假設(shè)該數(shù)據(jù)的隱含模型是一條直線双泪,那么我們還如何去擬合這些數(shù)據(jù)來使得逼近誤差最小呢持搜?
SciPy的polyfit()函數(shù)可以解決這個(gè)問題,給出x和y軸的數(shù)據(jù)焙矛,還有參數(shù)order(直線的order是1)葫盼,該函數(shù)給出最小化逼近誤差的模型的參數(shù)。

fp1, residuals, rank, sv, rcond = sp.polyfit(hours, hits, 1, full=True)

fp1是polyfit函數(shù)返回模型參數(shù)村斟,對(duì)于直線來說贫导,它是直線的斜率和截距抛猫。
如果polyfit的參數(shù)full為True的話,將得到擬合過程中更多有用的信息孩灯,這里只有residuals是我們感興趣的闺金,它正是該擬合直線的逼近誤差。
然后將該線在圖中畫出來:

#fit straight line model
fp1, residuals, rank, sv, rcond = sp.polyfit(hours, hits, 1, full=True)
fStraight = sp.poly1d(fp1)

#draw fitting straight line
fx = sp.linspace(0,hours[-1], 1000) # generate X-values for plotting
plt.plot(fx, fStraight(fx), linewidth=4)
plt.legend(["d=%i" % fStraight.order], loc="upper left")

用更高階的曲線來擬合數(shù)據(jù)

用直線的擬合是不是很好呢峰档?用直線擬合的誤差是317,389,767.34败匹,這說明我們的預(yù)測(cè)結(jié)果是好還是壞呢?
我們不妨用更高階的曲線來擬合數(shù)據(jù)讥巡,看是不是能得到更好的效果掀亩。

fCurve3p = sp.polyfit(hours, hits, 3)
fCurve3 = sp.poly1d(fCurve3p)
print "Error of Curve3 line:",error(fCurve3,hours,hits)

fCurve10p = sp.polyfit(hours, hits, 10)
fCurve10 = sp.poly1d(fCurve10p)
print "Error of Curve10 line:",error(fCurve10,hours,hits)

fCurve50p = sp.polyfit(hours, hits, 50)
fCurve50 = sp.poly1d(fCurve50p)
print "Error of Curve50 line:",error(fCurve50,hours,hits)

其逼近誤差為:

Error of straight line: 317389767.34
Error of Curve2 line: 179983507.878
Error of Curve3 line: 139350144.032
Error of Curve10 line: 121942326.364
Error of Curve50 line: 109504587.153


這里我們進(jìn)一步看一下實(shí)驗(yàn)結(jié)果,看看我們的預(yù)測(cè)曲線是不是很好的擬合數(shù)據(jù)了呢欢顷?尤其是看一下多項(xiàng)式的階數(shù)從10到50的過程中归榕,模型與數(shù)據(jù)貼合太緊,這樣模型不但是去擬合數(shù)據(jù)背后的模型吱涉,還去擬合了噪聲數(shù)據(jù)刹泄,導(dǎo)致曲線震蕩劇烈,這種現(xiàn)象叫做過擬合怎爵。

小結(jié)

從上面的小實(shí)驗(yàn)中特石,我們可以看出,如果是直線擬合的話就太簡(jiǎn)單了鳖链,但多項(xiàng)式的階數(shù)從10到50的擬合又太過了姆蘸,那么是不是2、3階的多項(xiàng)式就是最好的答案呢芙委?但我們同時(shí)發(fā)現(xiàn)逞敷,如果我們以它們作為預(yù)測(cè)的話,那它們又會(huì)無限制增長(zhǎng)下去灌侣。所以蜻展,我們最后反省一下,看來我們還是沒有真正地理解數(shù)據(jù)喇聊。

衡量性能指標(biāo)

作為一個(gè)ML的初學(xué)者泪蔫,在衡量學(xué)習(xí)器性能方面會(huì)遇到很多問題或錯(cuò)誤。如果是拿你的訓(xùn)練數(shù)據(jù)來進(jìn)行測(cè)試的話痊乾,這可能是一個(gè)很簡(jiǎn)單的問題皮壁;而當(dāng)你遇到的不平衡的訓(xùn)練數(shù)據(jù)時(shí),數(shù)據(jù)就決定了預(yù)測(cè)的成功與否哪审。

回看數(shù)據(jù)

我們?cè)僮屑?xì)分析一下數(shù)據(jù)蛾魄,看一下再week3到week4之間,好像是有一個(gè)明顯的拐點(diǎn),所以我們把week3.5之后的數(shù)據(jù)分離出來滴须,訓(xùn)練一條新的曲線缴川。

inflection = 3.5*7*24 #the time of week3.5 is an inflection
time1 = hours[:inflection]
value1 = hits[:inflection]
time2 = hours[inflection:]
value2 = hits[inflection:]

fStraight1p = sp.polyfit(time1,value1,1)
fStraight1 = sp.poly1d(fStraight1p)
fStraight2p = sp.polyfit(time2,value2,1)
fStraight2 = sp.poly1d(fStraight2p)

顯然,這兩條直線更好的描述了數(shù)據(jù)的特征描馅,雖然其逼近誤差還是比那些高階多項(xiàng)式曲線的誤差要大把夸,但是這種方式的擬合可以更好的獲取數(shù)據(jù)的發(fā)展趨勢(shì)。相對(duì)于高階多項(xiàng)式曲線的過擬合現(xiàn)象铭污,對(duì)于低階的曲線恋日,由于沒有很好的描述數(shù)據(jù),而導(dǎo)致欠擬合的情形嘹狞。所以為了更好的描述數(shù)據(jù)特征岂膳,使用2階曲線來擬合數(shù)據(jù),來避免過擬合和欠擬合現(xiàn)象的發(fā)生磅网。

訓(xùn)練與測(cè)試

我們訓(xùn)練得到了一個(gè)模型谈截,這里就是我們擬合的兩個(gè)曲線。為了驗(yàn)證我們訓(xùn)練的模型是否準(zhǔn)確涧偷,我們可以在最初訓(xùn)練時(shí)將一部分訓(xùn)練數(shù)據(jù)拿出來簸喂,當(dāng)做測(cè)試數(shù)據(jù)來使用,而不僅僅通過逼近誤差來判別模型好壞燎潮。

總結(jié)

這一小節(jié)作為機(jī)器學(xué)習(xí)小實(shí)驗(yàn)的引入喻鳄,主要傳遞兩點(diǎn)意思:
1、要訓(xùn)練一個(gè)學(xué)習(xí)器确封,必須理解和提煉數(shù)據(jù)除呵,將注意力從算法轉(zhuǎn)移到數(shù)據(jù)上
2、學(xué)習(xí)如何進(jìn)行機(jī)器學(xué)習(xí)實(shí)驗(yàn)爪喘,不要混淆訓(xùn)練和測(cè)試數(shù)據(jù)
未來颜曾,我將加快速度,學(xué)習(xí)并實(shí)踐秉剑。

參考文獻(xiàn)

Building Machine Learning Systems with Python. Richert泛豪,W . Coelho,L P

轉(zhuǎn)載請(qǐng)注明作者Jason Ding及其出處
Github主頁(yè)(http://jasonding1354.github.io/)
CSDN博客(http://blog.csdn.net/jasonding1354)
簡(jiǎn)書主頁(yè)(http://www.reibang.com/users/2bd9b48f6ea8/latest_articles)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市秃症,隨后出現(xiàn)的幾起案子候址,更是在濱河造成了極大的恐慌,老刑警劉巖种柑,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異匹耕,居然都是意外死亡聚请,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驶赏,“玉大人炸卑,你說我怎么就攤上這事∶喊” “怎么了盖文?”我有些...
    開封第一講書人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蚯姆。 經(jīng)常有香客問我五续,道長(zhǎng),這世上最難降的妖魔是什么龄恋? 我笑而不...
    開封第一講書人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任疙驾,我火速辦了婚禮,結(jié)果婚禮上郭毕,老公的妹妹穿的比我還像新娘它碎。我一直安慰自己,他們只是感情好显押,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開白布扳肛。 她就那樣靜靜地躺著,像睡著了一般乘碑。 火紅的嫁衣襯著肌膚如雪敞峭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,245評(píng)論 1 299
  • 那天蝉仇,我揣著相機(jī)與錄音旋讹,去河邊找鬼。 笑死轿衔,一個(gè)胖子當(dāng)著我的面吹牛沉迹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播害驹,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鞭呕,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了宛官?” 一聲冷哼從身側(cè)響起葫松,我...
    開封第一講書人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎底洗,沒想到半個(gè)月后腋么,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡亥揖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年珊擂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了圣勒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡摧扇,死狀恐怖圣贸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扛稽,我是刑警寧澤吁峻,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站在张,受9級(jí)特大地震影響用含,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瞧掺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一耕餐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辟狈,春花似錦肠缔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至壹蔓,卻和暖如春趟妥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背佣蓉。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工披摄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人勇凭。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓疚膊,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親虾标。 傳聞我的和親對(duì)象是個(gè)殘疾皇子寓盗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容