交叉驗(yàn)證——Cross-validation

交叉驗(yàn)證是建立模型后進(jìn)行參數(shù)調(diào)整和模型檢驗(yàn)的一個(gè)步驟涮坐。本文就sklearn自帶的鳶尾花數(shù)據(jù)集,進(jìn)行基本的建模思路整理和交叉驗(yàn)證梳理关摇。

注:
鳶尾花案例的背景是屑埋,通過已知(歷史)花的數(shù)據(jù)和對(duì)應(yīng)的分類,訓(xùn)練出模型結(jié)果惋嚎,從而得到分類模型杠氢。
實(shí)現(xiàn)效果是可以預(yù)測鳶尾花的分類。

建立model的基本思路與步驟

  • 首先另伍,導(dǎo)入相應(yīng)模塊
  • 下載數(shù)據(jù)集鼻百,定義好x/y
  • 分割數(shù)據(jù)集
  • 選擇算法對(duì)訓(xùn)練集訓(xùn)練
  • 預(yù)測分類結(jié)果
  • 檢驗(yàn)得分:交叉驗(yàn)證
  1. 首先,導(dǎo)入相應(yīng)模塊摆尝;
  2. 下載數(shù)據(jù)集温艇,定義好x/y
import numpy as np
from sklearn import datasets
from sklearn.cross_validation import train_test_split #用于分割數(shù)據(jù)集
from sklearn.neighbors import KNeighborsClassifier #引入算法

iris=datasets.load_iris()   #下載數(shù)據(jù)集
iris_X=iris.data               #定義屬性(x)
iris_y=iris.target             #定義分類(y)

print(iris_X[:2,:])             #查看一下屬性的前兩行
print(iris_y)                   #查看分類

[[5.1 3.5 1.4 0.2]
[4.9 3. 1.4 0.2]]
[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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2]

  1. 分割數(shù)據(jù)集——將數(shù)據(jù)分為為訓(xùn)練集(70% train)和測試集(30% test):trian_test_split()

  2. 選擇算法對(duì)訓(xùn)練集訓(xùn)練——用knn算法對(duì)數(shù)據(jù)進(jìn)行訓(xùn)練:knn.fit(X_train,y_train)

#分割數(shù)據(jù)集,同時(shí)對(duì)數(shù)據(jù)做亂序
X_train,X_test,y_train,y_test=train_test_split(iris_X,iris_y,test_size=0.3)

# print(y_train)   #從這里可以看到堕汞,數(shù)字已經(jīng)被打亂

knn=KNeighborsClassifier()  
knn.fit(X_train,y_train)

[0 0 2 1 2 1 0 0 1 2 0 1 0 2 2 0 1 1 1 1 1 2 2 1 0 2 1 1 1 0 0 0 0 0 1 1 0
2 0 2 0 2 2 2 2 2 1 0 1 1 0 2 2 0 0 1 2 1 0 2 1 2 1 1 1 0 1 2 2 2 0 0 1 0
1 1 0 1 2 2 0 2 0 1 0 2 2 2 0 2 1 0 0 2 0 2 2 1 1 0 2 1 1 2 2]
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=1, n_neighbors=5, p=2,
weights='uniform')

  1. 預(yù)測分類結(jié)果——把測試集(test)代入訓(xùn)練得到的結(jié)果:knn.predict()
  2. 檢驗(yàn)——對(duì)預(yù)測結(jié)果與實(shí)際數(shù)值進(jìn)行效果對(duì)比(驗(yàn)證是否選用該模型勺爱。接下來引入交叉驗(yàn)證)
print(knn.predict(X_test))
print(y_test)

[1 1 1 1 2 2 2 1 2 2 2 0 0 0 2 1 1 1 2 2 1 2 2 0 0 0 1 0 0 0 0 1 1 1 2 1 2
0 1 1 0 2 0 2 0]
[1 1 1 1 2 2 2 1 2 1 2 0 0 0 2 1 1 1 2 2 1 2 2 0 0 0 1 0 0 0 0 1 1 1 2 1 2
0 1 2 0 2 0 2 0]

交叉驗(yàn)證

交叉驗(yàn)證的基本思想是在某種意義下將原始數(shù)據(jù)(dataset)進(jìn)行分組,一部分做為訓(xùn)練集(train set),另一部分做為驗(yàn)證集(validation set or test set),首先用訓(xùn)練集對(duì)分類器進(jìn)行訓(xùn)練,再利用驗(yàn)證集來測試訓(xùn)練得到的模型(model),以此來做為評(píng)價(jià)分類器的性能指標(biāo)。
而對(duì)一個(gè)數(shù)據(jù)集進(jìn)行多次(cv)交叉驗(yàn)證臼朗,并對(duì)每一次的得分求平均得到最客觀的評(píng)價(jià)分?jǐn)?shù)可以作為最終評(píng)分邻寿。
因此,它的作用就是:用于參數(shù)調(diào)整和模型選擇/評(píng)價(jià)视哑。


用于模型選擇——模型評(píng)價(jià)分的高低

from sklearn.datasets import load_iris
from sklearn.cross_validation import train_test_split
from sklearn.neighbors import KNeighborsClassifier

iris=load_iris()
X=iris.data
y=iris.target

X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=4)
knn=KNeighborsClassifier(n_neighbors=5)
# 表示考慮數(shù)據(jù)點(diǎn)附近5個(gè)點(diǎn)的值并綜合绣否,得到預(yù)測值
knn.fit(X_train,y_train)
print(knn.score(X_test,y_test))   #只做一次分組測試,打印準(zhǔn)確率

0.9736842105263158

訓(xùn)練五次獲得綜合評(píng)價(jià)

from sklearn.datasets import load_iris
from sklearn.cross_validation import train_test_split
from sklearn.neighbors import KNeighborsClassifier

iris=load_iris()
X=iris.data
y=iris.target


from sklearn.cross_validation import cross_val_score
knn=KNeighborsClassifier(n_neighbors=5)
scores=cross_val_score(knn,X,y,cv=5,scoring='accuracy') 
# 分成5組不同的訓(xùn)練&測試集挡毅;得分標(biāo)準(zhǔn)定位 準(zhǔn)確度(分類模型通常以準(zhǔn)確度為準(zhǔn))
print(scores.mean())   #綜合五次訓(xùn)練得分的平均分

0.9733333333333334

該結(jié)果接近滿分蒜撮,說明模型分類效果較好」虺剩可以采用該模型段磨。

用于調(diào)整參數(shù)

循環(huán)找到合適的k值

KNN算法中k值的大小,代表分類時(shí)考慮訓(xùn)練數(shù)據(jù)點(diǎn)周圍的數(shù)據(jù)點(diǎn)的個(gè)數(shù)耗绿。不同的k的取值苹支,分類結(jié)果不同。我們可以用循環(huán)的方法對(duì)k進(jìn)行循環(huán)误阻,根據(jù)不同k值對(duì)應(yīng)的得分(上述交叉驗(yàn)證的評(píng)價(jià)得分)決定k的取值债蜜,從而確定最終的模型和模型評(píng)價(jià)晴埂。

  • 用準(zhǔn)確度評(píng)價(jià)
from sklearn.datasets import load_iris
from sklearn.cross_validation import train_test_split
from sklearn.neighbors import KNeighborsClassifier

iris=load_iris()
X=iris.data
y=iris.target

# X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=4)
# knn=KNeighborsClassifier(n_neighbors=5)
# knn.fit(X_train,y_train)
# print(knn.score(X_test,y_test))
# knn=KNeighborsClassifier(n_neighbors=5)
# scores=cross_val_score(knn,X,y,cv=5,scoring='accuracy')                             #分成5組
print(scores.mean())   #綜合五次訓(xùn)練得分的平均分

from sklearn.cross_validation import cross_val_score
import matplotlib.pyplot as plt
k_range=range(1,31)
k_scores=[]
for k in k_range:
    knn=KNeighborsClassifier(n_neighbors=k)
    scores=cross_val_score(knn,X,y,cv=10,scoring='accuracy') #for classification   分類的評(píng)價(jià)用準(zhǔn)確度
    k_scores.append(scores.mean())
    
plt.plot(k_range,k_scores)
plt.xlabel('Value of K for KNN')
plt.ylabel('Cross_Validated Accuracy')
plt.show()
image.png

上圖是以準(zhǔn)確度為評(píng)價(jià)標(biāo)準(zhǔn),k從1~31對(duì)應(yīng)的score的值
這組數(shù)據(jù)選擇12~18至間的數(shù)字會(huì)比較好寻定。

from sklearn.datasets import load_iris
from sklearn.cross_validation import train_test_split
from sklearn.neighbors import KNeighborsClassifier

iris=load_iris()
X=iris.data
y=iris.target

from sklearn.cross_validation import cross_val_score
import matplotlib.pyplot as plt
k_range=range(1,31)
k_scores=[]
for k in k_range:
    knn=KNeighborsClassifier(n_neighbors=k)
    loss=-cross_val_score(knn,X,y,cv=10,scoring='neg_mean_squared_error')  # for regression 儒洛,回歸的評(píng)價(jià)用 平均方差
   #scores=cross_val_score(knn,X,y,cv=10,scoring='accuracy') #for classification   對(duì)比regression發(fā)現(xiàn),只有前面的負(fù)號(hào)和評(píng)分方式不同狼速。
    k_scores.append(loss.mean())
    
plt.plot(k_range,k_scores)
plt.xlabel('Value of K for KNN')
plt.ylabel('Cross_Validated Accuracy')
plt.show()
image.png

上圖是用平均方差值來作為評(píng)價(jià)標(biāo)準(zhǔn)(越接近0說明擬合效果越好)琅锻,k選擇13~18是比較合適的。
(回歸模型的評(píng)價(jià)一般用R^2 值來判斷向胡,R^2越接近1恼蓬,也就是誤差平方和越接近0,擬合效果越好)

上述兩個(gè)不同評(píng)價(jià)標(biāo)準(zhǔn)下的數(shù)值是調(diào)參的過程捷枯,可以由此定下k的值滚秩,從而確定模型。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末淮捆,一起剝皮案震驚了整個(gè)濱河市郁油,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌攀痊,老刑警劉巖桐腌,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異苟径,居然都是意外死亡案站,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門棘街,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蟆盐,“玉大人,你說我怎么就攤上這事遭殉∈遥” “怎么了?”我有些...
    開封第一講書人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵险污,是天一觀的道長痹愚。 經(jīng)常有香客問我唱遭,道長寓免,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任潮售,我火速辦了婚禮蚁飒,結(jié)果婚禮上动壤,老公的妹妹穿的比我還像新娘。我一直安慰自己淮逻,他們只是感情好狼电,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開白布蜒灰。 她就那樣靜靜地躺著弦蹂,像睡著了一般肩碟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凸椿,一...
    開封第一講書人閱讀 52,196評(píng)論 1 308
  • 那天削祈,我揣著相機(jī)與錄音,去河邊找鬼脑漫。 笑死髓抑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的优幸。 我是一名探鬼主播吨拍,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼网杆!你這毒婦竟也來了羹饰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤碳却,失蹤者是張志新(化名)和其女友劉穎队秩,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昼浦,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡馍资,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了关噪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸟蟹。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖使兔,靈堂內(nèi)的尸體忽然破棺而出建钥,到底是詐尸還是另有隱情,我是刑警寧澤火诸,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布锦针,位于F島的核電站,受9級(jí)特大地震影響置蜀,放射性物質(zhì)發(fā)生泄漏奈搜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一盯荤、第九天 我趴在偏房一處隱蔽的房頂上張望馋吗。 院中可真熱鬧,春花似錦秋秤、人聲如沸宏粤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绍哎。三九已至来农,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間崇堰,已是汗流浹背沃于。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留海诲,地道東北人繁莹。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像特幔,于是被迫代替她去往敵國和親咨演。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容