十分鐘|透過sklearn上手你的第一個機器學習例項
機器學習是一門需要不斷實驗和試錯的科學,擁有大量的實戰經驗幾乎比擁有一個好的演算法還要重要,沒有一個機器學習模型能夠對所有的問題有效。
因此,想要學好機器學習一定要有非常多的專案練習作為支撐,從實踐中探尋機器學習的技法。
但一個機器學習專案的實施需要實踐者擁有
豐富的機器學習理論
並具有
將理論知識實踐的能力
,這讓很多機器學習小白望而卻步。
本文將利用sklearn中自帶的資料集(鳶尾花資料集),並透過邏輯迴歸演算法實現對鳶尾花的分類。
從原理到實戰應用,擺脫枯燥的公式,由淺入深,為小白快速上手機器學習例項奠定堅實的基礎!
本文包含以下內容:1。機器學習庫 scikit-learn2。sklearn的使用與安裝
如何使用sklearn
sklearn安裝
3。上手案例—基於邏輯迴歸的鳶尾花分類
資料獲取
資料預處理
訓練模型
模型評估與最佳化
預測結果
- 機器學習庫 sklearn -
scikit-learn簡稱sklearn,是機器學習中一個常用的python第三方模組,對常用的機器學習演算法進行了封裝。
支援
分類,迴歸,降維和聚類四大機器學習演算法
,還包括了
資料預處理
和
模型評估
兩大模組。
自2007年釋出以來,scikit-learn已經成為Python重要的機器學習庫了,sklearn擁有著完善的文件,上手容易,具有著
豐富的API
,在學術界頗受歡迎。
其中封裝了大量的機器學習演算法,內建了大量資料集,節省了獲取和整理資料集的時間。利用這幾大模組的優勢,大大的提高機器學習的效率。
- sklearn 使用與安裝 -
01 如何使用sklearn
如何學習sklearn?其實最好的教程就是官方文件。
sklearn官網:
http://
scikit-learn。org/stable
/index。html
但官方文件非常詳細,許多人對官方文件的理解和結構上都不能很好地把握,想要學習但不知從何學起。
其實官方文件非常貼心,如果你仔細檢視就會發現官方文件給出了
明確的學習路徑
:
由圖中,可以看到庫的演算法主要有四類:
分類,迴歸,聚類,降維
。其中:·常用的迴歸:線性、決策樹、SVM、KNN ;整合迴歸:隨機森林、Adaboost、GradientBoosting、Bagging、ExtraTrees
·常用的分類:線性、決策樹、SVM、KNN,樸素貝葉斯;整合分類:隨機森林、Adaboost、GradientBoosting、Bagging、ExtraTrees
·常用聚類:k均值(K-means)、層次聚類(Hierarchical clustering)、DBSCAN
·常用降維:LinearDiscriminantAnalysis、PCA
藍色圓圈是判斷條件,綠色方框是可以選擇的演算法
,我們可以根據自己的
資料特徵和任務目標
去找一條自己的操作路線。
02 sklearn 安裝
使用pip直接安裝:
pip install scikit-learn
使用Anaconda安裝,推薦Anaconda,因為裡面已經內建了NumPy,SciPy等常用工具。
conda install scikit-learn
安裝完成後可以在python中檢查一下版本,import sklearn不報錯,則表示安裝成功。
import sklearn
sklearn。__version__
- 上手案例 -
鳶(yuān )尾花分類相當於機器學習中的Helloworld問題,如果這個問題你能解開了那麼說明你機器學習已經入門了。
傳統的機器學習任務從開始到建模的一般流程就是:
獲取資料 — 資料預處理 — 訓練模型 — 模型評估 — 預測,分類,
我們將根據這個步驟一步一步展開,透過鳶尾花的4個屬性預測鳶尾花屬於3個種類的哪一類。
01 資料獲取
機器學習演算法往往需要大量的資料,在skleran中獲取資料通常採用兩種方式,一種是
使用自帶的資料集
,另一種是
建立資料集。
sklearn自帶了很多資料集,可以用來對演算法進行測試分析,免去了自己再去找資料集的煩惱。
sklearn的自帶資料集:
鳶尾花資料集:load_iris()
手寫數字資料集:load_digitals()
糖尿病資料集:load_diabetes()
乳腺癌資料集:load_breast_cancer()
波士頓房價資料集:load_boston()
體能訓練資料集:load_linnerud()
在這裡,我們匯入sklearn自帶的鳶尾花資料集:
#匯入sklearn的資料集
import sklearn。datasets as sk_datasets
iris = sk_datasets。load_iris()
iris_X = iris。data #匯入資料
iris_y = iris。target #匯入標籤
如果你想檢視資料集物件的屬性和方法:
from sklearn。datasets import load_iris
dir(load_iris())
檢視資料集描述:
from sklearn。datasets import load_iris
print(load_iris()。DESCR)
Iris也稱鳶尾花卉資料集,是常用的分類實驗資料集,由R。A。 Fisher於1936年收集整理的。
該資料集一共包含4個特徵變數,1個類別變數。共有150個樣本,iris是鳶尾植物,這裡儲存了其萼片和花瓣的長寬,共4個屬性,鳶尾植物分三類。如表17。2所示:
資料集詳細介紹:https://archive。ics。uci。edu/ml/datasets/Iris
02資料預處理
在機器學習中有一句名言:
資料和特徵決定了機器學習的上限,而模型和演算法的應用只是讓我們逼近這個上限
。
資料預處理階段是機器學習中不可缺少的一環,它會使得資料更加有效的被模型或者評估器識別。
這個階段主要包括
資料預處理
和
資料集劃分
兩個部分。
2.1 資料標準化
與普通的資料探勘不同,機器學習的資料還需要進行資料標準化,包括與樣本尺度歸一化、正則化等;此外還要根據資料特徵進行特徵二值化、one-hot編碼等操作,這些工作簡單可複製,經過資料預處理的資料能夠更好地幫助我們進行特徵處理。當我們拿到一批原始的資料時,需要思考以下問題:·對連續的數值型特徵進行標準化,使得均值為0,方差為1。·對類別型的特徵進行one-hot編碼。·將需要轉換成類別型資料的連續型資料進行二值化。·為防止過擬合或者其他原因,選擇是否要將資料進行正則化。·檢查有沒有缺失值,對確實的特徵選擇恰當方式進行彌補,使資料完整。……
為了使得訓練資料的標準化規則與測試資料的標準化規則同步,preprocessing中提供了很多的Scaler。
from sklearn import preprocessing
2.1.1 區間縮放(Min-Max scaling)
區間縮放法是將原始資料中特徵的取值區間轉換到[0 1]範圍。
公式如下:
使用preproccessing庫的MinMaxScaler類對資料進行區間縮放的程式碼如下:
from sklearn。preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(0,1))
iris_X = scaler。fit_transform(iris_X)
2.1.2 標準化(standardization)
將特徵資料的分佈調整成標準正太分佈,也叫高斯分佈,也就是使得資料的均值維0,方差為1。
公式如下:
使用preproccessing庫的StandardScaler類對資料進行標準化的程式碼如下:
from sklearn。preprocessing import StandardScaler
#標準化,返回值為標準化後的資料
StandardScaler()。fit_transform(iris。data)
2.1.3 歸一化 (Normalizer)
正則化是將樣本在向量空間模型上的一個轉換,經常被使用在分類與聚類中。其目的在於樣本向量在點乘運算或其他核函式計算相似性時,擁有統一的標準。
使用preproccessing庫的Normalizer類對資料進行歸一化的程式碼如下:
from sklearn。preprocessing import Normalizer
#歸一化,返回值為歸一化後的資料
Normalizer()。fit_transform(iris。data)
2.2 特徵二值化
特徵二值化的方法是將特徵的取值轉化為0或1。
例如,在房價預測問題中對於“是否為學區房”這一特徵,取值為1表示該房是學區房,反之則為0。
在sklearn中可以設定一個閾值,大於閾值的賦值為1,小於等於閾值的賦值為0。
使用preproccessing庫的Binarizer類對資料進行二值化的程式碼如下:
from sklearn。preprocessing import Binarizer
#二值化,閾值設定為3,返回值為二值化後的資料
Binarizer(threshold=3)。fit_transform(iris。data)
2.3 one-hot編碼
one-hot編碼是一種對離散特徵值的編碼方式,在LR模型中常用到,用於給線性模型增加非線效能力。
對於離散特徵,例如,性別:{男,女},可以採用one-hot編碼的方式將特徵表示為一個m維向量,其中m為特徵的取值個數。
使用preproccessing庫的OneHotEncoder類對資料進行one-hot編碼的程式碼如下:
from sklearn。preprocessing import OneHotEncoder
#對IRIS資料集的目標值進行one-hot編碼
OneHotEncoder()。fit_transform(iris。target。reshape((-1,1)))
2.4 缺失值計算
在實際應用中,我們得到的資料往往不完整,可以用以下方法進行處理:
·刪除:刪除含缺失值的資料,缺點是可能會導致資訊丟失;·補全:透過已有資料計算相應特徵的平均數、中位數、眾數等來補全缺失值;·預測:建立一個模型來“預測”缺失的資料;·虛擬變數:引入虛擬變數(dummy variable)來表徵是否有缺失,是否有補全;
用preproccessing庫的Imputer類對資料進行缺失值計算的程式碼如下:
from numpy import vstack, array, nan
from sklearn。preprocessing import Imputer
#缺失值計算,返回值為計算缺失值後的資料
#引數missing_value為缺失值的表示形式,預設為NaN
#對資料集新增一個樣本,4個特徵均賦值為NaN,表示資料缺失
#引數strategy為缺失值填充方式,預設為mean(均值)
Imputer()。fit_transform(vstack((array([nan, nan, nan, nan]), iris。data)))
2.5 資料集劃分
在預處理階段,還需要對資料集進行劃分,包括用來
訓練模型的訓練集
、以及
測試時所使用的測試集
。sklearn中的model_selection為我們提供了劃分資料集的方法。
鳶尾花資料集劃分:
import sklearn。model_selection as sk_model_selection
X_train,X_test,y_train,y_test = sk_model_selection。train_test_split(iris_X,iris_y,train_size=1/3,random_state=0)
引數說明: ·arrays:樣本陣列,包含特徵向量和標籤
·test_size: float-獲得多大比重的測試樣本 int - 獲得多少個測試樣本
·train_size: 同test_size ·random_state:int - 隨機種子(種子固定,實驗可復現) ·shuffle - 是否在分割之前對資料進行洗牌
後面我們訓練模型使用的資料集都基於此。
03訓練模型
如何為我們的分類問題選擇合適的機器學習演算法呢?如果我們以預測的準確率為指標,那麼最佳的方法是測試不同的演算法,然後透過交叉驗證選擇最好的一個。
但是,如果我們是為問題找到一個“合適”的演算法,也可以根據資料的特徵來進行選擇,
比如鳶尾花資料集分類標籤劃分為3類(0類、1類、2類),很好的適用於邏輯迴歸模型,因此下面將使用Scikit-learn官網的邏輯迴歸模型進行分析。
邏輯迴歸(Logistic regression)是一種廣義的線性迴歸,透過構造迴歸函式,來實現分類或者預測。
sklearn為所有模型提供了非常相似的介面,我們可以更加快速的熟悉所有模型的用法。
sklearn API:http://#module-sklearn。preprocessing
LogisticRegression迴歸模型在Sklearn。linear_model子類下,呼叫sklearn邏輯迴歸演算法步驟比較簡單,即:
(1) 匯入模型。呼叫邏輯迴歸LogisticRegression()函式。 (2) fit()訓練。呼叫fit(x,y)的方法來訓練模型,其中x為資料的屬性,y為所屬型別。 (3) predict()預測。利用訓練得到的模型對資料集進行預測,返回預測結果。
#匯入模型
from sklearn。model_selection import train_test_split
from sklearn。linear_model import LogisticRegression
#fit()訓練
lr = LogisticRegression()
lr。fit(X_train,y_train)
#predict
result = lr。predict(X_test)
print(‘預測的結果’,result)
print(‘實際的結果’,y_test)
輸出:
對預測結果與實際數值進行效果對比,驗證是否選用該模型,接下來進行模型評估:
04模型評估與最佳化
模型評估是準確預測的關鍵。評估指標是把“尺子”,用來評判模型優劣水平的演算法,不同的機器學習模型有著不同的“尺子”。
模型的評估和模型的最佳化相關功能在sklearn。model_select中。
除了使用extimator的score函式簡單粗略地評估模型之外,在sklearn。metrics針對不同的問題型別提供了各種評估指標並且可以建立使用者自定義的評估指標。
4.1 檢視預設引數
#預設引數
params=lr。get_params()
print(params)
引數詳解:
·C
:懲罰引數,預設值是1。0
·class_weight:
處理不平衡樣本資料
·dual:
是否轉化為對偶問題求解,預設是True
·fit_intercept=True
: 是否存在截距,預設存在
·intercept_scaling=1
: 僅在正則化項為‘liblinear’,且fit_intercept設定為True時有用
·max_iter:
最大迭代次數
·multi_class:
負責多分類問題中分類策略制定
·penalty:
正則化引數,L1和L2兩種引數可選
·random_state:
隨機種子
·tol:
殘差收斂條件,預設是0。0001
·solver :
solver引數決定了我們對邏輯迴歸損失函式的最佳化方法,有liblinear、lbfgs、newton-cg、sag四種演算法可以選擇。
4.2 檢視模型評分
#模型評分 準確率
s1 = lr。score(X_train,y_train)
s2 = lr。score(X_test,y_test)
print(‘在訓練集上的準確度評分’,s1)
print(‘在測試集上的準確度評分’,s2)
可以看到模型在訓練集和測試集上的評分都比較高,訓練集上的準確度評分略高於測試集,接下來我們透過交叉驗證來評估一下模型的泛化能力,是否能使用該模型進行預測。
4.3 交叉驗證
過擬合、欠擬合的模型狀態判斷是模型診斷中至關重要的一步。
常見的方法如:交叉驗證,繪製學習曲線等。
·過擬合模型過度擬合,在訓練集(training set)上表現好,但是在測試集上效果差。
·欠擬合(高偏差)模型擬合不夠,在訓練集(training set)上表現效果差,沒有充分的利用資料,預測的準確度低。
過擬合的基本調優思路是
增加訓練的資料量,降低模型複雜度。
欠擬合的基本調優思路是
提高特徵數量和質量,增加模型複雜度。
在此例項中我們可以採用交叉驗證的方法評估模型的泛化能力,並且能夠有效避免過擬合。
交叉選擇驗證法是從資料集中按一定比例隨機選取若干資料集作為訓練集用於模型的訓練,並將剩下的資料作為測試集;將測試集資料的自變數輸入模型,並將模型輸出的預測值與對應資料的因變數進行比較,判斷並統計準確率的方法。
sklearn中提供了cross_val_score進行交叉驗證,而ShuffleSplit則用來劃分資料集的。
X=iris_X
y=iris_y
from sklearn。model_selection import cross_val_score
from sklearn。model_selection import ShuffleSplit
cv_split = ShuffleSplit(n_splits=5, train_size=0。7, test_size=0。2)
score_ndarray = cross_val_score(logisticRegression_model, X, y, cv=cv_split)
print(score_ndarray)
score_ndarray。mean()
cross_val_score引數:·estimator:資料物件
·X:資料
·y:預測資料
·soring:呼叫的方法
·cv:交叉驗證生成器或可迭代的次數
·n_jobs:同時工作的cpu個數(-1代表全部)
·verbose:詳細程度
·fit_params:傳遞給估計器的擬合方法的引數
輸出:
返回物件是交叉驗證的評分組,5組資料的得分分別是100、96。7%、86。7%、90%、90%,綜合評分為92。7%,說明模型分類效果比較好,可以使用該模型。
4.4 模型最佳化
真正考驗水平的是根據對演算法的理解調節(超)引數,使模型達到最優。
診斷後的模型需要進行進一步調優,調優後的新模型需要重新診斷,這是一個反覆迭代不斷逼近的過程,需要不斷的嘗試,進而達到最優的狀態。
sklearn的子模組GridSearchCV, 是用來查詢最優引數的常用方法,只需要把引數的候選集輸入進去,就會自動的幫你進行排列組合,然後選出得分最高的那一組引數的排列。
#模型目標的引數
from sklearn。model_selection import GridSearchCV
penaltys=[‘l1’,‘l2’]#l1 或l2正則化
cs = [1。0,1。1,1。2,1。3,1。4,1。5]
param_grid = {‘penalty’:penaltys,‘C’:cs}
#print(param_grid)
gsc = GridSearchCV(LogisticRegression(),param_grid)
#print(x_train)
gsc。fit(X_train,y_train)
print(‘最佳模型引數的評分:’,gsc。best_score_)
print(‘最優引數’)
best_params = gsc。best_estimator_。get_params()
print(best_params)
for param_name in sorted(param_grid。keys()):
print(param_name,‘:’,best_params[param_name])
輸出:
最佳的模型引數評分為98%,接近滿分,說明預測的準確度非常高了。
05預測結果
經過最佳化後的模型已經達到最優狀態,準確度也很不錯,下面就可以直接進行預測:
#預測為某個型別的機率
result = lr。predict_proba(x_test)
一行資料有三個值,對應三種花的機率,機率最大即預測為該類別:
經過這一個步驟下來就已經完成了一個簡單的機器學習入門案例——基於邏輯迴歸的鳶尾花分類。
除此之外,鳶尾花資料集還可以利用其它方式進行分類預測,如KNN,決策樹、k-近鄰等,
你可以根據自己的需求進行針對訓練,還可以比較不同演算法下的預測準確度。
其實機器學習也只是看上去比較可怕而已,當我們將問題拆解,掌握正確的方法,按照明確的目標一步一步的學習下來,龐大的機器學習體系也非常容易上手。