Scikit-Learn機器學習介紹(中文翻譯)

Scikit-Learn機器學習介紹(中文翻譯)

Tue Dec 2, 2014

機器學習

scikit-learn

翻譯

Python

翻譯自:http://scikit-learn.org/stable/tutorial/basic/tutorial.html

以后可能會根據(jù)自己的學習慢慢翻譯其他的章節(jié)捂蕴,水平有限,不足之處請指正。

本章內(nèi)容 在本章中奋早,我們會介紹在使用scikit-learn中遇到的機器學習(machine learning)術語徊哑,以及一個簡單的機器學習例子。

機器學習:問題設定

一般來說,機器學習問題可以這樣來理解:我們有n個樣本(sample)的數(shù)據(jù)集嫁审,想要預測未知數(shù)據(jù)的屬性狗准。 如果描述每個樣本的數(shù)字不只一個克锣,比如一個多維的條目(也叫做多變量數(shù)據(jù)(multivariate data)),那么這個樣本就有多個屬性或者特征腔长。 我們可以將學習問題分為以下幾類:

有監(jiān)督學習(unsupervised learning)是指數(shù)據(jù)中包括了我們想預測的屬性袭祟,有監(jiān)督學習問題有以下兩類:

分類(classification):樣本屬于兩個或多個類別,我們希望通過從已標記類別的數(shù)據(jù)學習捞附,來預測未標記數(shù)據(jù)的分類巾乳。例如,識別手寫數(shù)字就是一個分類問題鸟召,其目標是將每個輸入向量對應到有窮的數(shù)字類別胆绊。從另一種角度來思考,分類是一種有監(jiān)督學習的離散(相對于連續(xù))形式欧募,對于n個樣本压状,一方有對應的有限個類別數(shù)量,另一方則試圖標記樣本并分配到正確的類別跟继。

回歸(regression):如果希望的輸出是一個或多個連續(xù)的變量种冬,那么這項任務被稱作*回歸*,比如用年齡和體重的函數(shù)來預測三文魚的長度还栓。

無監(jiān)督學習(unsupervised learning)的訓練數(shù)據(jù)包括了輸入向量X的集合碌廓,但沒有相對應的目標變量。這類問題的目標可以是發(fā)掘數(shù)據(jù)中相似樣本的分組剩盒,被稱作聚類(Clustering)谷婆;也可以是確定輸入樣本空間中的數(shù)據(jù)分布,被稱作密度估計(density estimation);還可以是將數(shù)據(jù)從高維空間投射到兩維或三維空間辽聊,以便進行數(shù)據(jù)可視化纪挎。這里是Scikit-Learn的無監(jiān)督學習主頁。

訓練集和測試集 機器學習是關于如何從數(shù)據(jù)學習到一些屬性并且用于新的數(shù)據(jù)集跟匆。這也是為什么機器學習中評估算法的一個習慣做法是將手頭已有的數(shù)據(jù)集分成兩部分:一部分我們稱作訓練集(training set)异袄,用來學習數(shù)據(jù)的屬性;另一部分叫做測試集(testing set)玛臂,用來測試這些屬性烤蜕。

加載樣例數(shù)據(jù)集

scikit-learn有一些標準數(shù)據(jù)集封孙,比如用于分類的irisdigits數(shù)據(jù)集,和用于回歸的波士頓房價(boston house prices)數(shù)據(jù)集讽营。 下面虎忌,我們會用shell里的Python解釋器來加載iris和digits數(shù)據(jù)集。$表示shell提示符橱鹏,>>>表示Python解釋器提示符:

$python

>>>from sklearn import datasets

>>>iris = datasets.load_iris()

>>>digits = datasets.load_digits()

數(shù)據(jù)集類似字典對象膜蠢,包括了所有的數(shù)據(jù)和關于數(shù)據(jù)的元數(shù)據(jù)(metadata)。數(shù)據(jù)被存儲在.data成員內(nèi)莉兰,是一個n_samples*n_features的數(shù)組挑围。在有監(jiān)督問題的情形下,一個或多個因變量(response variables)被儲存在.target成員中糖荒。有關不同數(shù)據(jù)集的更多細節(jié)可以在這里被找到杉辙。 例如,在digits數(shù)據(jù)集中寂嘉,digits.data是可以用來分類數(shù)字樣本的特征:

>>>print(digits.data)? #doctest: +NORMALIZE_WHITESPACE[[? 0.? 0.? 5. ...,? 0.? 0.? 0.][? 0.? 0.? 0. ...,? 10.? 0.? 0.][? 0.? 0.? 0. ...,? 16.? 9.? 0.]...,[? 0.? 0.? 1. ...,? 6.? 0.? 0.][? 0.? 0.? 2. ...,? 12.? 0.? 0.][? 0.? 0.? 10. ...,? 12.? 1.? 0.]]

digits.target給出了digits數(shù)據(jù)集的真實值奏瞬,即每個數(shù)字圖案對應的我們想預測的真實數(shù)字:

>>>digits.target? array([0,1,2, ...,8,9,8])

數(shù)據(jù)數(shù)組的形式 數(shù)據(jù)是一個2維n_samples*n_features的數(shù)組,盡管原始數(shù)據(jù)集可能會有不同的形式泉孩。在digits數(shù)據(jù)集中,每個原始樣本是一個8*8的數(shù)組并淋,可以用以下方式訪問:

>>>digits.images[0]array([[? 0.,? 0.,? 5.,? 13.,? 9.,? 1.,? 0.,? 0.],[? 0.,? 0.,? 13.,? 15.,? 10.,? 15.,? 5.,? 0.],[? 0.,? 3.,? 15.,? 2.,? 0.,? 11.,? 8.,? 0.],[? 0.,? 4.,? 12.,? 0.,? 0.,? 8.,? 8.,? 0.],[? 0.,? 5.,? 8.,? 0.,? 0.,? 9.,? 8.,? 0.],[? 0.,? 4.,? 11.,? 0.,? 1.,? 12.,? 7.,? 0.],[? 0.,? 2.,? 14.,? 5.,? 10.,? 12.,? 0.,? 0.],[? 0.,? 0.,? 6.,? 13.,? 10.,? 0.,? 0.,? 0.]])

這個簡單的例子說明了如何從原始問題里將數(shù)據(jù)形式化寓搬,以便scikit-learn使用。

學習和預測

在digits數(shù)據(jù)集中县耽,我們的任務是給定一個圖案句喷,預測其表示的數(shù)字是什么。我們的樣本有10個可能的分類(數(shù)字0到9)兔毙,我們將擬合一個預測器(estimator)來預測(predict)未知樣本所屬的分類唾琼。 在scikit-learn中,分類的預測器是一個Python對象澎剥,來實現(xiàn)fit(X, y)和predict(T)方法锡溯。 下面這個預測器的例子是classsklearn.svm.SVC,實現(xiàn)了支持向量機分類哑姚。創(chuàng)建分類器需要模型參數(shù)祭饭,但現(xiàn)在,我們暫時先將預測器看作是一個黑盒:

>>>from sklearn import svm

>>>clf = svm.SVC(gamma=0.001,C=100.)

選擇模型參數(shù) 在這個例子里我們手動設置了gamma值叙量〕可以通過這些工具例如網(wǎng)格搜索(grid search)和交叉驗證(cross validation)來自動找到參數(shù)的最佳取值。

給預測器取個名字叫做clf(claasifier)〗逝澹現(xiàn)在預測器必須來擬合(fit)模型寺鸥,也就是說猪钮,它必須從模型中學習(learn)。這個過程是通過將訓練集傳遞給fit方法來實現(xiàn)的胆建。我們將除了最后一個樣本的數(shù)據(jù)全部作為訓練集烤低。通過Python語法

? ? 來選擇訓練集,這會生成一個新的數(shù)組眼坏,包含了除最后一個條目的digits.data:

>>> clf.fit(digits.data[:-1], digits.target[:-1])# doctest: +NORMALIZE_WHITESPACESVC(C=100.0, cache_size=200, class_weight=None, coef0=0.0, degree=3,? ? gamma=0.001, kernel='rbf', max_iter=-1, probability=False,? ? random_state=None, shrinking=True, tol=0.001, verbose=False)

現(xiàn)在你可以預測新值了拂玻,具體來說,我們可以詢問分類器宰译,digits數(shù)據(jù)集里最后一個圖案所代表的數(shù)字是什么檐蚜,我們并沒有用最后一個數(shù)據(jù)來訓練分類器。

>>>clf.predict(digits.data[-1])array([8])

最一個圖案如下:

如你所見沿侈,這項任務很具有挑戰(zhàn)性:這個圖案的分辨率很差闯第。你能和分類器得到一致結果嗎? 一個更復雜的分類問題的例子在這里:識別手寫數(shù)字(Recognizing hand-written digits)缀拭,供學習參考咳短。

模型持久性(Model persistence)

可以采用Python內(nèi)建的持久性模型pickle來保存scikit的模型:

>>>from sklearn import svm

>>>from sklearn import datasets

>>>clf = svm.SVC()

>>>iris = datasets.load_iris()

>>>X, y = iris.data, iris.target

>>>clf.fit(X, y)# doctest: +NORMALIZE_WHITESPACESVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0,? ? kernel='rbf', max_iter=-1, probability=False, random_state=None,? ? shrinking=True, tol=0.001, verbose=False)

>>>import pickle

>>>s = pickle.dumps(clf)

>>>clf2 = pickle.loads(s)

>>>clf2.predict(X[0])? array([0])

>>>y[0]0

在scikit的特定情形下,用joblib’s來代替pickle(joblib.dump&joblib.load)會更吸引人蛛淋,在大數(shù)據(jù)下效率更高咙好,但只能pickle到磁盤而不是字符串:

>>>from sklearn.externals import joblib

>>>joblib.dump(clf,'filename.pkl')# doctest: +SKIP

你可以在之后重新加載pickled模型(可以在另一個Python程序里):

>>>clf = joblib.load('filename.pkl')# doctest:+SKIP

注意: joblib.dump返回一個文件名列表。每個包含在clf對象中獨立的numpy數(shù)組是在文件系統(tǒng)中是按順序排列的一個獨立文件褐荷。當用joblib.load重新加載模型時勾效,所有文件必須在同一個目錄下。

注意pickle有一些安全性和維護性問題叛甫。請參考模型持久性章節(jié)獲得更多關于scikit-learn模型持久性的信息层宫。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市其监,隨后出現(xiàn)的幾起案子萌腿,更是在濱河造成了極大的恐慌,老刑警劉巖抖苦,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件毁菱,死亡現(xiàn)場離奇詭異,居然都是意外死亡睛约,警方通過查閱死者的電腦和手機鼎俘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辩涝,“玉大人贸伐,你說我怎么就攤上這事≌” “怎么了捉邢?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵脯丝,是天一觀的道長。 經(jīng)常有香客問我伏伐,道長宠进,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任藐翎,我火速辦了婚禮材蹬,結果婚禮上,老公的妹妹穿的比我還像新娘吝镣。我一直安慰自己堤器,他們只是感情好,可當我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布末贾。 她就那樣靜靜地躺著闸溃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拱撵。 梳的紋絲不亂的頭發(fā)上辉川,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天,我揣著相機與錄音拴测,去河邊找鬼乓旗。 笑死,一個胖子當著我的面吹牛集索,可吹牛的內(nèi)容都是我干的寸齐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼抄谐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了扰法?” 一聲冷哼從身側響起蛹含,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎塞颁,沒想到半個月后浦箱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡祠锣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年酷窥,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伴网。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡蓬推,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出澡腾,到底是詐尸還是另有隱情沸伏,我是刑警寧澤糕珊,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站毅糟,受9級特大地震影響红选,放射性物質發(fā)生泄漏。R本人自食惡果不足惜姆另,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一喇肋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧迹辐,春花似錦蝶防、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至贺喝,卻和暖如春菱鸥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背躏鱼。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工氮采, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人染苛。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓鹊漠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親茶行。 傳聞我的和親對象是個殘疾皇子躯概,可洞房花燭夜當晚...
    茶點故事閱讀 45,455評論 2 359

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