【Scikit-Learn 中文文檔】使用 scikit-learn 介紹機器學習 | ApacheCN

中文文檔: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(覺得不錯麻煩給個 Star,我們一直在努力)

貢獻者:https://github.com/apachecn/scikit-learn-doc-zh#貢獻者

使用 scikit-learn 介紹機器學習 | ApacheCN

內容提要

在本節中,我們介紹一些在使用 scikit-learn 過程中用到的機器學習詞匯,并且給出一些例子闡釋它們。

機器學習:問題設置

一般來說,一個學習問題通常會考慮一系列 n 個樣本數據,然后嘗試預測未知數據的屬性。 如果每個樣本是多個屬性的數據(比如說是一個多維記錄),就說它有許多“屬性”,或稱features(特征)

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

監督學習, 其中數據帶有一個附加屬性,即我們想要預測的結果值(點擊此處轉到 scikit-learn 監督學習頁面)。這個問題可以是:

分類: 樣本屬于兩個或更多個類,我們想從已經標記的數據中學習如何預測未標記數據的類別。 分類問題的一個例子是手寫數字識別,其目的是將每個輸入向量分配給有限數目的離散類別之一。 我們通常把分類視作監督學習的一個離散形式(區別于連續形式),從有限的類別中,給每個樣本貼上正確的標簽。

回歸: 如果期望的輸出由一個或多個連續變量組成,則該任務稱為回歸. 回歸問題的一個例子是預測鮭魚的長度是其年齡和體重的函數。

無監督學習, 其中訓練數據由沒有任何相應目標值的一組輸入向量x組成。這種問題的目標可能是在數據中發現彼此類似的示例所聚成的組,這種問題稱為聚類, 或者,確定輸入空間內的數據分布,稱為密度估計,又或從高維數據投影數據空間縮小到二維或三維以進行可視化點擊此處轉到 scikit-learn 無監督學習頁面)。

訓練集和測試集

機器學習是從數據的屬性中學習,并將它們應用到新數據的過程。 這就是為什么機器學習中評估算法的普遍實踐是把數據分割成訓練集(我們從中學習數據的屬性)和測試集(我們測試這些性質)。

加載示例數據集

scikit-learn提供了一些標準數據集,例如 用于分類的irisdigits數據集 和波士頓房價回歸數據集.

在下文中,我們從我們的 shell 啟動一個 Python 解釋器,然后加載iris和digits數據集。我們的符號約定是$表示 shell 提示符,而>>>表示 Python 解釋器提示符:

$ python

>>> from sklearn import datasets

>>> iris = datasets.load_iris()

>>> digits = datasets.load_digits()

數據集是一個類似字典的對象,它保存有關數據的所有數據和一些元數據。 該數據存儲在.data成員中,它是n_samples,n_features數組。 在監督問題的情況下,一個或多個響應變量存儲在.target成員中。 有關不同數據集的更多詳細信息,請參見專用數據集部分.

例如,在數字數據集的情況下,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表示了數據集內每個數字的真實類別,也就是我們期望從每個手寫數字圖像中學得的相應的數字標記:

>>>

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

數據數組的形狀

數據總是 2D 數組,形狀(n_samples,n_features),盡管原始數據可能具有不同的形狀。 在數字的情況下,每個原始樣本是形狀(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 中使用的數據。

從外部數據集加載

要從外部數據集加載,請參閱加載外部數據集.

學習和預測

在數字數據集的情況下,任務是給出圖像來預測其表示的數字。 我們給出了 10 個可能類(數字 0 到 9)中的每一個的樣本,我們在這些類上擬合一個估計器,以便能夠預測未知的樣本所屬的類。

在 scikit-learn 中,分類的估計器是一個 Python 對象,它實現了fit(X,y)和predict(T)等方法。

估計器的一個例子類sklearn.svm.SVC,實現了支持向量分類。 估計器的構造函數以相應模型的參數為參數,但目前我們將把估計器視為即可:

>>>

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

選擇模型的參數

在這個例子中,我們手動設置gamma值。不過,通過使用網格搜索交叉驗證等工具,可以自動找到參數的良好值。

我們把我們的估計器實例命名為clf,因為它是一個分類器(classifier)。我們需要它適應模型,也就是說,要它從模型中*學習*。 這是通過將我們的訓練集傳遞給fit方法來完成的。作為一個訓練集,讓我們使用數據集中除最后一張以外的所有圖像。 我們用[:-1]Python 語法選擇這個訓練集,它產生一個包含digits.data中除最后一個條目(entry)之外的所有條目的新數組

>>>

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

現在你可以預測新的值,特別是我們可以向分類器詢問digits數據集中最后一個圖像(沒有用來訓練的一條實例)的數字是什么:

>>>

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

相應的圖像如下:

正如你所看到的,這是一項具有挑戰性的任務:圖像分辨率差。你是否認同這個分類?

這個分類問題的一個完整例子可以作為一個例子來運行和學習: 識別手寫數字。Recognizing hand-written digits.

模型持久化

可以通過使用 Python 的內置持久化模塊(即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)可能會更有趣,這對大數據更有效,但只能序列化 (pickle) 到磁盤而不是字符串:

>>>

>>>fromsklearn.externalsimportjoblib>>>joblib.dump(clf,'filename.pkl')

之后,您可以加載已保存的模型(可能在另一個 Python 進程中):

>>>

>>>clf=joblib.load('filename.pkl')

Warning

joblib.dump以及joblib.load函數也接受 file-like(類文件) 對象而不是文件名。有關 Joblib 的數據持久化的更多信息,請點擊此處

請注意,pickle 有一些安全性和維護性問題。有關使用 scikit-learn 的模型持久化的更多詳細信息,請參閱模型持久化部分。

規定

scikit-learn 估計器遵循某些規則,使其行為更可預測。

類型轉換

除非特別指定,輸入將被轉換為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')

在這個例子中,X原本是float32,被fit_transform(X)被轉換成float64。

回歸目標被轉換為float64,但分類目標維持不變:

>>>

>>>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']

這里,第一個predict()返回一個整數數組,因為在fit中使用了iris.target(一個整數數組)。 第二個predict()返回一個字符串數組,因為iris.target_names是一個字符串數組。

再次訓練和更新參數

估計器的超參數可以通過sklearn.pipeline.Pipeline.set_params方法在實例化之后進行更新。 調用fit()多次將覆蓋以前的fit()所學到的參數:

>>>

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

在這里,估計器被SVC()構造之后,默認內核rbf首先被改變到linear,然后改回到rbf重新訓練估計器并進行第二次預測。

多分類與多標簽擬合

當使用多類分類器時,執行的學習和預測任務取決于參與訓練的目標數據的格式:

>>>

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

在上述情況下,分類器被使用一個含有多個標簽的一維數組訓練,因此predict()方法提供相應的多類別預測。分類器也可以通過二進制表示的的標簽的二維數組來訓練:

>>>

>>>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使目標向量 y 被轉化成二維數組的標簽表示。在這種情況下,predict()返回一個表示相應多重標簽預測的 2d 矩陣。

請注意,第四個和第五個實例返回全零向量,表明它們不能匹配用來訓練中的目標標簽中的任意一個。使用多分類輸出,類似地可以為一個實例分配多個標簽:

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

在這種情況下,用來訓練分類器的多個向量被賦予多個標記,MultiLabelBinarizer被用來二進制化多個標簽的二維數組,使之用來訓練。predict()函數返回帶有多個標記的二維數組作為每個實例的結果。

中文文檔: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(覺得不錯麻煩給個 Star,我們一直在努力)

貢獻者:https://github.com/apachecn/scikit-learn-doc-zh#貢獻者

有興趣的大佬們也可以和我們一起來維護,持續更新中 。。。

機器學習交流群:?629470233

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,923評論 6 535
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,740評論 3 420
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,856評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,175評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,931評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,321評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,383評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,533評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,082評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,891評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,067評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,618評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,319評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,732評論 0 27
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,987評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,794評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,076評論 2 375

推薦閱讀更多精彩內容