【数据分析】 Titanic乘客获救预测(3)建模与评估

数据分析 专栏收录该内容
3 篇文章 0 订阅

1 建立模型

1.1 数据导入

# 导入数据
# 原始训练数据train
train = pd.read_csv('titanic/titanic_train.csv')
# 特征处理后数据data
data = pd.read_csv('titanic/clear_data.csv')

1.2 模型选择

  • 判断数据集最终是进行监督学习还是无监督学习 ,通过我们要完成的任务,以及数据样本量,特征的稀疏性等来决定
  • 通常先尝试使用一个基本的模型来作为其baseline,进而再训练其他模型做对比,最终选择泛化能力或性能比较好的模型
  • 使用机器学习最常用的一个库(sklearn)来完成我们的模型的搭建

在这里插入图片描述

1.3 建模

1.3.1 切割训练集与测试集

from sklearn.model_selection import train_test_split
X = data.drop(['Survived'],axis=1)
print(data.shape,X.shape)
y = data['Survived']
(891, 19) (891, 18)
# 数据集切割
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=0)
# 划分比例默认为0.25
  • stratify:保持测试集与整个数据集里y的数据分类比例一致。比如整个数据集中Survived的生存/死亡的比例为0.4,那么在测试集中该比例也为0.4
  • train_test_split()函数参数详解

1.3.2 逻辑回归模型

# 逻辑回归
from sklearn.linear_model import LogisticRegression
# 默认参数下拟合模型
lr = LogisticRegression()
lr.fit(X_train, y_train)

# 查看训练集和测试集score值
print("训练集score:{:.2f}".format(lr.score(X_train, y_train)))
print("测试集score: {:.2f}".format(lr.score(X_test, y_test)))
# str.format()格式化,在这里输出score结果的两位小数的值
训练集score:0.81
测试集score: 0.80
  • score() :返回该次预测的系数 R 2 R^2 R2
    R 2 = 1 − u / v R^2=1-u/v R2=1u/v
    u = ( y _ t r u e − y _ p r e d ) 2 . s u m ( ) u =(y\_true - y\_pred)^2 .sum() u=(y_truey_pred)2.sum()
    u = ( y _ t r u e − y _ t r u e . m e a n ( ) ) 2 . s u m ( ) u =(y\_true - y\_true.mean())^2 .sum() u=(y_truey_true.mean())2.sum()
    其中可能得到的最好的分数是1,且可能是负值(因为模型可能会变得更加糟糕),当一个模型不论输入何种特征值,其总是输出期望的y的时候,此时返回0。

  • str.format() :格式化函数

调整逻辑回归模型的参数

# 调整参数后的逻辑回归模型
lr2 = LogisticRegression(C=100)
lr2.fit(X_train, y_train)
print("训练集score: {:.2f}".format(lr2.score(X_train, y_train)))
print("测试集score: {:.2f}".format(lr2.score(X_test, y_test)))

在这里插入图片描述
逻辑回归参数

训练集score: 0.81
测试集score: 0.81

1.3.3 随机森林模型

# 随机森林模型
# 调整参数后的随机森林分类模型
from sklearn.ensemble import RandomForestClassifier
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)))
Training set score: 0.89
Testing set score: 0.84

1.3.4 模型预测结果

# 模型预测结果
# 预测标签(0/1)
pred = lr.predict(X_train)
# 预测标签概率 得到结果两列分别表示预测为0和预测为1的概率
pred_proba = lr.predict_proba(X_train)

2 模型评估

模型评估是为了明确模型的泛化能力。

  • 交叉验证(cross-validation)是一种评估泛化性能的统计学方法,它比单次划分训练集和测试集的方法更加稳定、全面。数据被多次划分,并且需要训练多个模型。最常用的是 k 折交叉验证(k-fold cross-validation), k 通常取 5 或 10。
  • 准确率(precision)度量的是被预测为正例的样本中有多少是真正的正例
  • 召回率(recall)度量的是正类样本中有多少被预测为正类
  • f-分数是准确率与召回率的调和平均

2.1 交叉验证

  • 交叉验证用于评估模型的预测性能,尤其是训练好的模型在新数据上的表现,可以在一定程度上减小过拟合。
  • 还可以从有限的数据中获取尽可能多的有效信息。
    在这里插入图片描述
# 交叉验证
from sklearn.model_selection import cross_val_score
lr = LogisticRegression(C=100)
scores = cross_val_score(lr, X_train, y_train, cv=10) #十折验证
print(scores)
print("平均分数: {:.2f}".format(scores.mean()))
[0.80882353 0.79411765 0.8358209  0.8358209  0.85074627 0.85074627
 0.74242424 0.86363636 0.71212121 0.72727273]
 
 平均分数: 0.80

cross_val_score()
-sklearn.model_selection.cross_val_score(estimator, X, y=None, groups=None, scoring=None, cv=’warn’, n_jobs=None, verbose=0, fit_params=None, pre_dispatch=‘2*n_jobs’, error_score=’raise-deprecating’)

  • estimator: 需要使用交叉验证的模型
  • X: 输入样本数据
  • y: 样本标签
  • groups: 将数据集分割为训练/测试集时使用的样本的组标签(一般用不到)
  • scoring: (重要)交叉验证的验证方式,选择不同的评价方法,会产生不同的评价结果。
    在这里插入图片描述
  • cv:整数,指交叉验证时将训练数据集划分的份数

对于kfold而言,随着k的增大,其验证的结果是越来越可靠的。不过也有它的缺点,每次训练k个模型,相当于整体的性能慢了k倍。

2.2 混淆矩阵

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • Accuracy:所有样本中预测正确的比率
  • Precision:预测为正的样本中真正为正例的个数
  • Recall :正例中预测为正的个数
  • f-score:presion与recall的调和平均
# 混淆矩阵
from sklearn.metrics import confusion_matrix
pred = lr.predict(X_train) #模型预测结果
print(confusion_matrix(y_train,pred))
[[354  58]
 [ 70 186]]

confusion_matrix()
sklearn.metrics.confusion_matrix(y_true, y_pred, labels=None, sample_weight=None)

  • y_true: 是样本真实分类结果
  • y_pred: 是样本预测分类结果
  • labels:是所给出的类别,通过这个可对类别进行选择
  • sample_weight : 样本权重
#精确率、召回率以及f1-score
from sklearn.metrics import classification_report
print(classification_report(y_train, pred))
              precision    recall  f1-score   support

          0       0.83      0.86      0.85       412
          1       0.76      0.73      0.74       256

   micro avg       0.81      0.81      0.81       668
   macro avg       0.80      0.79      0.80       668
weighted avg       0.81      0.81      0.81       668

2.3 ROC曲线

2.3.1 ROC曲线定义

ROC的全称是Receiver Operating Characteristic Curve,中文名字叫“受试者工作特征曲线”。
ROC曲线示例

  • 该曲线的横坐标为假阳性率(False Positive Rate, FPR)
    F P R = F P / ( F P + T N ) FPR = FP/(FP+TN) FPR=FP/(FP+TN)
    纵坐标为真阳性率(True Positive Rate, TPR)
    T P R = T P / ( T P + F N ) TPR = TP/(TP+FN) TPR=TP/(TP+FN)
    我们希望TPR值越高越好,FPR值越低越好。
  • 绘制完成曲线后,要对模型进行量化的分析,即AUC(Area under roc Curve)面积,指ROC曲线下的面积大小,只需要沿着ROC横轴做积分就可以了。真实场景中ROC曲线一般都会在 y = x y=x y=x的上方,取值一般在0.5~1之间。AUC的值越大,说明该模型的性能越好。

2.3.2 ROC曲线绘制

  • 假设已经得出一系列样本被划分为正类的概率Score值,按照大小排序。
  • 从高到低,依次将“Score”值作为阈值threshold,当测试样本属于正样本的概率大于或等于这个threshold时,我们认为它为正样本,否则为负样本。
  • 每次选取一个不同的threshold,得到一组FPR和TPR,以FPR值为横坐标和TPR值为纵坐标,即ROC曲线上的一点,然后画图。

roc_curve
roc_curve(y_true, y_score, pos_label=None, sample_weight=None, drop_intermediate=True)

  • y_true:数组,存储数据的标签,维度是样本数,两个值(只适用于二分类任务)
  • y_score:数组,存储数据的预测概率值,维度也是样本数
  • pos_label:整型或字符串,指定正样本是哪个
  • sample_weight:采样权重,可选参数
  • drop_intermediate:丢掉一些阈值,以便画roc曲线图
    返回值:
  • fpr
  • tpr
  • thresholds:数组,对预测值排序后的score列表,作为阈值,排序从大到小

这里理解thresholds:
分类器的一个重要功能“概率输出”,即表示分类器认为某个样本具有多大的概率属于正样本(或负样本),“Score”表示每个测试样本属于正样本的概率。接下来,我们从高到低,依次将“Score”值作为阈值threshold,当测试样本属于正样本的概率大于或等于这个threshold时,我们认为它为正样本,否则为负样本。每次选取一个不同的threshold,我们就可以得到一组FPR和TPR,即ROC曲线上的一点。当我们将threshold设置为1和0时,分别可以得到ROC曲线上的(0,0)和(1,1)两个点。将这些(FPR,TPR)对连接起来,就得到了ROC曲线。当threshold取值越多,ROC曲线越平滑。其实,我们并不一定要得到每个测试样本是正样本的概率值,只要得到这个分类器对该测试样本的“评分值”即可(评分值并不一定在(0,1)区间)。评分越高,表示分类器越肯定地认为这个测试样本是正样本,而且同时使用各个评分值作为threshold。我认为将评分值转化为概率更易于理解一些。

# ROC曲线
from sklearn.metrics import roc_curve
lr = LogisticRegression(C=100)
lr.fit(X_train, y_train)
pred = lr.decision_function(X_test)
fpr, tpr, thresholds = roc_curve(y_test, pred)

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)
plt.show()

在这里插入图片描述

2020.8.26
TBC…

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页

打赏作者

baekii

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值