機(jī)器學(xué)習(xí)入門-模型驗(yàn)證

混肴矩陣

from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
iris = load_iris()
clf = LogisticRegression()
clf.fit(iris.data,iris.target)
predicted = clf.predict(iris.data)
# 建立邏輯回歸模型
sum(iris.target == predicted)/len(iris.target)  # 計(jì)算準(zhǔn)確率
from sklearn.metrics import accuracy_score
accuracy_score(iris.target,predicted)
# 使用sklearn內(nèi)置accuracy_score計(jì)算準(zhǔn)確率
# 注意波势,準(zhǔn)確率并沒有多大意義
from sklearn.metrics import confusion_matrix
m=confusion_matrix(iris.target,predicted)
# 得到邏輯回歸模型混肴矩陣
%pylab inline
import seaborn
seaborn.heatmap(m) # 產(chǎn)生可視化混肴矩陣
from sklearn.metrics import classification_report
print(classification_report(iris.target,predicted))
# 分類報(bào)告废离,得到分類結(jié)果的準(zhǔn)確率廊勃,召回率滑进,F(xiàn)1钢颂,判斷模型好壞

交叉驗(yàn)證

Holdout驗(yàn)證

隨機(jī)選取大部分?jǐn)?shù)據(jù)作訓(xùn)練數(shù)據(jù)集钞它,剩余數(shù)據(jù)做驗(yàn)證數(shù)據(jù)集

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
iris = load_iris()
X = iris.data
y = iris.target  # 依然使用自帶dataset中的iris數(shù)據(jù)
from sklearn.model_selection import train_test_split
train_X,test_X,train_y,test_y=train_test_split(X,y,test_size = 0.33,random_state =123)
# train_test_split 將數(shù)據(jù)X,y分成訓(xùn)練數(shù)據(jù)和驗(yàn)證數(shù)據(jù)殊鞭,test_size 是驗(yàn)證數(shù)據(jù)集占總數(shù)據(jù)比例遭垛,random_state隨便輸,不同的值會(huì)產(chǎn)生不同數(shù)據(jù)集
clf = DecisionTreeClassifier()
clf.fit(train_X,train_y) # 使用訓(xùn)練數(shù)據(jù)集訓(xùn)練決策樹模型
from sklearn.metrics import accuracy_score
predicted = clf.predict(test_X)
accuracy_score(test_y,predicted) # 計(jì)算模型對(duì)驗(yàn)證數(shù)據(jù)集的準(zhǔn)確率
from sklearn.metrics import confusion_matrix
m = confusion_matrix(test_y,predicted)  #模型對(duì)驗(yàn)證數(shù)據(jù)集的混肴矩陣
print(m)
交叉驗(yàn)證

將數(shù)據(jù)隨機(jī)分成N份操灿,將N-1份作為訓(xùn)練數(shù)據(jù)锯仪,1份作為驗(yàn)證數(shù)據(jù),重復(fù)N次后平均

from sklearn.model_selection import KFold  
kf = KFold(n_splits=10)  #將數(shù)據(jù)分成10份
acc=[]
for train,test in kf.split(X):
    train_X,test_X,train_y,test_y = X[train],X[test],y[train],y[test]
    clf= DecisionTreeClassifier()
    clf.fit(train_X,train_y)
    predicted = clf.predict(test_X)
    acc.append(accuracy_score(test_y,predicted))
print(sum(acc)/len(acc)) #打印出驗(yàn)證的準(zhǔn)確率的平均值

另一種方法

from sklearn.model_selection import cross_val_score
acc = cross_val_score(clf,X=iris.data,y=iris.target,cv=10) #cv=10 表示做10次交叉驗(yàn)證
# acc 為10次交叉驗(yàn)證準(zhǔn)確率的array
print(acc.mean()) 
留一驗(yàn)證

N-1個(gè)數(shù)據(jù)做訓(xùn)練趾盐,1個(gè)數(shù)據(jù)做驗(yàn)證庶喜,重復(fù)N次(相當(dāng)與交叉驗(yàn)證分成N(=數(shù)據(jù)量)份)

from sklearn.model_selection import LeaveOneOut
res = []
loo = LeaveOneOut()
for train,test in loo.split(X):
    train_X,test_X,train_y,test_y = X[train],X[test],y[train],y[test]
    clf= DecisionTreeClassifier()
    clf.fit(train_X,train_y)
    predicted = clf.predict(test_X)
    res.extend((predicted==test_y).tolist())
sum(res)

ROC曲線評(píng)價(jià)分類模型

生成ROC曲線

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn import preprocessing
iris = load_iris()
X = iris.data[50:150,] # ROC曲線使用二維混肴矩陣,選擇2個(gè)分類的數(shù)據(jù)
le = preprocessing.LabelEncoder()
y = le.fit_transform(iris.target[50:150]) # 選擇的數(shù)據(jù)target值為1和2救鲤,使用preprocessing轉(zhuǎn)換成0和1
from sklearn.model_selection import train_test_split
train_X,test_X,train_y,test_y=train_test_split(X,y,test_size = 0.33,random_state =123)    
clf= DecisionTreeClassifier()
clf.fit(train_X,train_y)
probas_ = clf.fit(train_X,train_y).predict_proba(test_X)
from sklearn.metrics import roc_curve,auc
fpr,tpr,thresholds = roc_curve(test_y,probas_[:,1]) #生成false positive rate 和true positive rate
import matplotlib.pyplot as plt
plt.plot(fpr,tpr,label='ROC curve')
plt.plot([0,1],[0,1],'k--')
plt.xlim([0.0,1.0])
plt.ylim([0.0,1.0])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.legend(loc='lower right')
plt.show()
ROC Curve

計(jì)算auc(areas under curve)
auc越大模型越準(zhǔn)確

from sklearn.metrics import auc
roc_auc = auc(fpr,tpr)
print('Area under the curve:{}'.format(roc_auc))

不同模型ROC曲線對(duì)比

from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
clf1 = DecisionTreeClassifier()
clf1.fit(train_X,train_y)
clf2 = SVC(probability =True)
clf2.fit(train_X,train_y)
clf3 = LogisticRegression()
clf3.fit(train_X,train_y)
clf4 = RandomForestClassifier()
clf4.fit(train_X,train_y)
from sklearn.metrics import roc_curve,auc
plt.figure(figsize=[20,10])
for clf,title in zip([clf1,clf2,clf3,clf4],['Decision Tree','SVM','LogisticRegression','RandomForest']):
    probas_ = clf.fit(train_X,train_y).predict_proba(test_X)
    fpr,tpr,thresholds = roc_curve(test_y,probas_[:,1])
    plt.plot(fpr,tpr,label='%s-AUC:%.2f'%(title,auc(fpr,tpr)))
plt.plot([0,1],[0,1],'k--')
plt.xlim([0.0,1.0])
plt.ylim([0.0,1.0])
plt.xlabel('False Positive Rate',fontsize=20)
plt.ylabel('True Positive Rate',fontsize=20)
plt.title('ROC Curve',fontsize=20)
plt.legend(loc='lower right',fontsize=20)
plt.show()
ROC曲線對(duì)比

按模型中維度重要性排序

import numpy as np
columns = np.array(iris.feature_names) # 將feature_names由列表變?yōu)閍rray 
importance = columns[clf1.feature_importances_.argsort()[::-1]]
# clf1.feature_importances_ 生成各個(gè)特征的重要性
# argsort() 獲得array中的值按從小到大在array中的位置的array久窟。
# [::-1]將上面的array逆排序
# columns[clf1.feature_importances_.argsort()[::-1]] 得到按照importance從大到小排序的array
print(importance)
#特征維度重要性排序可視化
import matplotlib.pyplot as plt
featur_importance = clf1.feature_importances_
plt.title('Feature Importance')
plt.bar(range(0,len(importance)),feature_importance[feature_importance.argsort()[::-1]])
plt.xticks(range(0,len(importance)),importance,rotation=90)
plt.show()
特征維度重要性排序
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市本缠,隨后出現(xiàn)的幾起案子斥扛,更是在濱河造成了極大的恐慌,老刑警劉巖丹锹,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稀颁,死亡現(xiàn)場(chǎng)離奇詭異芬失,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)匾灶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門棱烂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人粘昨,你說我怎么就攤上這事垢啼。” “怎么了张肾?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵芭析,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我吞瞪,道長(zhǎng)馁启,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任芍秆,我火速辦了婚禮惯疙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘妖啥。我一直安慰自己霉颠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布荆虱。 她就那樣靜靜地躺著蒿偎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪怀读。 梳的紋絲不亂的頭發(fā)上诉位,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音菜枷,去河邊找鬼苍糠。 笑死,一個(gè)胖子當(dāng)著我的面吹牛啤誊,可吹牛的內(nèi)容都是我干的岳瞭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蚊锹,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼瞳筏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起枫耳,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤乏矾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钻心,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凄硼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捷沸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片摊沉。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖痒给,靈堂內(nèi)的尸體忽然破棺而出说墨,到底是詐尸還是另有隱情,我是刑警寧澤苍柏,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布尼斧,位于F島的核電站,受9級(jí)特大地震影響试吁,放射性物質(zhì)發(fā)生泄漏棺棵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一熄捍、第九天 我趴在偏房一處隱蔽的房頂上張望烛恤。 院中可真熱鬧,春花似錦余耽、人聲如沸缚柏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)币喧。三九已至,卻和暖如春缕陕,著一層夾襖步出監(jiān)牢的瞬間粱锐,已是汗流浹背疙挺。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工扛邑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人铐然。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓蔬崩,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親搀暑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子沥阳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

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