模型搭建和評估
1經(jīng)過前面的探索性數(shù)據(jù)分析我們可以很清楚的了解到數(shù)據(jù)集的情況
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from IPython.display import Image
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用來正常顯示中文標(biāo)簽
plt.rcParams['axes.unicode_minus'] = False # 用來正常顯示負(fù)號
plt.rcParams['figure.figsize'] = (10, 6) # 設(shè)置輸出圖片大小
# 讀取訓(xùn)練數(shù)集
train = pd.read_csv('train.csv')
train.shape
image.png
train.head()
image.png
2.特征工程
(1)缺失值填充
- 對分類變量缺失值:填充某個(gè)缺失值字符(NA)证逻、用最多類別的進(jìn)行填充
- 對連續(xù)變量缺失值:填充均值、中位數(shù)男公、眾數(shù)
# 對分類變量進(jìn)行填充
train['Cabin'] = train['Cabin'].fillna('NA')
train['Embarked'] = train['Embarked'].fillna('S')
# 對連續(xù)變量進(jìn)行填充
train['Age'] = train['Age'].fillna(train['Age'].mean())
# 檢查缺失值比例
train.isnull().sum().sort_values(ascending=False)
image.png
(2)編碼分類變量
# 取出所有的輸入特征
data = train[['Pclass','Sex','Age','SibSp','Parch','Fare', 'Embarked']]
# 進(jìn)行虛擬變量轉(zhuǎn)換
data = pd.get_dummies(data)
data.head()
image.png
3.模型搭建
處理完前面的數(shù)據(jù)我們就得到建模數(shù)據(jù)车摄,下一步是選擇合適模型
在進(jìn)行模型選擇之前我們需要先知道數(shù)據(jù)集最終是進(jìn)行監(jiān)督學(xué)習(xí)還是無監(jiān)督學(xué)習(xí)
除了根據(jù)我們?nèi)蝿?wù)來選擇模型外,還可以根據(jù)數(shù)據(jù)樣本量以及特征的稀疏性來決定
剛開始我們總是先嘗試使用一個(gè)基本的模型來作為其baseline,進(jìn)而再訓(xùn)練其他模型做對比没宾,最終選擇泛化能力或性能比較好的模型
(1)# sklearn模型算法選擇路徑圖
Image('20170624105439491.png')
image.png
(2)切割訓(xùn)練集和測試集
- 按比例切割訓(xùn)練集和測試集(一般測試集的比例有30%、25%沸柔、20%循衰、15%和10%)
- 按目標(biāo)變量分層進(jìn)行等比切割
- 設(shè)置隨機(jī)種子以便結(jié)果能復(fù)現(xiàn)
提示1
- 切割數(shù)據(jù)集是為了后續(xù)能評估模型泛化能力
- sklearn中切割數(shù)據(jù)集的方法為
train_test_split
- 查看函數(shù)文檔可以在jupyter noteboo里面使用
train_test_split?
后回車即可看到 - 分層和隨機(jī)種子在參數(shù)里尋找
from sklearn.model_selection import train_test_split
# 一般先取出X和y后再切割,有些情況會使用到未切割的褐澎,這時(shí)候X和y就可以用
X = data
y = train['Survived']
# 對數(shù)據(jù)集進(jìn)行切割
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=0)
# 查看數(shù)據(jù)形狀
X_train.shape, X_test.shape
image.png
(3)模型創(chuàng)建
- 創(chuàng)建基于線性模型的分類模型(邏輯回歸)
- 創(chuàng)建基于樹的分類模型(決策樹会钝、隨機(jī)森林)
- 查看模型的參數(shù),并更改參數(shù)值工三,觀察模型變化
提示2 - 邏輯回歸不是回歸模型而是分類模型迁酸,不要與
LinearRegression
混淆 - 隨機(jī)森林其實(shí)是決策樹集成為了降低決策樹過擬合的情況
- 線性模型所在的模塊為
sklearn.linear_model
- 樹模型所在的模塊為
sklearn.ensemble
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
# 默認(rèn)參數(shù)邏輯回歸模型
lr = LogisticRegression()
lr.fit(X_train, y_train)
image.png
# 查看訓(xùn)練集和測試集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)))
image.png
# 調(diào)整參數(shù)后的邏輯回歸模型
lr2 = LogisticRegression(C=100)
lr2.fit(X_train, y_train)
image.png
print("Training set score: {:.2f}".format(lr2.score(X_train, y_train)))
print("Testing set score: {:.2f}".format(lr2.score(X_test, y_test)))
image.png
# 默認(rèn)參數(shù)的隨機(jī)森林分類模型
rfc = RandomForestClassifier()
rfc.fit(X_train, y_train)
image.png
print("Training set score: {:.2f}".format(rfc.score(X_train, y_train)))
print("Testing set score: {:.2f}".format(rfc.score(X_test, y_test)))
image.png
# 調(diào)整參數(shù)后的隨機(jī)森林分類模型
rfc2 = RandomForestClassifier(n_estimators=100, max_depth=5)
rfc2.fit(X_train, y_train)
image.png
print("Training set score: {:.2f}".format(rfc2.score(X_train, y_train)))
print("Testing set score: {:.2f}".format(rfc2.score(X_test, y_test)))
image.png
(4)輸出模型預(yù)測結(jié)果
- 輸出模型預(yù)測分類標(biāo)簽
- 輸出不通分類標(biāo)簽的預(yù)測概率
提示
- 一般監(jiān)督模型在sklearn里面有個(gè)
predict
能輸出預(yù)測標(biāo)簽,predict_proba
則可以輸出標(biāo)簽概率
image.png
(5)模型評估
- 模型評估是為了知道模型的泛化能力俭正。
- 交叉驗(yàn)證(cross-validation)是一種評估泛化性能的統(tǒng)計(jì)學(xué)方法奸鬓,它比單次劃分訓(xùn)練集和測試集的方法更加穩(wěn)定、全面掸读。
- 在交叉驗(yàn)證中串远,數(shù)據(jù)被多次劃分宏多,并且需要訓(xùn)練多個(gè)模型。
- 最常用的交叉驗(yàn)證是 k 折交叉驗(yàn)證(k-fold cross-validation)抑淫,其中 k 是由用戶指定的數(shù)字绷落,通常取 5 或 10。
- 準(zhǔn)確率(precision)度量的是被預(yù)測為正例的樣本中有多少是真正的正例
- 召回率(recall)度量的是正類樣本中有多少被預(yù)測為正類
-
f-分?jǐn)?shù)是準(zhǔn)確率與召回率的調(diào)和平均
image.png
image.png
image.png
image.png
image.png
image.png
image.png