我們一般解決機(jī)器學(xué)習(xí)問(wèn)題的步驟如下:
1.拿到數(shù)據(jù)集,對(duì)數(shù)據(jù)集進(jìn)行清洗。數(shù)據(jù)集清洗一般包括以下幾個(gè)方面:重復(fù)值處理,缺失值處理,字符型數(shù)值處理(因?yàn)閟klearn機(jī)器學(xué)習(xí)算法只能識(shí)別數(shù)值型的數(shù)據(jù)),特征提?。ㄟ@就需要我們弄清楚每個(gè)特征的意義,選取對(duì)結(jié)果影響較大的特征),數(shù)據(jù)集切分,劃分訓(xùn)練集和測(cè)試集。
2.建立模型。我們的機(jī)器學(xué)習(xí)問(wèn)題分為兩類,分類(Classifier)和回歸(Regression),我們根據(jù)我們的目標(biāo)來(lái)選擇合適的算法,像邏輯回歸,線性回歸,樸素貝葉斯,支持向量機(jī)等。
3.模型評(píng)估,對(duì)模型的預(yù)測(cè)結(jié)果做一個(gè)評(píng)估。通常我們選用的評(píng)估標(biāo)準(zhǔn)有精度(Accuracy),Recall值,F(xiàn)pr,F(xiàn)1-score,Roc_Auc值等等。
4.模型優(yōu)化,如果模型的各項(xiàng)評(píng)價(jià)指標(biāo)比較低,那么我們可以從以下幾個(gè)方面去優(yōu)化我們的模型:1.再次整理數(shù)據(jù)集,2.優(yōu)化特征選擇,3.優(yōu)化模型參數(shù)
交叉驗(yàn)證是評(píng)估機(jī)器學(xué)習(xí)算法非常重要的手段,那我們要怎么理解交叉驗(yàn)證這種方法呢?
在機(jī)器學(xué)習(xí)中數(shù)據(jù)對(duì)我們而言是非常寶貴的,如果用整個(gè)數(shù)據(jù)來(lái)訓(xùn)練模型,再用這個(gè)模型去預(yù)測(cè)已有的數(shù)據(jù),那么預(yù)測(cè)的效果一定非常的好,因?yàn)槟P鸵呀?jīng)學(xué)習(xí)過(guò)了該數(shù)據(jù)。那么這個(gè)預(yù)測(cè)效果來(lái)講是沒(méi)有多大參考價(jià)值的,因?yàn)槲覀冃枰P皖A(yù)測(cè)未知數(shù)據(jù)的效果要好。
所以我們首先要做的就是對(duì)數(shù)據(jù)集進(jìn)行劃分,將其劃分為訓(xùn)練集和測(cè)試集,用訓(xùn)練集來(lái)建立模型,用測(cè)試集來(lái)評(píng)估模型。
如圖所示,我們將這個(gè)數(shù)據(jù)集按照7:3的比例劃分為訓(xùn)練集和測(cè)試集,這個(gè)比例可以自己指定。

當(dāng)然這種數(shù)據(jù)集劃分還是稍微有一點(diǎn)缺點(diǎn),如果訓(xùn)練集數(shù)據(jù)比較復(fù)雜,而測(cè)試集數(shù)據(jù)比較簡(jiǎn)單,那么模型的表現(xiàn)效果會(huì)非常的好。如果訓(xùn)練集數(shù)據(jù)比較簡(jiǎn)單,而測(cè)試集數(shù)據(jù)比較負(fù)責(zé),那么模型的表現(xiàn)效果會(huì)非常的差。所以這樣得到的模型結(jié)果存在極大的不準(zhǔn)確性,為了使得我們訓(xùn)練出來(lái)的模型能準(zhǔn)確的反應(yīng)其真實(shí)效果,我們引入了交叉驗(yàn)證。
我們用下面這張圖來(lái)說(shuō)明交叉驗(yàn)證到底是怎么回事?

1.我們將訓(xùn)練集(trainning set)分為三份,當(dāng)然我們也可以分為五份,十份甚至更多,這個(gè)可以自己指定,我們就以三份為例。
2.我們選擇其中兩份作為訓(xùn)練集,另外一份作為驗(yàn)證集,這樣就產(chǎn)生了三種情況。1和2預(yù)測(cè)3,1和3預(yù)測(cè)2,2和3預(yù)測(cè)1,那么我們最終的結(jié)果就是三個(gè)模型的平均值,均值更能代表我們模型的準(zhǔn)確性。這是一個(gè)邊訓(xùn)練邊測(cè)試的過(guò)程,能使我們更好的把握模型的準(zhǔn)確性。
下面我們用代碼來(lái)實(shí)現(xiàn)我們的上述過(guò)程,我們使用sklearn庫(kù)封裝好的數(shù)據(jù)集iris數(shù)據(jù)集。我們先使用sklearn.model_selection.train_test_split函數(shù)對(duì)數(shù)據(jù)集進(jìn)行切分。
from sklearn import datasets
from sklearn.model_selection import train_test_split,cross_val_score
from sklearn.linear_model import LogisticRegression
iris = datasets.load_iris()
X = iris.data
y = iris.target
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=0)
#train_test_split函數(shù)有四個(gè)返回值;test_size是切分的比例,可以自己指定;random_state是指定隨機(jī)的種子。
Lr = LogisticRegression()
Lr.fit(X_train,y_train)
Lr.score(X_test,y_test)
0.8888888888888888#邏輯回歸模型的精度為0.89
接下來(lái)我們使用sklearn.model_selection.cross_val_score函數(shù)對(duì)模型做一個(gè)交叉驗(yàn)證。
from sklearn import datasets
from sklearn.model_selection import train_test_split,cross_val_score
from sklearn.linear_model import LogisticRegression
iris = datasets.load_iris()
X = iris.data
y = iris.target
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=0)
Lr = LogisticRegression()
scores = cross_val_score(Lr,X_train,y_train,cv=5)
print(scores)
[0.90909091 1. 0.95238095 0.9047619 0.94736842]
print(scores.mean())
0.9427204374572795
由上述結(jié)果可以看出,我們做了交叉驗(yàn)證以后,模型的精度為0.94,這個(gè)結(jié)果高于之前的0.88,且更能代表模型的準(zhǔn)確性。cross_val_score需要傳入四個(gè)參數(shù)(模型,特征數(shù)據(jù),標(biāo)簽數(shù)據(jù),cv交叉驗(yàn)證的次數(shù),也就是我們上圖所畫出的將數(shù)據(jù)分為幾份,同時(shí)也有幾個(gè)返回值)。
接下來(lái)我們?cè)僬f(shuō)一個(gè)交叉驗(yàn)證中常用的KFold函數(shù),它也是一個(gè)數(shù)據(jù)集劃分函數(shù),它的返回值是訓(xùn)練集和測(cè)試集的索引值。舉一個(gè)例子:
import numpy as np
from sklearn.model_selection import KFold
data = np.arange(72).reshape(12,6)
kf = KFold(n_splits = 4,shuffle = False)
for train_index,test_index in kf.split(data):
print('train_index:%s' % train_index,'test_index:%s' % test_index)
train_index:[ 3 4 5 6 7 8 9 10 11] test_index:[0 1 2]
train_index:[ 0 1 2 6 7 8 9 10 11] test_index:[3 4 5]
train_index:[ 0 1 2 3 4 5 9 10 11] test_index:[6 7 8]
train_index:[0 1 2 3 4 5 6 7 8] test_index:[ 9 10 11]
KFold函數(shù)將我們12個(gè)樣本的索引值分成了4組(n_splits = 4),取三組索引作為訓(xùn)練集索引,一組作為測(cè)試集索引。kf.split為經(jīng)常使用的屬性,對(duì)需要處理的數(shù)據(jù)集進(jìn)行劃分,同時(shí)該值也可以傳入cv參數(shù),cv=kf.split(data)。
機(jī)器學(xué)習(xí)算法的預(yù)測(cè)結(jié)果也存在著偶然性,所以為了獲得更準(zhǔn)確的結(jié)果,我們通過(guò)交叉驗(yàn)證,得到多個(gè)結(jié)果,取其平均值,這個(gè)均值更能代表我們模型的準(zhǔn)確性。