kaggle实战—泰坦尼克(五、模型搭建-模型评估)

  1. kaggle实战—泰坦尼克(一、数据分析)
  2. kaggle实战—泰坦尼克(二、数据清洗及特征处理)
  3. kaggle实战—泰坦尼克(三、数据重构)
  4. kaggle实战—泰坦尼克(四、数据可视化)
  5. kaggle实战—泰坦尼克(五、模型搭建-模型评估)

前言

相信大家都有队pandas,numpy等数据科学库有一定了解,其中不乏有很多人有专门刷过相关课程或者看多相关书籍,例如《python for data analysis》。但是在实操过程中有很多函数还是得看着官方文档来进行敲写,既费时又费力 。最近刚好datawhale发起一个相关打卡活动——实战,我就报名参加了。(ps:极力推荐这本书,大家可以去网上搜索电子版,或者也可以关注微信公众【浩波的笔记】回复data analysis来获取。

这次实践又比较偏模型和实战(完成kaggle上泰坦尼克的任务),直接给你一个任务,让你去完成,上手难度比较大,但是它的实战性可以让你对于什么是数据挖掘,以及数据挖掘的逻辑有很好的把握。所以有没有这样一门课,以项目为主线,将知识点孕育其中,通过边学,边做以及边被引导的方式来使学习效果达到更好,学完之后既能掌握pandas等的知识点又能掌握数据分析的大致思路和流程。通过调查发现,市面上这样的目好像没有可以完全符合这样的标准(失望.jpg)。

模型搭建-模型评估

经过前面的探索性数据分析我们可以很清楚的了解到数据集的情况,以及得出了一些结论。下面我们将搭建一个预测模型,运用机器学习的方式来为泰坦尼克船只做一个预测,我们在测试集的数据中来预
测哪些乘客将会存活,哪些乘客将遭遇不幸。然后我们会对我们的模型做一个评价。

这次博客的内容可以学习到数据建模以及模型评价的知识,算是进阶的内容,为之后的数据分析打下基础。

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'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
plt.rcParams['figure.figsize'] = (10, 6) # 设置输出图片大小

# 读取训练数集
train = pd.read_csv('E:/python-project/deep-learning/datawhale/kaggle/tantatic/hands-on-data-analysis-master/data/train.csv')
train.shape
#(891, 12)
train.head()

在这里插入图片描述

特征工程

任务一:缺失值填充

  1. 对分类变量缺失值:填充某个缺失值字符(NA)、用最多类别的进行填充
  2. 对连续变量缺失值:填充均值、中位数、众数
# 对分类变量进行填充
train['Cabin'] = train['Cabin'].fillna('NA')
train['Embarked'] = train['Embarked'].fillna('S')
# 对连续变量进行填充
train['Age'] = train['Age'].fillna(train['Age'].mean())
# 检查缺失值比例
train.isnull().mean().sort_values(ascending=False)

在这里插入图片描述

任务二:编码分类变量

# 取出所有的输入特征
data = train[['Pclass','Sex','Age','SibSp','Parch','Fare', 'Embarked']]
# 进行虚拟变量转换
data = pd.get_dummies(data)
data.head()

在这里插入图片描述

模型搭建

  1. 处理完前面的数据我们就得到建模数据,下一步是选择合适模型
  2. 在进行模型选择之前我们需要先知道数据集最终是进行监督学习还是无监督学习 3. 除了根据我们任务来选择模型外,还可以根据数据样本量以及特征的稀疏性来决定
  3. 刚开始我们总是先尝试使用一个基本的模型来作为其baseline,进而再训练其他模型做对比,最终选择泛化能力或性能比较好的模型

思考1. 数据集哪些差异会导致模型在拟合数据是发生变化

推荐阅读:欠拟合和过拟合以及如何选择模型https://blog.csdn.net/weixin_44023658/article/details/107618305

在这里插入图片描述
任务一:切割训练集和测试集

  1. 按比例切割训练集和测试集(一般测试集的比例有30%、25%、20%、15%和10%)

  2. 按目标变量分层进行等比切割

  3. 设置随机种子以便结果能复现
    提示

  4. 切割数据集是为了后续能评估模型泛化能力

  5. sklearn中切割数据集的方法为 train_test_split

  6. 查看函数文档可以在jupyter noteboo里面使用 train_test_split? 后回车即可看到

     	Docstring:
     Split arrays or matrices into random train and test subsets
     
     Quick utility that wraps input validation and
     ``next(ShuffleSplit().split(X, y))`` and application to input data
     into a single call for splitting (and optionally subsampling) data in a
     oneliner.
     
     Read more in the :ref:`User Guide <cross_validation>`.
    
  7. 分层和随机种子在参数里寻找
    思考

  8. 什么情况下切割数据集的时候不用进行随机选取
    在数据集比较大而且重复实验并不需要全部数据集时一般不要这么做,数量太小时也不推荐

from sklearn.model_selection import train_test_split
# 一般先取出X和y后再切割,有些情况会使用到未切割的,这时候X和y就可以用
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
#((668, 10), (223, 10))
'''
train_test_split例子
原型:
X_train,X_test,y_train,y_test=cross_validation.train_test_split(train_data,train_target,test_size=0.4, random_state=0)
rain_data:所要划分的样本特征集
train_target:所要划分的样本结果
test_size:样本占比,如果是整数的话就是样本的数量
random_state:是随机数的种子。
随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。比如你每次都填1,
其他参数一样的情况下你得到的随机数组是一样的。但填0或不填,每次都会不一样。
随机数的产生取决于种子,随机数和种子之间的关系遵从以下两个规则:
种子不同,产生不同的随机数;种子相同,即使实例不同也产生相同的随机数
'''

>>> import numpy as np
>>> from sklearn.model_selection import train_test_split
>>> X, y = np.arange(10).reshape((5, 2)), range(5)
>>> X
array([[0, 1],
       [2, 3],
       [4, 5],
       [6, 7],
       [8, 9]])
>>> list(y)
[0, 1, 2, 3, 4]

>>> X_train, X_test, y_train, y_test = train_test_split(
...     X, y, test_size=0.33, random_state=42)
...
>>> X_train
array([[4, 5],
       [0, 1],
       [6, 7]])
>>> y_train
[2, 0, 3]
>>> X_test
array([[2, 3],
       [8, 9]])
>>> y_test
[1, 4]

>>> train_test_split(y, shuffle=False)
[[0, 1, 2], [3, 4]]

任务二:模型创建

  1. 创建基于线性模型的分类模型(逻辑回归)
  2. 创建基于树的分类模型(决策树随机森林
  3. 查看模型的参数,并更改参数值,观察模型变化

提示
4. 逻辑回归不是回归模型而是分类模型,不要与 LinearRegression 混淆
5. 随机森林其实是决策树集成为了降低决策树过拟合的情况
6. 线性模型所在的模块为 sklearn.linear_model
7. 树模型所在的模块为 sklearn.ensemble

from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier

# 默认参数逻辑回归模型
lr = LogisticRegression()
lr.fit(X_train, y_train)

'''
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
                   intercept_scaling=1, l1_ratio=None, max_iter=100,
                   multi_class='auto', n_jobs=None, penalty='l2',
                   random_state=None, solver='lbfgs', tol=0.0001, verbose=0,
                   warm_start=False)
'''
# 查看训练集和测试集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)))

#Training set score: 0.80
#Testing set score: 0.78
# 调整参数后的逻辑回归模型
lr2 = LogisticRegression(C=100)
lr2.fit(X_train, y_train)

'''
LogisticRegression(C=100, class_weight=None, dual=False, fit_intercept=True,
                   intercept_scaling=1, l1_ratio=None, max_iter=100,
                   multi_class='auto', n_jobs=None, penalty='l2',
                   random_state=None, solver='lbfgs', tol=0.0001, verbose=0,
                   warm_start=False)
'''

print("Training set score: {:.2f}".format(lr2.score(X_train, y_train)))
print("Testing set score: {:.2f}".format(lr2.score(X_test, y_test)))
#Training set score: 0.81
#Testing set score: 0.78
# 默认参数的随机森林分类模型
rfc = RandomForestClassifier()
rfc.fit(X_train, y_train)
'''
RandomForestClassifier(bootstrap=True, ccp_alpha=0.0, class_weight=None,
                       criterion='gini', max_depth=None, max_features='auto',
                       max_leaf_nodes=None, max_samples=None,
                       min_impurity_decrease=0.0, min_impurity_split=None,
                       min_samples_leaf=1, min_samples_split=2,
                       min_weight_fraction_leaf=0.0, n_estimators=100,
                       n_jobs=None, oob_score=False, random_state=None,
                       verbose=0, warm_start=False)
'''

print("Training set score: {:.2f}".format(rfc.score(X_train, y_train)))
print("Testing set score: {:.2f}".format(rfc.score(X_test, y_test)))
#Training set score: 0.99
#Testing set score: 0.81
# 调整参数后的随机森林分类模型
rfc2 = RandomForestClassifier(n_estimators=100, max_depth=5)
rfc2.fit(X_train, y_train)
‘’‘
RandomForestClassifier(bootstrap=True, ccp_alpha=0.0, class_weight=None,
                       criterion='gini', max_depth=5, max_features='auto',
                       max_leaf_nodes=None, max_samples=None,
                       min_impurity_decrease=0.0, min_impurity_split=None,
                       min_samples_leaf=1, min_samples_split=2,
                       min_weight_fraction_leaf=0.0, n_estimators=100,
                       n_jobs=None, oob_score=False, random_state=None,
                       verbose=0, warm_start=False)
’‘’

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.86
#Testing set score: 0.81

任务三:输出模型预测结果

  1. 输出模型预测分类标签
  2. 输出不同分类标签的预测概率
    提示
  3. 一般监督模型在sklearn里面有个 predict 能输出预测标签, predict_proba 则可以输出标签概率
    思考
  4. 预测标签的概率对我们有什么帮助
    来查看我们模型的优劣,也可以进行问题转换
# 预测标签
pred = lr.predict(X_train)
# 此时我们可以看到0和1的数组
pred[:10]
#array([0, 1, 1, 1, 0, 0, 1, 0, 1, 1], dtype=int64)
# 预测标签概率
pred_proba = lr.predict_proba(X_train)
pred_proba[:10]
'''
array([[0.62887291, 0.37112709],
 [0.14897206, 0.85102794],
 [0.47162003, 0.52837997],
 [0.20365672, 0.79634328],
 [0.86428125, 0.13571875],
 [0.9033887 , 0.0966113 ],
 [0.13829338, 0.86170662],
 [0.89516141, 0.10483859],
 [0.05735141, 0.94264859],
 [0.13593291, 0.86406709]])
'''

模型评估

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

任务一:交叉验证
注:还对交叉验证不清楚同学建议先阅读:机器学习面试题集 - 详解四种交叉验证方法
7. 用10折交叉验证来评估逻辑回归模型
8. 计算交叉验证精度的平均值

在这里插入图片描述
提示
9. 交叉验证在sklearn中的模块为 sklearn.model_selection
思考
10. k折越多的情况下会带来什么样的影响?
k折越多为留一法,是K折的另一种极端情况,即K=n。随着K值的不断升高,单一模型评估时的方差逐渐加大而偏差减小。但从总体模型角度来看,反而是偏差升高了而方差降低了。
推荐阅读:「交叉验证」到底如何选择K值?

from sklearn.model_selection import cross_val_score

lr = LogisticRegression(C=100)
scores = cross_val_score(lr, X_train, y_train, cv=10)

# k折交叉验证分数
scores
'''
array([0.82089552, 0.7761194 , 0.82089552, 0.79104478, 0.85074627,
       0.86567164, 0.73134328, 0.86567164, 0.75757576, 0.6969697 ])
'''

# 平均交叉验证分数
print("Average cross-validation score: {:.2f}".format(scores.mean()))
#Average cross-validation score: 0.80

任务二:混淆矩阵

  1. 计算二分类问题的混淆矩阵
  2. 计算精确率、召回率以及f-分数

在这里插入图片描述
关于混淆矩阵介绍,推荐阅读:混淆矩阵是什么意思?
提示

  1. 混淆矩阵的方法在sklearn中的 sklearn.metrics 模块
  2. 混淆矩阵需要输入真实标签和预测标签
    在这里插入图片描述
from sklearn.metrics import confusion_matrix
# 模型预测结果
pred = lr.predict(X_train)
# 混淆矩阵
confusion_matrix(y_train, pred)

'''
array([[354,  58],
       [ 72, 184]], dtype=int64)
'''
from sklearn.metrics import classification_report
# 精确率、召回率以及f1-score
print(classification_report(y_train, pred))

'''
              precision    recall  f1-score   support

           0       0.83      0.86      0.84       412
           1       0.76      0.72      0.74       256

    accuracy                           0.81       668
   macro avg       0.80      0.79      0.79       668
weighted avg       0.80      0.81      0.80       668
'''

任务三:ROC曲线
推荐阅读:机器学习基础(1)- ROC曲线理解

  1. 绘制ROC曲线
    提示
  2. ROC曲线在sklearn中的模块为 sklearn.metrics
  3. ROC曲线下面所包围的面积越大越好
    思考
  4. 对于多分类问题如何绘制ROC曲线
    还是看这篇文章吧:多分类下的ROC曲线和AUC
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)

在这里插入图片描述

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浩波的笔记

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值