scikit learn 使用指南

2021-07-10 01:52:11 字數 4310 閱讀 1853

一般來說,機器學習問題可以這樣來理解:我們有n個 樣本 (sample)的資料集,想要**未知資料的屬性。如果描述每個樣本的數字不只乙個,比如乙個多維的條目(也叫做 多變數資料 (multivariate data)),那麼這個樣本就有多個屬性或者 特徵 。

我們可以將學習問題分為以下幾類:

scikit-learn有一些標準資料集,比如用於分類的 iris 和 digits 資料集,和用於回歸的波士頓房價 (boston house prices)資料集。

下面,我們會用shell裡的python直譯器來載入iris和digits資料集。$表示shell提示符,>>>表示python直譯器提示符:

$ python

>>> from sklearn import datasets

>>> iris = datasets.load_iris()

>>> digits = datasets.load_digits()

資料集類似字典物件,包括了所有的資料和關於資料的元資料(metadata)。資料被儲存在.data成員內,是乙個n_samples*n_features的陣列。在有監督問題的情形下,乙個或多個因變數(response variables)被儲存在.target成員中。有關不同資料集的更多細節可以在 這裡 被找到。

例如,在digits資料集中,digits.data是可以用來分類數字樣本的特徵:

>>> 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資料集的真實值,即每個數字圖案對應的我們想**的真實數字:

>>> digits

.target

array([0, 1, 2, ..., 8, 9, 8])

資料陣列的形式資料是乙個2維n_samples*n_features的陣列,儘管原始資料集可能會有不同的形式。在digits資料集中,每個原始樣本是乙個8*8的陣列,可以用以下方式訪問:

>>> 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.]])

這個簡單的例子 說明了如何從原始問題裡將資料形式化,以便scikit-learn使用。

在digits資料集中,我們的任務是給定乙個圖案,**其表示的數字是什麼。我們的樣本有10個可能的分類(數字0到9),我們將匹配乙個 **器 (estimator)來 **(predict)未知樣本所屬的分類。

在scikit-learn中,分類的**器是乙個python物件,來實現fit(x, y)和predict(t)方法。

下面這個**器的例子是classsklearn.svm.svc,實現了 支援向量機分類 。建立分類器需要模型引數,但現在,我們暫時先將**器看作是乙個黑盒:

>>> 

from sklearn import svm

>>> clf = svm.svc(gamma=0.001, c=100.)

選擇模型引數

在這個例子裡我們手動設定了gamma值。可以通過這些工具例如 網格搜尋 (grid search)和 交叉驗證 (cross validation)來自動找到引數的最佳取值。

給**器取個名字叫做clf(claasifier)。現在**器必須來 匹配 (fit)模型,也就是說,它必須從模型中 學習 (learn)。這個過程是通過將訓練集傳遞給fit方法來實現的。我們將除了最後乙個樣本的資料全部作為訓練集。通過python語法[:-1]來選擇訓練集,這會生成乙個新的陣列,包含了除最後乙個條目的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)

現在你可以**新值了,具體來說,我們可以詢問分類器,digits資料集裡最後乙個圖案所代表的數字是什麼,我們並沒有用最後乙個資料來訓練分類器。

>>> clf

.predict(digits

.data

[-1])

array([8])

最乙個圖案如下:

如你所見,這項任務很具有挑戰性:這個圖案的解析度很差。你能和分類器得到一致結果嗎?

乙個更複雜的分類問題的例子在這裡: 識別手寫數字 (recognizing hand-written digits),供學習參考。

可以採用python內建的永續性模型 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)會更吸引人,在大資料下效率更高,但只能pickle到磁碟而不是字串:

>>> 

from sklearn.externals import joblib

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

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

Ubuntu apt 使用指南

起初gnu linux系統中只有.tar.gz。使用者必須自己編譯他們想使用的每乙個程式。在debian出現之後,人們認為有必要在系統中新增 一種機制用來管理安裝在計算機上的軟體包。人們將這套系統稱為dpkg。至此著名的 package 首次在gnu linux上出現。不久之後紅帽子也 開始著手建立...

CImageList使用指南

1.綜述 在mfc 中cimagelist 類封裝了 影象列表控制項的功能,影象列表是乙個具有相同大小的 影象 可以是不同 型別 的集合,其主要用於 應用程式中大規模 圖示的儲存。該控制項是不可 見的,通常與其它如 clistbox ccombobox ccomboboxex ctabctrl 以及...

CImageList使用指南

cimagelist使用指南 1.綜述 在 mfc中cimagelist類封裝了影象列表控制項的功能,影象列表是乙個具有相同大小的影象 可以是不同型別 的集合,其主要用於應用程式中大 規模圖示的儲存,該控制項是不可見的。通常與其它如clistbox,ccombobox,ccomboboxex以及ct...