本文將用“泰坦尼克船員獲救預測”這一案例展示一下使用線性回歸建模的流程苔可。
1.數(shù)據(jù)理解
首先導入原始的數(shù)據(jù)并展示數(shù)據(jù)的前5行焚辅,大致了解一下數(shù)據(jù)的情況。
原始數(shù)據(jù)中分別有以下幾列信息:PassengerId同蜻、Survived、pclass湾蔓、Name、Sex贬循、Age桃序、SibSp、Parch媒熊、Ticket、Fare滤愕、Cabin怜校、Embarked注竿。其中Survived表示是否存活也就是本次建模的目標變量。而顯然PassengerId巩割、Name、Ticket愈犹、Cabin是無意義或無法使用的變量闻丑。
import pandas as pd
titanic = pd.read_csv("train.csv")
#導入數(shù)據(jù)
titanic.head()
#展示原始數(shù)據(jù)的前5行,觀察數(shù)據(jù)的概況
2.數(shù)據(jù)預處理
輸入變量中性別和上船地點為字符串類型勋锤,需要轉(zhuǎn)化為數(shù)值類型才能用于建模侥祭。
titanic["Sex"].unique()
#展示“性別”列的所有取值可能性茄厘,只有male和female
titanic["Embarked"].unique()
#展示“上船地點”列的所有取值可能性谈宛,有S、C吆录、Q、null
titanic.loc[titanic["Sex"]=="male","Sex"]=0
titanic.loc[titanic["Sex"]=="female","Sex"]=1
titanic.loc[titanic["Embarked"]=="S","Embarked"]=0
titanic.loc[titanic["Embarked"]=="C","Embarked"]=1
titanic.loc[titanic["Embarked"]=="Q","Embarked"]=2
剛才我們看到上船地點一列中還有一部分缺失值葛假,可以這一列中取值概率最大的值來填充滋恬。
titanic.groupby("Embarked").size()
#變量不同取值的分布情況
可以看到取值概率最大的為0,即S带斑。使用0對上船地點一列的缺失值進行填充勋拟。
titanic["Embarked"]=titanic["Embarked"].fillna(0)
打印數(shù)據(jù)集的統(tǒng)計信息,繼續(xù)觀察數(shù)據(jù)挂滓⌒ル剩可以發(fā)現(xiàn)年齡一列存在缺失值。
titanic.describe()
使用年齡的中位數(shù)對缺失值進行填充贝椿。
titanic["Age"]=titanic["Age"].fillna(titanic["Age"].median())
3.線性回歸建模
在建模這一步需要先對數(shù)據(jù)集進行劃分陷谱,分為訓練集和測試集,這里我們采用k重交叉驗證的方法烟逊。然后只要調(diào)用線性回歸模型,設置相應的參數(shù)然后代入數(shù)據(jù)進行訓練即可图毕。
from sklearn.linear_model import LinearRegression
#引入線性回歸的模型包
from sklearn.model_selection import KFold
#引入K重交叉驗證的模型包
predictors=["pclass","Sex","Age","SibSp","Parch","Fare","Embarked"]
#輸入建模輸入變量
alg=LinearRegression()
#定義一個變量等于線性回歸模型
kf=KFold(n_splits=3,shuffle=False,random_state=1)
#設置交叉驗證的相關(guān)參數(shù)眷唉,n_splits代表k
predictions=[]
#定義一個變量存放預測值
for train,test in kf.split(titanic[predictions]):
train_predictors = (titanic[predictors].iloc[train,:])
#取出訓練集中的船員特征屬性
train_target = titanic["Survived"].iloc[train]
#取出訓練集中是否獲救的結(jié)果
#這里使用了3重交叉驗證囤官,所以訓練集數(shù)據(jù)對應就分別有三個數(shù)據(jù)集蛤虐,后續(xù)這三個訓練集會分別代入模型訓練,最終取平均值作為預測結(jié)果
alg.fit(train_predictors,train_target)
#將訓練集數(shù)據(jù)代入線性回歸模型進行訓練
test_predictors = alg.predict(titanic[predictors].iloc[test,:])
#使用測試集對模型進行測試
predictions.append(test_predictors)
#收集結(jié)果
4.模型評估
訓練完成之后就可以通過測試集得到的預測值通過混淆矩陣等方法對模型進行評估刑顺。下面我們可以先對預測值進行處理饲常,然后計算模型的準確率。
import numpy as np
predictions = np.concatenate(predictions,axis=0)
#將測試集得到的預測值連接起來放到一個變量中柒竞。在測試時由于是多重交叉驗證播聪,所以得到的結(jié)果實際上是存在三個數(shù)組中的
predictions[predictions >.5] = 1
predictions[predictions <=.5] = 0
predictions.dtype = "float64"
#將預測值大于0.5的定義為存活,預測值小于等于0.5的定義為未存活
print("測試數(shù)據(jù)總數(shù)量",len(predictions))
print("正確的數(shù)量:",sum(predictions == titanic["Survived"]))
accuracy = sum(predictions == titanic["Survived"]) / len(predictions)
print("準確率為:",accuracy)
可以看到此次建模的準確率約為78%稼虎,并不是特別高招刨。對于這種情況,我們可以從數(shù)據(jù)處理技巧沉眶、建模算法、參數(shù)調(diào)節(jié)等方面繼續(xù)深入探索,以得到更優(yōu)的模型淘衙。