TASL05 模型建立和評(píng)估

庫(kù)的作用的了解

  • numpy:多用于科學(xué)計(jì)算中存儲(chǔ)和處理大型矩陣割择,是數(shù)據(jù)科學(xué)實(shí)踐中最常用的模塊
  • pandas:數(shù)據(jù)處理模塊蚤吹,之前數(shù)據(jù)讀入球榆,檢查重復(fù)、缺失值菇民,分組聚合等一系列的數(shù)據(jù)預(yù)處理都是基于該庫(kù)
  • matplotlib:繪圖模塊尽楔,上一個(gè)任務(wù)數(shù)據(jù)可視化就基于該庫(kù)完成
  • seaborn:繪圖模塊投储,基于Matplotlib的數(shù)據(jù)可視化庫(kù),提供了一個(gè)高級(jí)界面阔馋,用于繪制引人入勝且內(nèi)容豐富的統(tǒng)計(jì)圖形

切分訓(xùn)練集和數(shù)據(jù)集

  • 劃分?jǐn)?shù)據(jù)集的方法
    • 留出法玛荞,即本文采用的方法。具體做法是將數(shù)據(jù)集分成兩個(gè)互斥的集合呕寝,其中一個(gè)作為訓(xùn)練集冲泥,另一個(gè)作為測(cè)試集。

    • 交叉驗(yàn)證法:具體做法是將數(shù)據(jù)集劃分成k個(gè)大小相似的互斥子集壁涎,每次用k-1個(gè)子集的并集作為訓(xùn)練集,余下的作為測(cè)試集志秃,進(jìn)行k次訓(xùn)練和測(cè)試怔球,最終返回的是這k個(gè)訓(xùn)練結(jié)果的均值。


      Snipaste_2020-01-05_16-37-56.png
    • 自助法:即有放回抽樣浮还,每次進(jìn)行有放回抽樣抽取和數(shù)據(jù)集數(shù)據(jù)量大小相同的樣本竟坛。

  • 分層抽樣
    使得訓(xùn)練集/測(cè)試集保持?jǐn)?shù)據(jù)分布的一致性,避免因?yàn)閿?shù)據(jù)劃分過(guò)程引入額外的偏差而對(duì)最終結(jié)果產(chǎn)生影響钧舌。而封層抽樣則是能夠保留類別比例的采樣方式担汤,所以采用分層抽樣。

*思考:k折交叉驗(yàn)證中洼冻, k折越多的情況下會(huì)帶來(lái)什么樣的影響崭歧?

  • k越大,每折包含的樣本數(shù)目就越少撞牢,那么k-1折的樣本數(shù)目就越接近于總體率碾。有一個(gè)特殊情況就是k=樣本數(shù)量,則每折都只包含一個(gè)樣本屋彪,所以k-1折的樣本就非常接近于初始數(shù)據(jù)集所宰,那么該方法就比較準(zhǔn)確。

  • 但是k越大畜挥,在數(shù)據(jù)集比較大的時(shí)候仔粥,訓(xùn)練的模型數(shù)量就會(huì)變多。

  • train_test_split()

x_train,x_test,y_train,y_test = 
sklearn.model_selection.train_test_split(
    train_data,train_target,test_size,
    random_state,stratify)
  • train_data:所要?jiǎng)澐值臉颖咎卣骷?即X
  • train_target:所要?jiǎng)澐值臉颖窘Y(jié)果,即y
  • test_size:樣本占比蟹但,如果是整數(shù)的話就是樣本的數(shù)量
  • random_state:隨機(jī)數(shù)種子
  • stratify:為了保持split前類的分布躯泰,即實(shí)現(xiàn)分層抽樣的作用。strtify=X就是按照X中的比例矮湘,stratify=y就是按照y中的比例分配斟冕。

模型搭建

  • 首先要根據(jù)是否有標(biāo)簽選擇有監(jiān)督學(xué)習(xí)還是無(wú)監(jiān)督學(xué)習(xí),但訓(xùn)練集數(shù)據(jù)有標(biāo)簽即有Y時(shí)則選擇有監(jiān)督學(xué)習(xí)缅阳,否則選擇無(wú)監(jiān)督學(xué)習(xí)磕蛇。
  • 其次當(dāng)是有監(jiān)督學(xué)習(xí)時(shí)要根據(jù)Y的類型即離散型或連續(xù)型來(lái)選擇算法類型景描,是進(jìn)行回歸還是進(jìn)行分類。一般當(dāng)Y為離散型數(shù)據(jù)時(shí)則進(jìn)行分類秀撇,連續(xù)型數(shù)據(jù)則進(jìn)行回歸超棺。當(dāng)是無(wú)監(jiān)督學(xué)習(xí)時(shí),則根據(jù)問(wèn)題選擇聚類呵燕、降維或推薦系統(tǒng)等的算法的選擇棠绘。
  • 最后,回歸算法一般包括線性回歸再扭、非線性回歸氧苍、分位數(shù)回歸、正則化回歸等泛范。分類算法一般包括Logistic分類让虐、決策樹(shù)、集成學(xué)習(xí)罢荡、支持向量機(jī)赡突、樸素貝葉斯、神經(jīng)網(wǎng)絡(luò)等区赵。
  • 此外惭缰,數(shù)據(jù)量的大小也影響著選擇的具體算法。
sklearn.png

模型評(píng)估

  • 模型評(píng)估的目的是為了知道模型的泛化能力笼才。模型評(píng)估的常用方法有:錯(cuò)誤率與精度漱受、查準(zhǔn)率查全率與F1、ROC曲線和AUC.

  • 混淆矩陣:混淆矩陣是用來(lái)總結(jié)一個(gè)分類器結(jié)果的矩陣骡送,對(duì)于k元分類拜效,它就是一個(gè)k*k的表格,用來(lái)記錄分類器的預(yù)測(cè)結(jié)果各谚。對(duì)于最常見(jiàn)的二元分類來(lái)說(shuō)紧憾,混淆矩陣是2*2的,如下TP=True positive=真陽(yáng)性昌渤,F(xiàn)P=False Positive=假陽(yáng)性赴穗,F(xiàn)N=False Negative=假陰性,TN=True Negative=真陰性膀息。就是下面的圖般眉。主要是用于分類任務(wù)。

Snipaste_2020-01-05_16-38-26.png
  • 查準(zhǔn)率/準(zhǔn)確率precesion:度量被預(yù)測(cè)為正例的樣本中有多少是真正的正例潜支。其計(jì)算公式為P=\frac{TP}{TP+FP}

  • 查全率/召回率recall:度量的是正類樣本中有多少被預(yù)測(cè)為正類甸赃。其計(jì)算公式為R=\frac{TP}{TP+FN}

  • 一般來(lái)說(shuō),查準(zhǔn)率高時(shí)冗酿,查全率往往偏低埠对,查全率高時(shí)络断,查準(zhǔn)率往往偏低,即兩者是一對(duì)矛盾项玛。

  • F1:基于查準(zhǔn)率與查全率的調(diào)和平均貌笨。其計(jì)算公式為F1=\frac{2\times P \times R}{P+R}

  • ROC曲線:Receiver Operating Characteristic即受試者工作特征又稱感受性曲線sesitivity curve。得名的原因在于曲線上各點(diǎn)反映著相同的感受性襟沮,它們都是對(duì)同一信號(hào)刺激的反應(yīng)锥惋,只不過(guò)是在集中不同的判定標(biāo)準(zhǔn)下所得的結(jié)果而已。

  • ROC曲線也是根據(jù)混淆矩陣獲得开伏,縱軸是真正例率膀跌,即TPR=\frac{TP}{TP+FN},橫軸是假正例率,即FPR=\frac{FP}{FP+TN}.ROC曲線下的面積為AUC固灵,該面積越大越好

  • 對(duì)于多分類問(wèn)題如何繪制ROC曲線

    • 每種類別下淹父,都可以得到m個(gè)測(cè)試樣本為該類別的概率。所以根據(jù)概率矩陣和標(biāo)簽矩陣中對(duì)應(yīng)的每一列怎虫,可以計(jì)算出各個(gè)閾值下的假正例率和真正例率,從而繪制出一條ROC曲線困介。這樣總共可以繪制出n個(gè)(類別個(gè)數(shù))ROC曲線大审,對(duì)這n條ROC曲線平均,即可得到最終的ROC曲線座哩。

datawhale例子

數(shù)據(jù)加載

# 導(dǎo)入需要的庫(kù)
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from IPython.display import Image
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
%matplotlib inline
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用來(lái)正常顯示中文標(biāo)簽
plt.rcParams['axes.unicode_minus'] = False  # 用來(lái)正常顯示負(fù)號(hào)
plt.rcParams['figure.figsize'] = (10, 6)  # 設(shè)置輸出圖片大小


# 載入數(shù)據(jù)
# 原始數(shù)據(jù)載入
train = pd.read_csv('./train.csv')
train
# 清洗之后的數(shù)據(jù)
clear_data = pd.read_csv('./clear_data.csv')
clear_data
  • 原始數(shù)據(jù)和清洗后數(shù)據(jù)的區(qū)別
    • PassengerId:清洗之前為1-892徒扶,清洗后為0-891
    • Survivie,Name,Ticket,Cabin:這些列沒(méi)有了
    • Sex:分為兩列,并進(jìn)行了0-1轉(zhuǎn)變根穷,如sex_female列姜骡,若=0,則表示性別不是female屿良,且sex_male=1.類似于One-hot編碼圈澈?
    • Embarked:和Sex進(jìn)行了類似的操作,只不過(guò)因?yàn)樗腥齻€(gè)水平尘惧,所以分成了三列

數(shù)據(jù)切分

# 將clear_data.csv劃分為訓(xùn)練集和測(cè)試集
from sklearn.model_selection import train_test_split
# 取出X和y
X = clear_data
y = train['Survived']

# 對(duì)數(shù)據(jù)集進(jìn)行切割
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=1,stratify=y)
#查看數(shù)據(jù)
X_train.shape,X_test.shape
  • 什么情況下切割數(shù)據(jù)集的時(shí)候不用進(jìn)行隨機(jī)選取
    • 切割數(shù)據(jù)集不用進(jìn)行隨機(jī)選瓤嫡弧:留一法,即Leave-one-off.即將樣本集劃分使得每個(gè)子集只包含一個(gè)樣本喷橙。

模型創(chuàng)建

  • 創(chuàng)建基于線性模型的分類模型(邏輯回歸)
  • 創(chuàng)建基于樹(shù)的分類模型(決策樹(shù)啥么、隨機(jī)森林)
  • 分別使用這些模型進(jìn)行訓(xùn)練,分別的到訓(xùn)練集和測(cè)試集的得分
  • 查看模型的參數(shù)贰逾,并更改參數(shù)值悬荣,觀察模型變化

提示

  • 邏輯回歸不是回歸模型而是分類模型,不要與LinearRegression混淆
  • 隨機(jī)森林其實(shí)是決策樹(shù)集成為了降低決策樹(shù)過(guò)擬合的情況
  • 線性模型所在的模塊為sklearn.linear_model
  • 樹(shù)模型所在的模塊為sklearn.ensemble
# 加載需要的庫(kù):邏輯回歸和隨機(jī)森林
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier

# 邏輯回歸:訓(xùn)練集訓(xùn)練
lr = LogisticRegression()
lr.fit(X_train,y_train)
# 查看邏輯回歸訓(xùn)練集和測(cè)試集score值
print("Training set score: {:.2f}".format(lr.score(X_train, y_train)))
print("Testing set score: {:.2f}".format(lr.score(X_test, y_test)))

# 邏輯回歸調(diào)參
lr2 = LogisticRegression(penalty='l2',C=)
lr2.fit(X_train,y_train)

print("Training set score: {:.2f}".format(lr2.score(X_train, y_train)))
print("Testing set score: {:.2f}".format(lr2.score(X_test, y_test)))

  • 上述是邏輯回歸疙剑,其默認(rèn)參數(shù)下訓(xùn)練集score為0.81氯迂,測(cè)試集score為0.79;調(diào)參后訓(xùn)練集score為0.81践叠,測(cè)試集score為0.79.

  • 為什么線性模型可以進(jìn)行分類任務(wù),背后是怎么的數(shù)學(xué)關(guān)系

    • 線性模型進(jìn)行分類任務(wù):兩者的區(qū)別在于線性Y是一個(gè)從負(fù)無(wú)窮到正無(wú)窮沒(méi)有限制的數(shù)字囚戚,而回歸則Y則是0-1酵熙,所以只需要找到一個(gè)單調(diào)可微函數(shù)將分類任務(wù)的真實(shí)表級(jí)y與線性回歸模型的預(yù)測(cè)值聯(lián)系起來(lái)即可。邏輯回歸中該函數(shù)就是一個(gè)logistic函數(shù)驰坊,從而將其轉(zhuǎn)變到0-1之間的數(shù)
  • 對(duì)于多分類問(wèn)題匾二,線性模型是怎么進(jìn)行分類的

    • 多分類問(wèn)題:基本思路就是拆解法,即將多分類任務(wù)拆分成若干個(gè)二分類任務(wù)求解拳芙。即先對(duì)問(wèn)題進(jìn)行拆分察藐,然后為拆出的每個(gè)二分類任務(wù)訓(xùn)練一個(gè)分類器,在測(cè)試時(shí)舟扎,對(duì)這些分類器的預(yù)測(cè)結(jié)果進(jìn)行集成獲得最終的多分類結(jié)果分飞。
# 隨機(jī)森林
rfc = RandomForestClassifier()
rfc.fit(X_train,y_train)
# 隨機(jī)森林評(píng)分
print("Training set score: {:.2f}".format(rfc.score(X_train, y_train)))
print("Testing set score: {:.2f}".format(rfc.score(X_test, y_test)))
# 隨機(jī)森林調(diào)參
rfc2 = RandomForestClassifier(n_estimators=500, max_depth=5)
rfc2.fit(X_train, y_train)
print("Training set score: {:.2f}".format(rfc.score(X_train, y_train)))
print("Testing set score: {:.2f}".format(rfc.score(X_test, y_test)))
  • 隨機(jī)森林:默認(rèn)參數(shù)訓(xùn)練集和測(cè)試集score分別為1.00和0.82;調(diào)參后訓(xùn)練集和測(cè)試集score分別為1.00,0.82。

輸出模型預(yù)測(cè)結(jié)果

# 邏輯回歸預(yù)測(cè)
pred = lr.predict(X_train)
pred
# 邏輯回歸中屬于每個(gè)標(biāo)簽的概率
probability = lr.predict_proba(X_train)
  • 屬于每個(gè)標(biāo)簽的概率睹限,哪個(gè)概率大就最終判定屬于哪個(gè)標(biāo)簽

模型評(píng)估

# 交叉驗(yàn)證
from sklearn.model_selection import cross_val_score
lr = LogisticRegression(C=5)
scores = cross_val_score(lr,X_train,y_train,cv=10)   # 10折交叉驗(yàn)證
scores
# 平均交叉驗(yàn)證分?jǐn)?shù)
scores.mean()
  • 10折交叉驗(yàn)證的平均交叉驗(yàn)證分?jǐn)?shù)為:0.80
# 載入需要的庫(kù)
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report
# 訓(xùn)練模型
lr = LogisticRegression(C=5)
lr.fit(X_train,y_train)
# 模型預(yù)測(cè)結(jié)果
prediction = lr.predict(X_train)
# 混淆矩陣
confusion_matrix(y_train,prediction)
混淆矩陣.jpg
# 導(dǎo)入需要的庫(kù)
from sklearn.metrics import roc_curve
# FPR,TPR,閾值
fpr,tpr,thresholds = roc_curve(y_test,lr.decision_function(X_test))
plt.plot(fpr,tpr,label='ROC Curve')
plt.xlabel('FPR')
plt.ylabel('TPR')
# 找到最接近0的閾值
close_zero = np.argmin(np.abs(thresholds))
plt.plot(fpr[close_zero],tpr[close_zero],'o',markersize=10,
        label='threshold zero',fillstyle='none',c='k',mew=2)
plt.legend(loc=4)
ROC曲線.jpg
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末譬猫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子羡疗,更是在濱河造成了極大的恐慌染服,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叨恨,死亡現(xiàn)場(chǎng)離奇詭異柳刮,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)痒钝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門秉颗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人送矩,你說(shuō)我怎么就攤上這事蚕甥。” “怎么了栋荸?”我有些...
    開(kāi)封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵梢灭,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我蒸其,道長(zhǎng)敏释,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任摸袁,我火速辦了婚禮钥顽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘靠汁。我一直安慰自己蜂大,他們只是感情好闽铐,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著奶浦,像睡著了一般兄墅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上澳叉,一...
    開(kāi)封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天隙咸,我揣著相機(jī)與錄音,去河邊找鬼成洗。 笑死五督,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瓶殃。 我是一名探鬼主播充包,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼遥椿!你這毒婦竟也來(lái)了基矮?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤冠场,失蹤者是張志新(化名)和其女友劉穎家浇,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體慈鸠,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年灌具,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了青团。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡咖楣,死狀恐怖督笆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情诱贿,我是刑警寧澤娃肿,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站珠十,受9級(jí)特大地震影響料扰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜焙蹭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一晒杈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧孔厉,春花似錦拯钻、人聲如沸帖努。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)拼余。三九已至,卻和暖如春亩歹,著一層夾襖步出監(jiān)牢的瞬間匙监,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工捆憎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舅柜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓躲惰,卻偏偏與公主長(zhǎng)得像致份,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子础拨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

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