动手学数据分析学习报告task5

第三章 模型搭建和评估–建模

经过前面的两章的知识点的学习,我可以对数数据的本身进行处理,比如数据本身的增删查补,还可以做必要的清洗工作。那么下面我们就要开始使用我们前面处理好的数据了。这一章我们要做的就是使用数据,我们做数据分析的目的也就是,运用我们的数据以及结合我的业务来得到某些我们需要知道的结果。那么分析的第一步就是建模,搭建一个预测模型或者其他模型;我们从这个模型的到结果之后,我们要分析我的模型是不是足够的可靠,那我就需要评估这个模型。今天我们学习建模,下一节我们学习评估。

我们拥有的泰坦尼克号的数据集,那么我们这次的目的就是,完成泰坦尼克号存活预测这个任务。

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)  # 设置输出图片大小

【思考】这些库的作用是什么呢?你需要查一查
pandas:是基于NumPy 的一种工具,该工具是为解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
numpy:是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix)),支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
matplotlib:是 Python 的绘图库,它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式。可以用来绘制各种静态,动态,交互式的图表。是一个非常强大的 Python 画图工具,我们可以使用该工具将很多数据通过图表的形式更直观的呈现出来。
seaborn:是python中的一个可视化库,是对matplotlib进行二次封装而成,既然是基于matplotlib,所以seaborn的很多图表接口和参数设置与其很是接近。

载入我们提供清洗之后的数据(clear_data.csv),大家也将原始数据载入(train.csv),说说他们有什么不同

TrainSet = pd.read_csv('../data/train.csv')
CleanSet = pd.read_csv('clear_data.csv')
print(TrainSet.head())

print(CleanSet.head())

在这里插入图片描述

任务一:切割训练集和测试集

这里使用留出法划分数据集

将数据集分为自变量和因变量
按比例切割训练集和测试集(一般测试集的比例有30%、25%、20%、15%和10%)
使用分层抽样
设置随机种子以便结果能复现
【思考】

划分数据集的方法有哪些?
为什么使用分层抽样,这样的好处有什么?
答:
划分数据集的方法:
留出法(Hold-out)
交叉验证法(Cross validation)
自助法(Bootstrapping)
分层抽样将总体单位按其属性特征分成若干类型或层,然后在类型或层中随机抽取样本单位。好处是通过划类分层,增大了各类型中单位间的共同性,容易抽出具有代表性的调查样本,抽样误差比较小。

任务提示1
切割数据集是为了后续能评估模型泛化能力
sklearn中切割数据集的方法为train_test_split
查看函数文档可以在jupyter noteboo里面使用train_test_split?后回车即可看到
分层和随机种子在参数里寻找
要从clear_data.csv和train.csv中提取train_test_split()所需的参数

x = CleanSet
y = TrainSet['Survived']
from sklearn.model_selection import train_test_split
help(train_test_split)

在这里插入图片描述

x_train,x_test,y_train,y_test=train_test_split(x,y,random_state=42,stratify=y)
x_train.shape,x_test.shape

在这里插入图片描述
【思考】
什么情况下切割数据集的时候不用进行随机选取
答:随机选取就是通过随机选取的样本来代表总体,这样样本具有随机性、代表性。可以不用随机选取的情况是数据集本身就足够随机,这种情况一般是随机处理后的。

任务二:模型创建

创建基于线性模型的分类模型(逻辑回归)
创建基于树的分类模型(决策树、随机森林)
分别使用这些模型进行训练,分别的到训练集和测试集的得分
查看模型的参数,并更改参数值,观察模型变化\

提示:

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

from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
Lr = LogisticRegression().fit(x_train,y_train)
print('训练集得分:{:.3f}'.format(Lr.score(x_train,y_train)))
print('测试集得分:{:.3f}'.format(Lr.score(x_test,y_test)))

在这里插入图片描述

Lr1 = LogisticRegression(C = 1000).fit(x_train,y_train)
print('训练集得分:{:.3f}'.format(Lr1.score(x_train,y_train)))
print('测试集得分:{:.3f}'.format(Lr1.score(x_test,y_test)))

在这里插入图片描述

Rf = RandomForestClassifier().fit(x_train,y_train)
print('训练集得分:{:.3f}'.format(Rf.score(x_train,y_train)))
print('测试集得分:{:.3f}'.format(Rf.score(x_test,y_test)))

在这里插入图片描述

Rf1 = RandomForestClassifier(max_depth=10).fit(x_train,y_train)
print('训练集得分:{:.3f}'.format(Rf1.score(x_train,y_train)))
print('测试集得分:{:.3f}'.format(Rf1.score(x_test,y_test)))

在这里插入图片描述

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

输出模型预测分类标签
输出不同分类标签的预测概率
提示3
一般监督模型在sklearn里面有个predict能输出预测标签,predict_proba则可以输出标签概率

Rf.predict(x_test)

在这里插入图片描述

Rf.predict_proba(x_test)

在这里插入图片描述
【思考】

预测标签的概率对我们有什么帮助

答:预测标签的概率能够让我们判断该标签的可信度,越接近1的话可信度越高,如果接近0.5的话,可信度就不高了。

第三章 模型搭建和评估-评估

任务:加载数据并分割测试集和训练集

TrainSet = pd.read_csv('../data/train.csv')
CleanSet = pd.read_csv('clear_data.csv')
x = CleanSet
y = TrainSet['Survived']
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(x,y,random_state=42,stratify=y)

模型评估

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

【思考】:将上面的概念进一步的理解,大家可以做一下总结

交叉验证是在机器学习建立模型和验证模型参数时常用的办法,一般被用于评估一个机器学习模型的表现。更多的情况下,我们也用交叉验证来进行模型选择(model selection)。

交叉验证,顾名思义,就是重复的使用数据,把得到的样本数据进行切分,组合为不同的训练集和测试集,用训练集来训练模型,用测试集来评估模型预测的好坏。在此基础上可以得到多组不同的训练集和测试集,某次训练集中的某样本在下次可能成为测试集中的样本,即所谓“交叉”。

那么什么时候才需要交叉验证呢?交叉验证用在数据不是很充足的时候。如果数据样本量小于一万条,我们就会采用交叉验证来训练优化选择模型。如果样本大于一万条的话,我们一般随机的把数据分成三份,一份为训练集(Training Set),一份为验证集(Validation Set),最后一份为测试集(Test Set)。用训练集来训练模型,用验证集来评估模型预测的好坏和选择模型及其对应的参数。把最终得到的模型再用于测试集,最终决定使用哪个模型以及对应参数。

基本方法

根据切分的方法不同,交叉验证分为下面三种:

1、保留交叉验证 hand-out cross validation

首先随机地将已给数据分为两部分:训练集和测试集 (例如,70% 训练集,30% 测试集);
然后用训练集在各种条件下 (比如,不同的参数个数) 训练模型,从而得到不同的模型;
在测试集上评价各个模型的测试误差,选出测试误差最小的模型。
缺点:这种方式其实严格意义上并不能算是交叉验证,因为训练集的样本数始终是那么多,模型并没有看到更多的样本,没有体现交叉的思想。由于是随机的将原始数据分组,所以最后测试集上准确率的高低与原始数据的分组有很大的关系,所以这种方法得到的结果其实并不具有说服性。

2、k折交叉验证 k-fold cross validation

首先随机地将数据集切分为 k 个互不相交的大小相同的子集;
然后将 k-1 个子集当成训练集训练模型,剩下的 (held out) 一个子集当测试集测试模型;
将上一步对可能的 k 种选择重复进行 (每次挑一个不同的子集做测试集);
这样就训练了 k 个模型,每个模型都在相应的测试集上计算测试误差,得到了 k 个测试误差,对这 k 次的测试误差取平均便得到一个交叉验证误差。这便是交叉验证的过程。

3、留一交叉验证 leave-one-out cross validation

k折交叉验证的特殊情况,k=N,N 是数据集的样本数量,这样对于 N个样本,每次选择 N-1个样本来训练数据,留一个样本来验证模型预测的好坏。此方法主要用于样本量非常少的情况,比如对于普通适中问题, N小于50时,一般采用留一交叉验证。留一交叉验证的优点是:
• 每一回合中几乎所有的样本皆用于训练模型,因此最接近原始样本的分布,这样评估所得的结果比较可靠。
• 实验过程中没有随机因素会影响实验数据,确保实验过程是可以被复制的。
缺点是:
• 计算成本高,因为需要建立的模型数量和原始数据集样本数量一致,尤其当样本数量很大的时候。可以考虑并行化训练模型减少训练时间。

共同缺点:
在数据分组的时候缺乏随机性,以 k折交叉验证 为例,每个数据样本只能固定属于 k 个子集中的一个,可能会造成对于最终结果的影响。

任务一:交叉验证

用10折交叉验证来评估之前的逻辑回归模型
计算交叉验证精度的平均值

from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier
RF = RandomForestClassifier()
score = cross_val_score(RF,x_train,y_train,cv=10)
score

在这里插入图片描述

score.mean()

在这里插入图片描述

任务二:混淆矩阵

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

提示5

混淆矩阵的方法在sklearn中的sklearn.metrics模块
混淆矩阵需要输入真实标签和预测标签
精确率、召回率以及f-分数可使用classification_report模块

from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report
RF = RandomForestClassifier().fit(x_train,y_train)
y_pred = RF.predict(x_test)
confusion_matrix(y_test,y_pred,labels=[0,1])

在这里插入图片描述

y_test.value_counts()

在这里插入图片描述

print(classification_report(y_test,y_pred))

在这里插入图片描述

任务三:ROC曲线

绘制ROC曲线

from sklearn.metrics import roc_curve
RF1=RF.predict_proba(x_test)
y_score=np.amax(RF1,axis=1)
fpr, tpr, threeholds = roc_curve(y_test,y_score)
fpr, tpr, threeholds

在这里插入图片描述

plt.plot(fpr,tpr)
plt.xlabel('False Positive Rate')
plt.ylabel('Ture Positive Rate')
close_zero = np.argmin(np.abs(threeholds))
plt.plot(fpr[close_zero],tpr[close_zero],'x')

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值