scikit-learn入門學(xué)習(xí)

1.載入數(shù)據(jù)集

scikit-learn里面自帶了一些標(biāo)準(zhǔn)數(shù)據(jù)集,例如用于分類的數(shù)據(jù)集iris和digits,以及用于回歸的boston房?jī)r(jià)數(shù)據(jù)集。下面是用從shell中啟動(dòng)一個(gè)python解釋器并且加載iris和digits。約定的符號(hào)是:$ 代表shell傳輸;>>>代表python解釋器。

>>> from sklearn import datasets
>>> iris = datasets.load_iris()
>>> digits = datasets.load_digits()

數(shù)據(jù)存儲(chǔ)在digits.data中,這是一個(gè)1797*64的數(shù)組,其中1797代表樣本數(shù)目,64代表特征數(shù)目:

>>> print(digits.data)
 [[ 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.]]

標(biāo)簽為digits.target,維度:1797*1:

>>> digits.targetarray
([0, 1, 2, ..., 8, 9, 8])

2.數(shù)據(jù)arrays的shape

數(shù)據(jù)是一般都是二維數(shù)組,但是不同問(wèn)題的初始數(shù)據(jù)都會(huì)有不同的形狀,以digits數(shù)據(jù)集為例,每個(gè)sample是一個(gè)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.]])

3.學(xué)習(xí)和預(yù)測(cè):

在digits數(shù)據(jù)集里面,任務(wù)是預(yù)測(cè),也就是給定一個(gè)圖片,輸出其所屬的類別。根據(jù)訓(xùn)練數(shù)據(jù),fit一個(gè)評(píng)估器,能夠預(yù)測(cè)未出現(xiàn)樣本的所屬。這里舉例的評(píng)估器是sklearn.svm.SVC,用的是支持向量機(jī)分類方法。在scikit-learn中,一個(gè)用于分類的評(píng)估器是一個(gè)python對(duì)象,主要實(shí)現(xiàn)了兩個(gè)方法:fit(X,y)和predict(T)。

>>> from sklearn import svm
>>> clf = svm.SVC(gamma=0.001, C=100.)
如何選擇模型參數(shù)

在這個(gè)例子中需要手動(dòng)的設(shè)置參數(shù),比如說(shuō)gamma。但是我們可以通過(guò)一些工具來(lái)自動(dòng)的調(diào)整參數(shù),例如:grid search和cross validation。我們的評(píng)估器實(shí)例叫做clf,它是一個(gè)分類器。我們把訓(xùn)練集傳給fit方法,讓分類器去學(xué)習(xí)這個(gè)模型。在這里,選擇了數(shù)據(jù)集中除了最后一個(gè)的所有圖片,因?yàn)樽詈笠粋€(gè)下一步將會(huì)用來(lái)預(yù)測(cè),所以這里不學(xué)習(xí)最后一個(gè)樣本。

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

下面來(lái)用最后一張圖片來(lái)預(yù)測(cè)新值:

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

用matplot繪圖:

print(__doc__)
# Code source: Ga?l Varoquaux
# Modified for documentation by Jaques Grobler
# License: BSD 3 clause
from sklearn import datasets
import matplotlib.pyplot as plt
#Load the digits dataset
digits = datasets.load_digits()
#Display the first digit
plt.figure(1, figsize=(3, 3))
plt.imshow(digits.images[-1], cmap=plt.cm.gray_r, interpolation='nearest')
plt.show()

4.模型固化

在scikit里,可通過(guò)python的內(nèi)置持久化模型pickle來(lái)保存模型。

>>> 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)
 SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, 
decision_function_shape=None, degree=3, gamma='auto', 
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:1])
array([0])
>>> y[0]
0

在這里也可以用joblib代替pickle(joblib.dump&joblib.load),對(duì)于大數(shù)據(jù)處理joblib更加有效。用法如下:

>>> from sklearn.externals import joblib
>>> joblib.dump(clf, 'filename.pkl')
>>> clf = joblib.load('filename.pkl') 

注意:
joblib.dump返回的是一系列的文件名。
在文件系統(tǒng)中,clf對(duì)象中每一個(gè)numpy數(shù)組都被序列化作為一個(gè)單獨(dú)的文件。在重新載入模型的時(shí)候(joblib.load),同一文件夾中的所有的文件都是需要的。

5.約定

為了增加預(yù)測(cè)性,scikit-learn評(píng)估器遵循下面幾個(gè)規(guī)則:

(1)類型轉(zhuǎn)換

如果不是特殊情況,輸入將被轉(zhuǎn)化為float64類型的。
在下面的例子中,X是float32,我們用fit_transform(X)將其轉(zhuǎn)化成float64。

>>> import numpy as np
>>> from sklearn import random_projection
>>> rng = np.random.RandomState(0)
>>> X = rng.rand(10, 2000)
>>> X = np.array(X, dtype='float32')
>>> X.dtype
dtype('float32')
>>> transformer = random_projection.GaussianRandomProjection()
>>> X_new = transformer.fit_transform(X)
>>> X_new.dtype
dtype('float64')

回歸的target被轉(zhuǎn)化為float64類型的,而分類的classification的target是保持不變的:

>>> from sklearn import datasets
>>> from sklearn.svm import SVC
>>> iris = datasets.load_iris()
>>> clf = SVC()
>>> clf.fit(iris.data, iris.target)
 SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, 
decision_function_shape=None, degree=3, gamma='auto', 
kernel='rbf', max_iter=-1, probability=False, random_state=None, 
shrinking=True, tol=0.001, verbose=False)

>>> list(clf.predict(iris.data[:3]))
[0, 0, 0]

>>> clf.fit(iris.data, iris.target_names[iris.target])
 SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, 
decision_function_shape=None, degree=3, gamma='auto', 
kernel='rbf', max_iter=-1, probability=False, random_state=None, 
shrinking=True, tol=0.001, verbose=False)

>>> list(clf.predict(iris.data[:3]))
 ['setosa', 'setosa', 'setosa']

在這里,因?yàn)閕ris.target是一個(gè)整形數(shù)組,所以第一個(gè)predict()返回的是一個(gè)整形數(shù)組。又因?yàn)閕ris.target_names是一個(gè)字符串?dāng)?shù)組,所以第二個(gè)predict()返回的是一個(gè)字符串?dāng)?shù)組。

(2)重新擬合參數(shù)和更新參數(shù)

sklearn.pipeline.Pipeline.set_params:一個(gè)評(píng)估器的超參數(shù)更新。
多次調(diào)用fit()將會(huì)重寫之前學(xué)習(xí)到的fit()。

>>> import numpy as np
>>> from sklearn.svm import SVC
>>> rng = np.random.RandomState(0)
>>> X = rng.rand(100, 10)
>>> y = rng.binomial(1, 0.5, 100)
>>> X_test = rng.rand(5, 10)

>>> clf = SVC()
>>> clf.set_params(kernel='linear').fit(X, y) 
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, 
decision_function_shape=None, degree=3, gamma='auto', 
kernel='linear', max_iter=-1, probability=False, random_state=None, 
shrinking=True, tol=0.001, verbose=False)
>>> clf.predict(X_test)
array([1, 0, 1, 1, 0])

>>> clf.set_params(kernel='rbf').fit(X, y)
 SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, 
decision_function_shape=None, degree=3, gamma='auto', 
kernel='rbf', max_iter=-1, probability=False, random_state=None, 
shrinking=True, tol=0.001, verbose=False)
>>> clf.predict(X_test)
array([0, 0, 0, 1, 0])

在這里,通過(guò)SVC()創(chuàng)建了評(píng)估器以后,默認(rèn)的kernel rbf第一次被改變?yōu)閘inear,然后又重新改回rbf,去重?cái)M合評(píng)估器并且做了二次預(yù)測(cè)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容