中文文檔:http://sklearn.apachecn.org/cn/0.19.0/tutorial/basic/tutorial.html
英文文檔:http://sklearn.apachecn.org/en/0.19.0/tutorial/basic/tutorial.html
GitHub:https://github.com/apachecn/scikit-learn-doc-zh(覺(jué)得不錯(cuò)麻煩給個(gè) Star,我們一直在努力)
貢獻(xiàn)者:https://github.com/apachecn/scikit-learn-doc-zh#貢獻(xiàn)者
使用 scikit-learn 介紹機(jī)器學(xué)習(xí) | ApacheCN
內(nèi)容提要
在本節(jié)中,我們介紹一些在使用 scikit-learn 過(guò)程中用到的機(jī)器學(xué)習(xí)詞匯,并且給出一些例子闡釋它們。
機(jī)器學(xué)習(xí):?jiǎn)栴}設(shè)置
一般來(lái)說(shuō),一個(gè)學(xué)習(xí)問(wèn)題通常會(huì)考慮一系列 n 個(gè)樣本數(shù)據(jù),然后嘗試預(yù)測(cè)未知數(shù)據(jù)的屬性。 如果每個(gè)樣本是多個(gè)屬性的數(shù)據(jù)(比如說(shuō)是一個(gè)多維記錄),就說(shuō)它有許多“屬性”,或稱features(特征)。
我們可以將學(xué)習(xí)問(wèn)題分為幾大類:
監(jiān)督學(xué)習(xí), 其中數(shù)據(jù)帶有一個(gè)附加屬性,即我們想要預(yù)測(cè)的結(jié)果值(點(diǎn)擊此處轉(zhuǎn)到 scikit-learn 監(jiān)督學(xué)習(xí)頁(yè)面)。這個(gè)問(wèn)題可以是:
分類: 樣本屬于兩個(gè)或更多個(gè)類,我們想從已經(jīng)標(biāo)記的數(shù)據(jù)中學(xué)習(xí)如何預(yù)測(cè)未標(biāo)記數(shù)據(jù)的類別。 分類問(wèn)題的一個(gè)例子是手寫數(shù)字識(shí)別,其目的是將每個(gè)輸入向量分配給有限數(shù)目的離散類別之一。 我們通常把分類視作監(jiān)督學(xué)習(xí)的一個(gè)離散形式(區(qū)別于連續(xù)形式),從有限的類別中,給每個(gè)樣本貼上正確的標(biāo)簽。
回歸: 如果期望的輸出由一個(gè)或多個(gè)連續(xù)變量組成,則該任務(wù)稱為回歸. 回歸問(wèn)題的一個(gè)例子是預(yù)測(cè)鮭魚(yú)的長(zhǎng)度是其年齡和體重的函數(shù)。
無(wú)監(jiān)督學(xué)習(xí), 其中訓(xùn)練數(shù)據(jù)由沒(méi)有任何相應(yīng)目標(biāo)值的一組輸入向量x組成。這種問(wèn)題的目標(biāo)可能是在數(shù)據(jù)中發(fā)現(xiàn)彼此類似的示例所聚成的組,這種問(wèn)題稱為聚類, 或者,確定輸入空間內(nèi)的數(shù)據(jù)分布,稱為密度估計(jì),又或從高維數(shù)據(jù)投影數(shù)據(jù)空間縮小到二維或三維以進(jìn)行可視化(點(diǎn)擊此處轉(zhuǎn)到 scikit-learn 無(wú)監(jiān)督學(xué)習(xí)頁(yè)面)。
訓(xùn)練集和測(cè)試集
機(jī)器學(xué)習(xí)是從數(shù)據(jù)的屬性中學(xué)習(xí),并將它們應(yīng)用到新數(shù)據(jù)的過(guò)程。 這就是為什么機(jī)器學(xué)習(xí)中評(píng)估算法的普遍實(shí)踐是把數(shù)據(jù)分割成訓(xùn)練集(我們從中學(xué)習(xí)數(shù)據(jù)的屬性)和測(cè)試集(我們測(cè)試這些性質(zhì))。
scikit-learn提供了一些標(biāo)準(zhǔn)數(shù)據(jù)集,例如 用于分類的iris和digits數(shù)據(jù)集 和波士頓房?jī)r(jià)回歸數(shù)據(jù)集.
在下文中,我們從我們的 shell 啟動(dòng)一個(gè) Python 解釋器,然后加載iris和digits數(shù)據(jù)集。我們的符號(hào)約定是$表示 shell 提示符,而>>>表示 Python 解釋器提示符:
$ python
>>> from sklearn import datasets
>>> iris = datasets.load_iris()
>>> digits = datasets.load_digits()
數(shù)據(jù)集是一個(gè)類似字典的對(duì)象,它保存有關(guān)數(shù)據(jù)的所有數(shù)據(jù)和一些元數(shù)據(jù)。 該數(shù)據(jù)存儲(chǔ)在.data成員中,它是n_samples,n_features數(shù)組。 在監(jiān)督問(wèn)題的情況下,一個(gè)或多個(gè)響應(yīng)變量存儲(chǔ)在.target成員中。 有關(guān)不同數(shù)據(jù)集的更多詳細(xì)信息,請(qǐng)參見(jiàn)專用數(shù)據(jù)集部分.
例如,在數(shù)字?jǐn)?shù)據(jù)集的情況下,digits.data使我們能夠得到一些用于分類的樣本特征:
>>>
>>>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.]]
并且digits.target表示了數(shù)據(jù)集內(nèi)每個(gè)數(shù)字的真實(shí)類別,也就是我們期望從每個(gè)手寫數(shù)字圖像中學(xué)得的相應(yīng)的數(shù)字標(biāo)記:
>>>
>>>digits.targetarray([0, 1, 2, ..., 8, 9, 8])
數(shù)據(jù)數(shù)組的形狀
數(shù)據(jù)總是 2D 數(shù)組,形狀(n_samples,n_features),盡管原始數(shù)據(jù)可能具有不同的形狀。 在數(shù)字的情況下,每個(gè)原始樣本是形狀(8,8)的圖像,可以使用以下方式訪問(wèn):
>>>
>>>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ù)集上的簡(jiǎn)單示例說(shuō)明了如何從原始數(shù)據(jù)開(kāi)始調(diào)整,形成可以在 scikit-learn 中使用的數(shù)據(jù)。
從外部數(shù)據(jù)集加載
要從外部數(shù)據(jù)集加載,請(qǐng)參閱加載外部數(shù)據(jù)集.
在數(shù)字?jǐn)?shù)據(jù)集的情況下,任務(wù)是給出圖像來(lái)預(yù)測(cè)其表示的數(shù)字。 我們給出了 10 個(gè)可能類(數(shù)字 0 到 9)中的每一個(gè)的樣本,我們?cè)谶@些類上擬合一個(gè)估計(jì)器,以便能夠預(yù)測(cè)未知的樣本所屬的類。
在 scikit-learn 中,分類的估計(jì)器是一個(gè) Python 對(duì)象,它實(shí)現(xiàn)了fit(X,y)和predict(T)等方法。
估計(jì)器的一個(gè)例子類sklearn.svm.SVC,實(shí)現(xiàn)了支持向量分類。 估計(jì)器的構(gòu)造函數(shù)以相應(yīng)模型的參數(shù)為參數(shù),但目前我們將把估計(jì)器視為即可:
>>>
>>>fromsklearnimportsvm>>>clf=svm.SVC(gamma=0.001,C=100.)
選擇模型的參數(shù)
在這個(gè)例子中,我們手動(dòng)設(shè)置gamma值。不過(guò),通過(guò)使用網(wǎng)格搜索及交叉驗(yàn)證等工具,可以自動(dòng)找到參數(shù)的良好值。
我們把我們的估計(jì)器實(shí)例命名為clf,因?yàn)樗且粋€(gè)分類器(classifier)。我們需要它適應(yīng)模型,也就是說(shuō),要它從模型中*學(xué)習(xí)*。 這是通過(guò)將我們的訓(xùn)練集傳遞給fit方法來(lái)完成的。作為一個(gè)訓(xùn)練集,讓我們使用數(shù)據(jù)集中除最后一張以外的所有圖像。 我們用[:-1]Python 語(yǔ)法選擇這個(gè)訓(xùn)練集,它產(chǎn)生一個(gè)包含digits.data中除最后一個(gè)條目(entry)之外的所有條目的新數(shù)組
>>>
>>>clf.fit(digits.data[:-1],digits.target[:-1])SVC(C=100.0, cache_size=200, class_weight=None, coef0=0.0,decision_function_shape='ovr', 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ù)測(cè)新的值,特別是我們可以向分類器詢問(wèn)digits數(shù)據(jù)集中最后一個(gè)圖像(沒(méi)有用來(lái)訓(xùn)練的一條實(shí)例)的數(shù)字是什么:
>>>
>>>clf.predict(digits.data[-1:])array([8])
相應(yīng)的圖像如下:

正如你所看到的,這是一項(xiàng)具有挑戰(zhàn)性的任務(wù):圖像分辨率差。你是否認(rèn)同這個(gè)分類?
這個(gè)分類問(wèn)題的一個(gè)完整例子可以作為一個(gè)例子來(lái)運(yùn)行和學(xué)習(xí): 識(shí)別手寫數(shù)字。Recognizing hand-written digits.
可以通過(guò)使用 Python 的內(nèi)置持久化模塊(即pickle)將模型保存:
>>>
>>>fromsklearnimportsvm>>>fromsklearnimportdatasets>>>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='ovr', degree=3, gamma='auto', kernel='rbf',max_iter=-1, probability=False, random_state=None, shrinking=True,tol=0.001, verbose=False)>>>importpickle>>>s=pickle.dumps(clf)>>>clf2=pickle.loads(s)>>>clf2.predict(X[0:1])array([0])>>>y[0]0
在scikit的具體情況下,使用 joblib 替換 pickle(joblib.dump&joblib.load)可能會(huì)更有趣,這對(duì)大數(shù)據(jù)更有效,但只能序列化 (pickle) 到磁盤而不是字符串:
>>>
>>>fromsklearn.externalsimportjoblib>>>joblib.dump(clf,'filename.pkl')
之后,您可以加載已保存的模型(可能在另一個(gè) Python 進(jìn)程中):
>>>
>>>clf=joblib.load('filename.pkl')
Warning
joblib.dump以及joblib.load函數(shù)也接受 file-like(類文件) 對(duì)象而不是文件名。有關(guān) Joblib 的數(shù)據(jù)持久化的更多信息,請(qǐng)點(diǎn)擊此處。
請(qǐng)注意,pickle 有一些安全性和維護(hù)性問(wèn)題。有關(guān)使用 scikit-learn 的模型持久化的更多詳細(xì)信息,請(qǐng)參閱模型持久化部分。
scikit-learn 估計(jì)器遵循某些規(guī)則,使其行為更可預(yù)測(cè)。
除非特別指定,輸入將被轉(zhuǎn)換為float64
>>>
>>>importnumpyasnp>>>fromsklearnimportrandom_projection>>>rng=np.random.RandomState(0)>>>X=rng.rand(10,2000)>>>X=np.array(X,dtype='float32')>>>X.dtypedtype('float32')>>>transformer=random_projection.GaussianRandomProjection()>>>X_new=transformer.fit_transform(X)>>>X_new.dtypedtype('float64')
在這個(gè)例子中,X原本是float32,被fit_transform(X)被轉(zhuǎn)換成float64。
回歸目標(biāo)被轉(zhuǎn)換為float64,但分類目標(biāo)維持不變:
>>>
>>>fromsklearnimportdatasets>>>fromsklearn.svmimportSVC>>>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='ovr', 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='ovr', 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']
這里,第一個(gè)predict()返回一個(gè)整數(shù)數(shù)組,因?yàn)樵趂it中使用了iris.target(一個(gè)整數(shù)數(shù)組)。 第二個(gè)predict()返回一個(gè)字符串?dāng)?shù)組,因?yàn)閕ris.target_names是一個(gè)字符串?dāng)?shù)組。
估計(jì)器的超參數(shù)可以通過(guò)sklearn.pipeline.Pipeline.set_params方法在實(shí)例化之后進(jìn)行更新。 調(diào)用fit()多次將覆蓋以前的fit()所學(xué)到的參數(shù):
>>>
>>>importnumpyasnp>>>fromsklearn.svmimportSVC>>>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='ovr', 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='ovr', 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])
在這里,估計(jì)器被SVC()構(gòu)造之后,默認(rèn)內(nèi)核rbf首先被改變到linear,然后改回到rbf重新訓(xùn)練估計(jì)器并進(jìn)行第二次預(yù)測(cè)。
當(dāng)使用多類分類器時(shí),執(zhí)行的學(xué)習(xí)和預(yù)測(cè)任務(wù)取決于參與訓(xùn)練的目標(biāo)數(shù)據(jù)的格式:
>>>
>>>fromsklearn.svmimportSVC>>>fromsklearn.multiclassimportOneVsRestClassifier>>>fromsklearn.preprocessingimportLabelBinarizer>>>X=[[1,2],[2,4],[4,5],[3,2],[3,1]]>>>y=[0,0,1,1,2]>>>classif=OneVsRestClassifier(estimator=SVC(random_state=0))>>>classif.fit(X,y).predict(X)array([0, 0, 1, 1, 2])
在上述情況下,分類器被使用一個(gè)含有多個(gè)標(biāo)簽的一維數(shù)組訓(xùn)練,因此predict()方法提供相應(yīng)的多類別預(yù)測(cè)。分類器也可以通過(guò)二進(jìn)制表示的的標(biāo)簽的二維數(shù)組來(lái)訓(xùn)練:
>>>
>>>y=LabelBinarizer().fit_transform(y)>>>classif.fit(X,y).predict(X)array([[1, 0, 0],[1, 0, 0],[0, 1, 0],[0, 0, 0],[0, 0, 0]])
這里,使用LabelBinarizer使目標(biāo)向量 y 被轉(zhuǎn)化成二維數(shù)組的標(biāo)簽表示。在這種情況下,predict()返回一個(gè)表示相應(yīng)多重標(biāo)簽預(yù)測(cè)的 2d 矩陣。
請(qǐng)注意,第四個(gè)和第五個(gè)實(shí)例返回全零向量,表明它們不能匹配用來(lái)訓(xùn)練中的目標(biāo)標(biāo)簽中的任意一個(gè)。使用多分類輸出,類似地可以為一個(gè)實(shí)例分配多個(gè)標(biāo)簽:
>>fromsklearn.preprocessingimportMultiLabelBinarizer>>y=[[0,1],[0,2],[1,3],[0,2,3],[2,4]]>>y=MultiLabelBinarizer().fit_transform(y)>>classif.fit(X,y).predict(X)array([[1,1,0,0,0],[1,0,1,0,0],[0,1,0,1,0],[1,0,1,1,0],[0,0,1,0,1]])
在這種情況下,用來(lái)訓(xùn)練分類器的多個(gè)向量被賦予多個(gè)標(biāo)記,MultiLabelBinarizer被用來(lái)二進(jìn)制化多個(gè)標(biāo)簽的二維數(shù)組,使之用來(lái)訓(xùn)練。predict()函數(shù)返回帶有多個(gè)標(biāo)記的二維數(shù)組作為每個(gè)實(shí)例的結(jié)果。
中文文檔:http://sklearn.apachecn.org/cn/0.19.0/tutorial/basic/tutorial.html
英文文檔:http://sklearn.apachecn.org/en/0.19.0/tutorial/basic/tutorial.html
GitHub:https://github.com/apachecn/scikit-learn-doc-zh(覺(jué)得不錯(cuò)麻煩給個(gè) Star,我們一直在努力)
貢獻(xiàn)者:https://github.com/apachecn/scikit-learn-doc-zh#貢獻(xiàn)者
有興趣的大佬們也可以和我們一起來(lái)維護(hù),持續(xù)更新中 。。。
機(jī)器學(xué)習(xí)交流群:?629470233