庫(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ù)量的大小也影響著選擇的具體算法。
模型評(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ù)。
查準(zhǔn)率/準(zhǔn)確率precesion:度量被預(yù)測(cè)為正例的樣本中有多少是真正的正例潜支。其計(jì)算公式為
查全率/召回率recall:度量的是正類樣本中有多少被預(yù)測(cè)為正類甸赃。其計(jì)算公式為
一般來(lái)說(shuō),查準(zhǔn)率高時(shí)冗酿,查全率往往偏低埠对,查全率高時(shí)络断,查準(zhǔn)率往往偏低,即兩者是一對(duì)矛盾项玛。
F1:基于查準(zhǔn)率與查全率的調(diào)和平均貌笨。其計(jì)算公式為
ROC曲線:Receiver Operating Characteristic即受試者工作特征又稱感受性曲線sesitivity curve。得名的原因在于曲線上各點(diǎn)反映著相同的感受性襟沮,它們都是對(duì)同一信號(hào)刺激的反應(yīng)锥惋,只不過(guò)是在集中不同的判定標(biāo)準(zhǔn)下所得的結(jié)果而已。
ROC曲線也是根據(jù)混淆矩陣獲得开伏,縱軸是真正例率膀跌,即
,橫軸是假正例率,即
.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)
# 導(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)