數(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í)資料: