一般來說,機器學習問題可以這樣來理解:我們有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...