Scikit-Learn機(jī)器學(xué)習(xí)介紹(中文翻譯)

Scikit-Learn機(jī)器學(xué)習(xí)介紹(中文翻譯)2014-12-02?

轉(zhuǎn)自:http://nanshu.wang/%E8%98%85%E8%8A%9C/scikit-learn-docs-translation-1/

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

本章內(nèi)容

在本章中厂财,我們會介紹在使用scikit-learn中遇到的機(jī)器學(xué)習(xí)(machine learning)術(shù)語省店,以及一個簡單的機(jī)器學(xué)習(xí)例子测蘑。

機(jī)器學(xué)習(xí):問題設(shè)定

一般來說,機(jī)器學(xué)習(xí)問題可以這樣來理解:我們有n個樣本(sample)的數(shù)據(jù)集,想要預(yù)測未知數(shù)據(jù)的屬性寡壮。如果描述每個樣本的數(shù)字不只一個视粮,比如一個多維的條目(也叫做多變量數(shù)據(jù)(multivariate data))采桃,那么這個樣本就有多個屬性或者特征

我們可以將學(xué)習(xí)問題分為以下幾類:

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

分類(classification):樣本屬于兩個或多個類別啤它,我們希望通過從已標(biāo)記類別的數(shù)據(jù)學(xué)習(xí),來預(yù)測未標(biāo)記數(shù)據(jù)的分類。例如变骡,識別手寫數(shù)字就是一個分類問題离赫,其目標(biāo)是將每個輸入向量對應(yīng)到有窮的數(shù)字類別。從另一種角度來思考塌碌,分類是一種有監(jiān)督學(xué)習(xí)的離散(相對于連續(xù))形式渊胸,對于n個樣本,一方有對應(yīng)的有限個類別數(shù)量台妆,另一方則試圖標(biāo)記樣本并分配到正確的類別翎猛。

回歸(regression):如果希望的輸出是一個或多個連續(xù)的變量,那么這項(xiàng)任務(wù)被稱作回歸接剩,比如用年齡和體重的函數(shù)來預(yù)測三文魚的長度切厘。

無監(jiān)督學(xué)習(xí)(unsupervised learning)的訓(xùn)練數(shù)據(jù)包括了輸入向量X的集合,但沒有相對應(yīng)的目標(biāo)變量懊缺。這類問題的目標(biāo)可以是發(fā)掘數(shù)據(jù)中相似樣本的分組疫稿,被稱作聚類(Clustering);也可以是確定輸入樣本空間中的數(shù)據(jù)分布鹃两,被稱作密度估計(jì)(density estimation);還可以是將數(shù)據(jù)從高維空間投射到兩維或三維空間遗座,以便進(jìn)行數(shù)據(jù)可視化。這里是Scikit-Learn的無監(jiān)督學(xué)習(xí)主頁怔毛。

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

scikit-learn有一些標(biāo)準(zhǔn)數(shù)據(jù)集员萍,比如用于分類的irisdigits數(shù)據(jù)集,和用于回歸的波士頓房價(jià)(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ù)和關(guān)于數(shù)據(jù)的元數(shù)據(jù)(metadata)。數(shù)據(jù)被存儲在.data成員內(nèi)冤馏,是一個n_samples*n_features的數(shù)組日麸。在有監(jiān)督問題的情形下,一個或多個因變量(response variables)被儲存在.target成員中逮光。有關(guān)不同數(shù)據(jù)集的更多細(xì)節(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ù)字圖案對應(yīng)的我們想預(yù)測的真實(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使用盼樟。

學(xué)習(xí)和預(yù)測

在digits數(shù)據(jù)集中氢卡,我們的任務(wù)是給定一個圖案,預(yù)測其表示的數(shù)字是什么晨缴。我們的樣本有10個可能的分類(數(shù)字0到9)译秦,我們將匹配一個預(yù)測器(estimator)來預(yù)測(predict)未知樣本所屬的分類。

在scikit-learn中喜庞,分類的預(yù)測器是一個Python對象诀浪,來實(shí)現(xiàn)fit(X, y)和predict(T)方法棋返。

下面這個預(yù)測器的例子是classsklearn.svm.SVC延都,實(shí)現(xiàn)了支持向量機(jī)分類。創(chuàng)建分類器需要模型參數(shù)睛竣,但現(xiàn)在晰房,我們暫時(shí)先將預(yù)測器看作是一個黑盒:

>>> from sklearn import svm

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

選擇模型參數(shù)

在這個例子里我們手動設(shè)置了gamma值∩涔担可以通過這些工具例如網(wǎng)格搜索(grid search)和交叉驗(yàn)證(cross validation)來自動找到參數(shù)的最佳取值殊者。

給預(yù)測器取個名字叫做clf(claasifier)。現(xiàn)在預(yù)測器必須來匹配(fit)模型验夯,也就是說猖吴,它必須從模型中學(xué)習(xí)(learn)。這個過程是通過將訓(xùn)練集傳遞給fit方法來實(shí)現(xiàn)的挥转。我們將除了最后一個樣本的數(shù)據(jù)全部作為訓(xùn)練集海蔽。通過Python語法[:-1]來選擇訓(xùn)練集,這會生成一個新的數(shù)組绑谣,包含了除最后一個條目的digits.data:

>>> clf.fit(digits.data[:-1], digits.target[:-1])? # doctest: +NORMALIZE_WHITESPACE

SVC(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)在你可以預(yù)測新值了党窜,具體來說,我們可以詢問分類器借宵,digits數(shù)據(jù)集里最后一個圖案所代表的數(shù)字是什么幌衣,我們并沒有用最后一個數(shù)據(jù)來訓(xùn)練分類器。

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

array([8])

最一個圖案如下:

如你所見壤玫,這項(xiàng)任務(wù)很具有挑戰(zhàn)性:這個圖案的分辨率很差豁护。你能和分類器得到一致結(jié)果嗎?

一個更復(fù)雜的分類問題的例子在這里:識別手寫數(shù)字(Recognizing hand-written digits)欲间,供學(xué)習(xí)參考楚里。

模型持久性(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_WHITESPACE

SVC(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對象中獨(dú)立的numpy數(shù)組是在文件系統(tǒng)中是按順序排列的一個獨(dú)立文件。當(dāng)用joblib.load重新加載模型時(shí)吝梅,所有文件必須在同一個目錄下虱疏。

注意pickle有一些安全性和維護(hù)性問題。請參考模型持久性章節(jié)獲得更多關(guān)于scikit-learn模型持久性的信息苏携。

machine-learning,Scikit-Learn,機(jī)器學(xué)習(xí)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末做瞪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子右冻,更是在濱河造成了極大的恐慌装蓬,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纱扭,死亡現(xiàn)場離奇詭異牍帚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)乳蛾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門暗赶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人肃叶,你說我怎么就攤上這事蹂随。” “怎么了因惭?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵岳锁,是天一觀的道長。 經(jīng)常有香客問我蹦魔,道長激率,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任版姑,我火速辦了婚禮柱搜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘剥险。我一直安慰自己聪蘸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布表制。 她就那樣靜靜地躺著健爬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪么介。 梳的紋絲不亂的頭發(fā)上娜遵,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天,我揣著相機(jī)與錄音壤短,去河邊找鬼设拟。 笑死慨仿,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的纳胧。 我是一名探鬼主播镰吆,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼跑慕!你這毒婦竟也來了万皿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤核行,失蹤者是張志新(化名)和其女友劉穎牢硅,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芝雪,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡减余,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绵脯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片佳励。...
    茶點(diǎn)故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡休里,死狀恐怖蛆挫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情妙黍,我是刑警寧澤悴侵,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站拭嫁,受9級特大地震影響可免,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜做粤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一浇借、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧怕品,春花似錦妇垢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至吼和,卻和暖如春涨薪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背炫乓。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工刚夺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留献丑,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓侠姑,卻偏偏與公主長得像阳距,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子结借,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評論 2 348

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