Task05:數(shù)據(jù)建模及模型評(píng)估

數(shù)據(jù)建模及模型評(píng)估

1.導(dǎo)入使用的包和數(shù)據(jù)

導(dǎo)包

import pandas as pd

import numpy as np

import seaborn as sns

import matplotlib.pyplot as plt

from IPython.display import Image

%matplotlib inline

plt.rcParams['font.sans-serif'] = ['SimHei'] # 用來正常顯示中文標(biāo)簽

plt.rcParams['axes.unicode_minus'] = False? # 用來正常顯示負(fù)號(hào)

plt.rcParams['figure.figsize'] = (10, 6)? # 設(shè)置輸出圖片大小

讀取數(shù)據(jù)集

train = pd.read_csv('train.csv')

train.shape

train.head()

2.特征工程

缺失值填充

分類變量缺失值:填充某個(gè)缺失值字符(NA)欺矫、用最多類別的進(jìn)行填充

train['Cabin'] = train['Cabin'].fillna('NA')

train['Embarked'] = train['Embarked'].fillna('S')

連續(xù)變量缺失值:填充均值宛渐、中位數(shù)霹肝、眾數(shù)

train['Age'] = train['Age'].fillna(train['Age'].mean())

檢查缺失值比例

train.isnull().sum().sort_values(ascending=False)

編碼分類變量

data = train[['Pclass','Sex','Age','SibSp','Parch','Fare', 'Embarked']]

data = pd.get_dummies(data)

data.head()

3.模型搭建

選擇合適的模型燕刻,選擇模型前窟却,先知道數(shù)據(jù)集最終是進(jìn)行監(jiān)督學(xué)習(xí)還是無監(jiān)督學(xué)習(xí),根據(jù)數(shù)據(jù)樣本量以及特征的稀疏性來選擇模型未妹。

先嘗試使用一個(gè)基本的模型來作為其baseline簿废,進(jìn)而再訓(xùn)練其他模型做對(duì)比,最終選擇泛化能力或性能比較好的模型络它。

數(shù)據(jù)集導(dǎo)致模型在擬合數(shù)據(jù)發(fā)生變化的因素

樣本數(shù)量族檬、數(shù)據(jù)類別是否明確、數(shù)據(jù)是否已標(biāo)記化戳、數(shù)據(jù)特征維度单料。

sklearn模型算法選擇路徑圖

切割訓(xùn)練集和測試集

按比例切割訓(xùn)練集和測試集(一般測試集的比例有30%、25%点楼、20%扫尖、15%和10%)

按目標(biāo)變量分層進(jìn)行等比切割,設(shè)置隨機(jī)種子以便結(jié)果能復(fù)現(xiàn)

切割數(shù)據(jù)集是為了后續(xù)能評(píng)估模型泛化能力

from sklearn.model_selection import train_test_split

X = data

y = train['Survived']

X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=0)

X_train.shape, X_test.shape

sklearn之train_test_split()函數(shù)各參數(shù)含義

train_data:所要?jiǎng)澐值臉颖咎卣骷?/p>

train_target:所要?jiǎng)澐值臉颖窘Y(jié)果

test_size:樣本占比,可以為浮點(diǎn)盟步、整數(shù)或None藏斩,默認(rèn)為None

? ? ? ①若為浮點(diǎn)時(shí)躏结,表示測試集占總樣本的百分比

? ? ? ②若為整數(shù)時(shí)却盘,表示測試樣本樣本數(shù)

? ? ? ③若為None時(shí),test size自動(dòng)設(shè)置成0.25

train_size:可以為浮點(diǎn)媳拴、整數(shù)或None黄橘,默認(rèn)為None

? ? ? ①若為浮點(diǎn)時(shí),表示訓(xùn)練集占總樣本的百分比

? ? ? ②若為整數(shù)時(shí)屈溉,表示訓(xùn)練樣本的樣本數(shù)

? ? ? ③若為None時(shí)塞关,train_size自動(dòng)被設(shè)置成0.75

random_state:可以為整數(shù)、RandomState實(shí)例或None子巾,默認(rèn)為None

? ? ? ①若為None時(shí)帆赢,每次生成的數(shù)據(jù)都是隨機(jī)小压,可能不一樣

? ? ? ②若為整數(shù)時(shí),每次生成的數(shù)據(jù)都相同

stratify:可以為類似數(shù)組或None

? ? ? ①若為None時(shí)椰于,劃分出來的測試集或訓(xùn)練集中怠益,其類標(biāo)簽的比例也是隨機(jī)的

? ? ? ②若不為None時(shí),劃分出來的測試集或訓(xùn)練集中瘾婿,其類標(biāo)簽的比例同輸入的數(shù)組中類標(biāo)簽的比例相同蜻牢,可以用于處理不均衡的數(shù)據(jù)集

切割數(shù)據(jù)集的時(shí)候不用進(jìn)行隨機(jī)選取的情況

在數(shù)據(jù)集本身已經(jīng)是隨機(jī)處理之后的,或者說數(shù)據(jù)集非常大偏陪,內(nèi)部已經(jīng)足夠隨機(jī)抢呆。

模型創(chuàng)建

創(chuàng)建基于線性模型的分類模型(邏輯回歸)

創(chuàng)建基于樹的分類模型(決策樹、隨機(jī)森林)

查看模型的參數(shù)笛谦,并更改參數(shù)值抱虐,觀察模型變化

邏輯回歸不是回歸模型而是分類模型

隨機(jī)森林其實(shí)是決策樹集成為了降低決策樹過擬合的情況

from sklearn.linear_model import LogisticRegression

from sklearn.ensemble import RandomForestClassifier

默認(rèn)參數(shù)邏輯回歸模型

lr = LogisticRegression()

lr.fit(X_train, y_train)

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)整參數(shù)后的邏輯回歸模型

lr2 = LogisticRegression(C=100)

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ù)的隨機(jī)森林分類模型

rfc = RandomForestClassifier()

rfc.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)))

調(diào)整參數(shù)后的隨機(jī)森林分類模型

rfc2 = RandomForestClassifier(n_estimators=100, max_depth=5)

rfc2.fit(X_train, y_train)

print("Training set score: {:.2f}".format(rfc2.score(X_train, y_train)))

print("Testing set score: {:.2f}".format(rfc2.score(X_test, y_test)))

線性模型可以進(jìn)行分類任務(wù)的數(shù)學(xué)關(guān)系

邏輯回歸主要用于分類,與線性回歸模型都是線性模型饥脑。

線性回歸是普通線性模型梯码,邏輯回歸是廣義線性模型。

表達(dá)形式上好啰,邏輯回歸是線性回歸套上了一個(gè)Sigmoid函數(shù)轩娶。

線性模型對(duì)于多分類問題進(jìn)行分類的方法

將多個(gè)二分類的邏輯回歸進(jìn)行組合,即可實(shí)現(xiàn)多分類框往。

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

輸出模型預(yù)測分類標(biāo)簽

輸出不同分類標(biāo)簽的預(yù)測概率

一般監(jiān)督模型在sklearn里面有個(gè)predict能輸出預(yù)測標(biāo)簽鳄抒,predict_proba則可以輸出標(biāo)簽概率

pred = lr.predict(X_train)

pred[:10]

pred_proba = lr.predict_proba(X_train)

pred_proba[:10]

預(yù)測標(biāo)簽的概率對(duì)我們有什么幫助

4.模型評(píng)估

模型評(píng)估是為了知道模型的泛化能力。

交叉驗(yàn)證是一種評(píng)估泛化性能的統(tǒng)計(jì)學(xué)方法椰弊,比單次劃分訓(xùn)練集和測試集的方法更加穩(wěn)定许溅、全面。在交叉驗(yàn)證中秉版,數(shù)據(jù)被多次劃分贤重,并且需要訓(xùn)練多個(gè)模型。

最常用的交叉驗(yàn)證是 k 折交叉驗(yàn)證清焕,其中 k 是由用戶指定的數(shù)字并蝗,通常取 5 或 10。

準(zhǔn)確率度量的是被預(yù)測為正例的樣本中有多少是真正的正例秸妥。

召回率度量的是正類樣本中有多少被預(yù)測為正類滚停。

f-分?jǐn)?shù)是準(zhǔn)確率與召回率的調(diào)和平均。

交叉驗(yàn)證

用10折交叉驗(yàn)證來評(píng)估邏輯回歸模型

計(jì)算交叉驗(yàn)證精度的平均值

k折交叉驗(yàn)證分?jǐn)?shù)

from sklearn.model_selection import cross_val_score

lr = LogisticRegression(C=100)

scores = cross_val_score(lr, X_train, y_train, cv=10)

scores

平均交叉驗(yàn)證分?jǐn)?shù)

print("Average cross-validation score: {:.2f}".format(scores.mean()))

k折越多的情況下會(huì)帶來的影響

模型的偏差會(huì)偏小粥惧,方差偏大键畴。

混淆矩陣

計(jì)算二分類問題的混淆矩陣

計(jì)算精確率、召回率以及f-分?jǐn)?shù)

混淆矩陣就是誤差矩陣突雪,是表示進(jìn)度評(píng)價(jià)的一種標(biāo)準(zhǔn)格式起惕,通常用n行n列的矩陣形式表示涡贱。

混淆矩陣需要輸入真實(shí)標(biāo)簽和預(yù)測標(biāo)簽。

模型預(yù)測結(jié)果

from sklearn.metrics import confusion_matrix

lr.fit(X_train, y_train)

混淆矩陣

pred = lr.predict(X_train)

confusion_matrix(y_train, pred)

精確率惹想、召回率以及f1-score

print(classification_report(y_train, pred))

ROC曲線

ROC曲線下面所包圍的面積越大越好盼产。

from sklearn.metrics import roc_curve

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 (recall)")

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)

對(duì)于多分類問題繪制ROC曲線

方法1:每種類別下,都可以得到m個(gè)測試樣本為該類別的概率勺馆。根據(jù)概率矩陣P和標(biāo)簽矩陣L中對(duì)應(yīng)的每一列戏售,可以計(jì)算出各個(gè)閾值下的假正例率(FPR)和真正例率(TPR),從而繪制出一條ROC曲線草穆」嘣郑總共可以繪制出n條ROC曲線。最后對(duì)n條ROC曲線取平均悲柱,即可得到最終的ROC曲線锋喜。

方法2:首先,對(duì)于一個(gè)測試樣本:標(biāo)簽只由0和1組成豌鸡,1的位置表明了它的類別嘿般,0就表示其他類別如果分類器對(duì)該測試樣本分類正確,則該樣本標(biāo)簽中1對(duì)應(yīng)的位置在概率矩陣P中的值是大于0對(duì)應(yīng)的位置的概率值的涯冠÷基于這兩點(diǎn),將標(biāo)簽矩陣L和概率矩陣P分別按行展開蛇更,轉(zhuǎn)置后形成兩列瞻赶,這就得到了一個(gè)二分類的結(jié)果。此方法經(jīng)過計(jì)算后可以直接得到最終的ROC曲線派任。


DataWhale開源學(xué)習(xí)資料:

https://github.com/datawhalechina/hands-on-data-analysis

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末砸逊,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子掌逛,更是在濱河造成了極大的恐慌师逸,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件豆混,死亡現(xiàn)場離奇詭異篓像,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)崖叫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門遗淳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人心傀,你說我怎么就攤上這事〔鹧叮” “怎么了脂男?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵养叛,是天一觀的道長。 經(jīng)常有香客問我宰翅,道長弃甥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任汁讼,我火速辦了婚禮淆攻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嘿架。我一直安慰自己瓶珊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布耸彪。 她就那樣靜靜地躺著伞芹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蝉娜。 梳的紋絲不亂的頭發(fā)上唱较,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音召川,去河邊找鬼南缓。 笑死,一個(gè)胖子當(dāng)著我的面吹牛荧呐,可吹牛的內(nèi)容都是我干的西乖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼坛增,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼获雕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起收捣,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤届案,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后罢艾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體楣颠,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有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
  • 文/蒙蒙 一罗晕、第九天 我趴在偏房一處隱蔽的房頂上張望济欢。 院中可真熱鬧,春花似錦小渊、人聲如沸法褥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挖胃。三九已至,卻和暖如春梆惯,著一層夾襖步出監(jiān)牢的瞬間酱鸭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來泰國打工垛吗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凹髓,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓怯屉,卻偏偏與公主長得像蔚舀,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子锨络,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

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