經(jīng)過前面的兩章的知識點的學習,我可以對數(shù)數(shù)據(jù)的本身進行處理租漂,比如數(shù)據(jù)本身的增刪查補,還可以做必要的清洗工作颊糜。那么下面我們就要開始使用我們前面處理好的數(shù)據(jù)了哩治。這一章我們要做的就是使用數(shù)據(jù),我們做數(shù)據(jù)分析的目的也就是衬鱼,運用我們的數(shù)據(jù)以及結(jié)合我的業(yè)務來得到某些我們需要知道的結(jié)果业筏。那么分析的第一步就是建模,搭建一個預測模型或者其他模型鸟赫;我們從這個模型的到結(jié)果之后蒜胖,我們要分析我的模型是不是足夠的可靠消别,那我就需要評估這個模型。今天我們學習建模台谢,下一節(jié)我們學習評估寻狂。
我們擁有的泰坦尼克號的數(shù)據(jù)集,那么我們這次的目的就是朋沮,完成泰坦尼克號存活預測這個任務蛇券。
import pandas as pd ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? import numpy as np ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?import matplotlib.pyplot as plt ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?import seaborn as sns ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? from IPython.display import Image
%matplotlib inline
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用來正常顯示中文標簽 plt.rcParams['axes.unicode_minus'] = False # 用來正常顯示負號 plt.rcParams['figure.figsize'] = (10, 6) # 設(shè)置輸出圖片大小
載入這些庫,如果缺少某些庫樊拓,請安裝他們
【思考】這些庫的作用是什么呢纠亚?你需要查一查
matplotlib.pyplot是一個有命令風格的函數(shù)集合,它看起來和MATLAB很相似
Seaborn是基于matplotlib的圖形可視化python包筋夏。它提供了一種高度交互式界面蒂胞,便于用戶能夠做出各種有吸引力的統(tǒng)計圖表。
ipython是一個python的交互式shell条篷,比默認的python shell好用得多骗随,支持變量自動補全,自動縮進拥娄,支持bash shell命令蚊锹,內(nèi)置了許多很有用的功能和函數(shù)瞳筏。學習ipython將會讓我們以一種更高的效率來使用python稚瘾。同時它也是利用Python進行科學計算和交互可視化的一個最佳的平臺。
載入我們提供清洗之后的數(shù)據(jù)(clear_data.csv)姚炕,大家也將原始數(shù)據(jù)載入(train.csv)摊欠,說說他們有什么不同
train = pd.read_csv('train.csv') ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?train.shape
train.head()
data = pd.read_csv('clear_data.csv') ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? data.head()
模型搭建
處理完前面的數(shù)據(jù)我們就得到建模數(shù)據(jù),下一步是選擇合適模型
在進行模型選擇之前我們需要先知道數(shù)據(jù)集最終是進行監(jiān)督學習還是無監(jiān)督學習
模型的選擇一方面是通過我們的任務來決定的柱宦。
除了根據(jù)我們?nèi)蝿諄磉x擇模型外些椒,還可以根據(jù)數(shù)據(jù)樣本量以及特征的稀疏性來決定
剛開始我們總是先嘗試使用一個基本的模型來作為其baseline,進而再訓練其他模型做對比掸刊,最終選擇泛化能力或性能比較好的模型
這里我的建模免糕,并不是從零開始,自己一個人完成完成所有代碼的編譯忧侧。我們這里使用一個機器學習最常用的一個庫(sklearn)來完成我們的模型的搭建
下面給出sklearn的算法選擇路徑石窑,供大家參考
# sklearn模型算法選擇路徑圖 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Image('sklearn.png')
【思考】數(shù)據(jù)集哪些差異會導致模型在擬合數(shù)據(jù)是發(fā)生變化
答:?蚓炬?松逊?
任務一:切割訓練集和測試集
這里使用留出法劃分數(shù)據(jù)集
* 將數(shù)據(jù)集分為自變量和因變量
* 按比例切割訓練集和測試集(一般測試集的比例有30%、25%肯夏、20%经宏、15%和10%)
* 使用分層抽樣
* 設(shè)置隨機種子以便結(jié)果能復現(xiàn)
【思考】
* 劃分數(shù)據(jù)集的方法有哪些犀暑?
* 為什么使用分層抽樣,這樣的好處有什么烁兰?
?任務提示1
* 切割數(shù)據(jù)集是為了后續(xù)能評估模型泛化能力
* sklearn中切割數(shù)據(jù)集的方法為`train_test_split`
* 查看函數(shù)文檔可以在jupyter noteboo里面使用`train_test_split?`后回車即可看到
* 分層和隨機種子在參數(shù)里尋找
要從clear_data.csv和train.csv中提取train_test_split()所需的參數(shù)
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
【思考】
什么情況下切割數(shù)據(jù)集的時候不用進行隨機選取
答:耐亏??
任務二:模型創(chuàng)建
創(chuàng)建基于線性模型的分類模型(邏輯回歸)
創(chuàng)建基于樹的分類模型(決策樹缚柏、隨機森林)
分別使用這些模型進行訓練苹熏,分別的到訓練集和測試集的得分
查看模型的參數(shù),并更改參數(shù)值币喧,觀察模型變化
提示
邏輯回歸不是回歸模型而是分類模型轨域,不要與LinearRegression混淆
隨機森林其實是決策樹集成為了降低決策樹過擬合的情況
線性模型所在的模塊為sklearn.linear_model
樹模型所在的模塊為sklearn.ensemble
from sklearn.linear_model import LogisticRegression ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? from sklearn.ensemble import RandomForestClassifier
lr = LogisticRegression() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?lr.fit(X_train,y_train)
print('Training set score:{:.2f}'.format(lr.score(X_train,y_train))) ? ? ? ? ? ? ? ? ? ? ? ? ?print('Training set score:{:.2f}'.format(lr.score(X_test,y_test)))
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)))
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)))
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)))
【思考】
為什么線性模型可以進行分類任務,背后是怎么的數(shù)學關(guān)系
對于多分類問題杀餐,線性模型是怎么進行分類的
任務三:輸出模型預測結(jié)果
輸出模型預測分類標簽
輸出不同分類標簽的預測概率
提示3
一般監(jiān)督模型在sklearn里面有個predict能輸出預測標簽干发,predict_proba則可以輸出標簽概率
pred = lr.predict(X_train)
pred[:10]
pred_proba = lr.predict_proba(X_train)
pred_proba[:10]
【思考】
預測標簽的概率對我們有什么幫助
能知道模型的準確性
模型搭建和評估-評估
根據(jù)之前的模型的建模,我們知道如何運用sklearn這個庫來完成建模史翘,以及我們知道了的數(shù)據(jù)集的劃分等等操作枉长。那么一個模型我們怎么知道它好不好用呢?以至于我們能不能放心的使用模型給我的結(jié)果呢琼讽?那么今天的學習的評估必峰,就會很有幫助。
加載下面的庫
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
任務:加載數(shù)據(jù)并分割測試集和訓練集
from sklearn.model_selection import train_test_split
#一般先取出X和y后再切割钻蹬,有些情況會使用到未切割的吼蚁,這時候X和y就可以用,x是清洗好的數(shù)據(jù),y是我們要預測的存活數(shù)據(jù)'Survived' ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?data = pd.read_csv('clear_data.csv') ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? train = pd.read_csv('train.csv') ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?X = data ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? y = train['Survived']
#對數(shù)據(jù)集進行切割 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?X_train,X_test,y_train,y_test = train_test_split(X,y,stratify=y,random_state=0)
#默認參數(shù)邏輯回歸模型 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? lr = LogisticRegression() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? lr.fit(X_train,y_train)
模型評估
模型評估是為了知道模型的泛化能力问欠。
交叉驗證(cross-validation)是一種評估泛化性能的統(tǒng)計學方法肝匆,它比單次劃分訓練集和測試集的方法更加穩(wěn)定、全面顺献。
在交叉驗證中旗国,數(shù)據(jù)被多次劃分,并且需要訓練多個模型注整。
最常用的交叉驗證是 k 折交叉驗證(k-fold cross-validation)能曾,其中 k 是由用戶指定的數(shù)字,通常取 5 或 10肿轨。
準確率(precision)度量的是被預測為正例的樣本中有多少是真正的正例
召回率(recall)度量的是正類樣本中有多少被預測為正類
f-分數(shù)是準確率與召回率的調(diào)和平均
任務一:交叉驗證
用10折交叉驗證來評估之前的邏輯回歸模型
計算交叉驗證精度的平均值
#提示:交叉驗證 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Image('Snipaste_2020-01-05_16-37-56.png')
提示4
交叉驗證在sklearn中的模塊為sklearn.model_selection
from sklearn.model_selection import cross_val_score
lr = LogisticRegression(C=100) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? scores = cross_val_score(lr,X_train,y_train,cv =10)
scores
print('Average cross-validation score:{:.2f}'.format(scores.mean()))
思考4
k折越多的情況下會帶來什么樣的影響寿冕?
任務二:混淆矩陣
計算二分類問題的混淆矩陣
計算精確率、召回率以及f-分數(shù)
【思考】什么是二分類問題的混淆矩陣萝招,理解這個概念蚂斤,知道它主要是運算到什么任務中的
Image('Snipaste_2020-01-05_16-38-26.png')
#提示:準確率 (Accuracy),精確度(Precision),Recall,f-分數(shù)計算方法 Image('Snipaste_2020-01-05_16-39-27.png')
提示5
混淆矩陣的方法在sklearn中的sklearn.metrics模塊
混淆矩陣需要輸入真實標簽和預測標簽
精確率、召回率以及f-分數(shù)可使用classification_report模塊
from sklearn.metrics import confusion_matrix
# 訓練模型 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? lr = LogisticRegression(C=100) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? lr.fit(X_train, y_train)
# 模型預測結(jié)果 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? pred = lr.predict(X_train)
# 混淆矩陣 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?confusion_matrix(y_train, pred)
from sklearn.metrics import classification_report
# 精確率槐沼、召回率以及f1-score ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? print(classification_report(y_train, pred))
【思考】
如果自己實現(xiàn)混淆矩陣的時候該注意什么問題
任務三:ROC曲線
繪制ROC曲線
【思考】什么是OCR曲線曙蒸,OCR曲線的存在是為了解決什么問題捌治?
ROC的全名叫做Receiver Operating Characteristic,中文名字叫“受試者工作特征曲線”纽窟,其主要分析工具是一個畫在二維平面上的曲線——ROC 曲線肖油。平面的橫坐標是false positive rate(FPR),縱坐標是true positive rate(TPR)臂港。對某個分類器而言森枪,我們可以根據(jù)其在測試樣本上的表現(xiàn)得到一個TPR和FPR點對。這樣审孽,此分類器就可以映射成ROC平面上的一個點县袱。調(diào)整這個分類器分類時候使用的閾值,我們就可以得到一個經(jīng)過(0, 0)佑力,(1, 1)的曲線式散,這就是此分類器的ROC曲線。
提示6
ROC曲線在sklearn中的模塊為sklearn.metrics
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)") ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # 找到最接近于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)
思考6
對于多分類問題如何繪制ROC曲線
【思考】你能從這條OCR曲線的到什么信息打颤?這些信息可以做什么暴拄?