sklearn的基本使用

https://cloud.tencent.com/developer/news/58202javascript

簡介html

今天爲你們介紹的是scikit-learnsklearn是一個Python第三方提供的很是強力的機器學習庫,它包含了從數據預處理到訓練模型的各個方面。在實戰使用scikit-learn中能夠極大的節省咱們編寫代碼的時間以及減小咱們的代碼量,使咱們有更多的精力去分析數據分佈,調整模型和修改超參。(sklearn爲包名java

基本歸納python

sklearn擁有能夠用於監督和無監督學習的方法,通常來講監督學習使用的更多。sklearn中的大部分函數能夠歸爲估計器(Estimator)轉化器(Transformer)兩類。算法

估計器(Estimator)其實就是模型,它用於對數據的預測或迴歸。基本上估計器都會有如下幾個方法:json

fit(x,y):傳入數據以及標籤便可訓練模型,訓練的時間和參數設置,數據集大小以及數據自己的特色有關數組

score(x,y)用於對模型的正確率進行評分(範圍0-1)。但因爲對在不一樣的問題下,評判模型優劣的的標準不限於簡單的正確率,可能還包括召回率或者是查準率等其餘的指標,特別是對於類別失衡的樣本,準確率並不能很好的評估模型的優劣,所以在對模型進行評估時,不要輕易的被score的得分矇蔽。bash

predict(x)用於對數據的預測,它接受輸入,並輸出預測標籤,輸出的格式爲numpy數組。咱們一般使用這個方法返回測試的結果,再將這個結果用於評估模型。dom

轉化器(Transformer)用於對數據的處理,例如標準化、降維以及特徵選擇等等。同與估計器的使用方法相似:機器學習

fit(x,y):該方法接受輸入和標籤,計算出數據變換的方式。

transform(x):根據已經計算出的變換方式,返回對輸入數據x變換後的結果(不改變x)

fit_transform(x,y) :該方法在計算出數據變換方式以後對輸入x就地轉換。

以上僅僅是簡單的歸納sklearn的函數的一些特色。sklearn絕大部分的函數的基本用法大概如此。可是不一樣的估計器會有本身不一樣的屬性,例如隨機森林會有Feature_importance來對衡量特徵的重要性,而邏輯迴歸有coef_存放回歸係數intercept_則存放截距等等。而且對於機器學習來講模型的好壞不只取決於你選擇的是哪一種模型,很大程度上與你超參的設置有關。所以使用sklearn的時候必定要去看看官方文檔,以便對超參進行調整。

舉個例子

導入數據及數據預處理

sklearndatasets中提供一些訓練數據,咱們可使用這些數據來進行分類或者回歸等等,以此熟悉sklearn的使用。

以下面代碼所示咱們讀取了鳶尾屬植物的分類數據集。load_iris()返回的是一個相似字典的對象經過關鍵字則能夠獲取對應的數據。

如今咱們已經讀取了數據,首先第一件事應當是查看數據的特色。咱們能夠看到標籤總共有三個,因此該數據要解決的是一個三分類問題。接着咱們要去查看數據特徵,用pandasDataFrame展現是一個很好選擇。

 

咱們能夠看到一條數據對應了4個連續特徵,接着應當查看一些數據集的缺失值的比例,這一步很是重要,若是數據集中出現缺失值,在訓練模型的時候就會出現問題。

sklearnpreprocessing中有提供Imputer()處理缺失值的函數,它提供了中位數、均值、衆數等策略填充缺失值。可是不一樣狀況下處理不必定使用填充來處理缺失值。所以在遇到缺失值的時候要慎重處理。幸運的是咱們這個數據集中沒有缺失值,這樣節省了咱們處理缺失值的時間。接下來要判斷數據集的樣本類別是否均衡。

很是幸運,咱們的樣本類別的比例剛好是1:1:1,若是咱們樣本比例失衡嚴重,那麼咱們可能須要對失衡的比例作一些調整,例如重採樣欠採樣等等。如今數據集看上去沒有什麼大的問題了,可是在訓練以前,咱們仍是應當對數據進行標準化處理。

模型訓練以前,咱們要對數據進行預處理。sklearn中的preprocessing模塊提供很是多的數據歸一化的類。

標準化以後的數據不只能夠提升模型的訓練速度,而且不一樣的標準會帶來不同的好處。

例如,z-score 標準化將樣本的特徵值轉換到同一量綱下,使得不一樣特徵之間有可比性。以上咱們就是使用了z-score標準化,sklearnpreprocessing中還有一些其餘的標準化方法,有興趣的朋友能夠查看官方文檔。

訓練模型

在處理好數據以後咱們就能夠訓練模型了,以多元邏輯迴歸爲例

這裏咱們的邏輯迴歸使用OVR多分類方法,

OvR把多元邏輯迴歸,看作二元邏輯迴歸。具體作法是,每次選擇一類爲正例,其他類別爲負例,而後作二元邏輯迴歸,獲得第該類的分類模型。最後得出多個二元迴歸模型。按照各個類別的得分得出分類結果。

模型優化

模型選擇

 

對於一個分類任務,咱們能夠按照以上的圖來選擇一個比較合適的解決方法或者模型,但模型的選擇並非絕對的,事實上不少狀況下你會去試驗不少的模型,才能比較出適合該問題的模型。

數據劃分

咱們可使用交叉驗證或其餘劃分數據集的方法對數據集屢次劃分,以得出模型平均的性能而不是偶然結果。sklearn有不少劃分數據集的方法,它們都在model_selection裏面,經常使用的有

K折交叉驗證:

KFold 普通K折交叉驗證

StratifiedKFold(保證每一類的比例相等)

留一法:

LeaveOneOut (留一)

LeavePOut (留P驗證,當P = 1 時變成留一法)

隨機劃分法:

ShuffleSplit (隨機打亂後劃分數據集)

StratifiedShuffleSplit (隨機打亂後,返回分層劃分,每一個劃分類的比例與樣本原始比例一致)

以上方法除了留一法都有幾個一樣的參數:

n_splits:設置劃分次數

random_state:設置隨機種子

以上的劃分方法各有各的優勢,留一法、K折交叉驗證充分利用了數據,但開銷比隨機劃分要高,隨機劃分方法能夠較好的控制訓練集與測試集的比例。(經過設置train_size參數)。關於劃分數據集的使用能夠參照上面例子中的ShuffleSplit的用法,其餘的函數使用方法大同小異,詳細可查看官方文檔。

超參的搜索

咱們上面已經初步得出模型,而且效果看起來還不錯,因此咱們如今應該下想辦法進一步優化這一個模型了。

咱們在調參的時候須要將數據集分爲三部分,分別是:訓練集、驗證集以及測試集。訓練集用於模型的訓練,而後咱們根據驗證集的結果去調整出泛化能力較強的模型,最後經過測試集得出模型的泛化能力。若是隻把數據分爲訓練集和測試集,也許你能調出對於測試集最合適的參數,但模型的泛化能力也許並無在測試集上表現的那麼強。

因爲鳶尾屬植物的數據集並不大,若是將數據分爲三部分的話,訓練數據就太少了,可能提升不了模型的性能。在此只是簡單的介紹sklearn中的調參方法。

model_seletion裏面還提供自動調參的函數,以格搜索(GridSearchCV)爲例。

經過傳入字典,對比使用不一樣的參數的估計器的效果,得出最優的參數。這裏是對邏輯迴歸的精度進行調整。另外咱們還可使用不一樣的指標來選擇參數,不一樣的指標在sklearn.metrics

特徵選擇

當特徵特別多的時候,且有冗餘的狀況下,對特徵進行選擇不只能使訓練速度加快,還能夠排除一些負面特徵的干擾。sklearnfeature_seletion提供了它許多特徵選取函數,目前包括單變量選擇方法遞歸特徵消除算法。它們均爲轉化器,故在此不舉例說明如何使用。

除了使用feature_seletion的方法選取特徵外,咱們也能夠選擇那些帶有特徵選擇的模型進行選擇特徵,例如隨機森林會根據特徵的重要程度對特徵打分。

Pineline

使用pineline能夠按順序構建從數據處理到和訓練模型的整個過程。pineline中間的步驟必須轉化器(對數據進行處理)。使用pineline的好處就是能夠封裝一個學習的過程,使得從新調用這個過程變得更加方便。中間的過程用多個二元組組成的列表表示。

上面的封裝的估計器,會先用PCA將數據降至兩維,在用邏輯迴歸去擬合。

小結

本期介紹sklearn只作簡單介紹,還有一些方面沒有涉及,例如特徵抽取、降維等等,這些在官方文檔中有詳細使用方法及參數介紹。

參考來源

http://scikit-learn.org/stable/documentation.html 官方文檔

 

https://www.jianshu.com/p/c6bfc9052325

 

前言

於sklearn的使用來講,目前只是想成爲一名調包俠,可是調包俠起碼也得知道有哪些包能夠調,爲此找了一些教程想快速入門,經過一番查找,終於找到了一名大佬叫作莫煩寫的教程,教程短小實用,對我想快速瞭解sklearn來講是再適合不過了。
在教程裏完成sklearn的通常使用的教程以後,爲了鞏固,爲此寫此筆記,加深理解和往後的複習。

通用模板

實例化

對於sklearn這個庫來講,是用面向對象的思想來使用的。
就是每種算法都是一個對象,要使用某種算法解決問題,能夠將其import進來,此時它只是個對象,只有在實例化以後才能夠對數據學習和預測

from sklearn.neighbors import KNeighborsClassifier obj = KNeighborsClassifier() 

此時實例obj能夠對數據訓練學習以後再對數據進行預測了,可是此時並無數據
不過sklearn中有數據供咱們使用

獲取數據

from sklearn import datasets iris = datasets.load_iris() x = iris.data y = iris.target 

導入的數據是個訓練集,並不能直接傳遞給實例對其學習,由於實例須要特徵和標籤才能開始學習(這個實例是這個狀況的,無監督學習如今還不那麼清楚是個什麼樣的狀況)
不過特徵和標籤都存儲在data和target標籤中,能夠輕鬆的得到

開始訓練和預測

這個時候,實例有了,數據也有了,能夠開始對數據訓練和學習了

obj.fit(x, y)
y_pred = obj.predict(x[:4, :]
print(y - y_pred) 

輸出結果:

[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 -1 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 

準確度仍是蠻高的,到此已經完成了一個機器學習的基本過程

劃分訓練集

通常把訓練集劃分爲訓練集和測試集,這樣來驗證算法的準確性比較好

from sklearn.model_selection import train_test_split x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3) 

其中參數test_size=0.3表明將把訓練集的30%數據當作測試集使用
如今有了訓練集和測試集,重複以前的步驟,對訓練集訓練:

knn = KNeighborsClassifier()
knn.fit(x_train, y_train)
y_pred = knn.predict(x_test)
print(y_pred - y_test) 

輸出結果:

[ 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 

注意,每次運行的輸出結果可能不同

參數獲取

對於每一個學習到的模型,也就是一個假設函數,都有一些參數
還有預測的時候也是有參數設置的
對於這兩個參數的獲取,能夠經過實例化後的實例的coef_,intercept_屬性和get_params()得到
因爲分類好像沒有實例的那幾個屬性,換個線性迴歸的的模型:

from sklearn import datasets from sklearn.linear_model import LinearRegression loaded_data = datasets.load_boston() data_X = loaded_data.data data_y = loaded_data.target model = LinearRegression() model.fit(data_X, data_y) y_pred = model.predict(data_X[:4, :]) print(model.coef_) print(model.intercept_) 

輸出:

[-1.07170557e-01 4.63952195e-02 2.08602395e-02 2.68856140e+00 -1.77957587e+01 3.80475246e+00 7.51061703e-04 -1.47575880e+00 3.05655038e-01 -1.23293463e-02 -9.53463555e-01 9.39251272e-03 -5.25466633e-01] 36.49110328036133 

得到訓練學習時設置的參數:

print(model.get_params()) # {'n_jobs': 1, 'copy_X': True, 'normalize': False, 'fit_intercept': True} 

評估模型

最常常用的評估方法,越接近於1的效果越好:

print(model.score(data_X, data_y)) 
相關文章
相關標籤/搜索