Datawhale分组学习—动手学数据分析(五)
Datawhale分组学习—动手学数据分析(五)主要是做数据建模以及模型评估。模型搭建部分:1)切分数据集为训练集和测试集;2)搭建逻辑回归模型或随机森林模型完成分类任务,通过不断调参来优化模型。模型评估部分:1)使用K折交叉验证来评估模型泛化性;2)使用混淆矩阵来计算模型的准确率、精确率、召回率以及F1分数;3)通过绘制ROC曲线来评估模型性能。
第三章 模型搭建和评估
3.1 模型搭建
本章我们的目的就是利用前两章处理过后的数据构建模型,以完成泰坦尼克号存活预测的任务。
- 处理完前面的数据我们就得到建模数据,下一步是选择合适模型
- 在进行模型选择之前我们需要先知道数据集最终是进行监督学习还是无监督学习
- 模型的选择一方面是通过我们的任务来决定的。
- 除了根据我们任务来选择模型外,还可以根据数据样本量以及特征的稀疏性来决定
- 刚开始我们总是先尝试使用一个基本的模型来作为其baseline,进而再训练其他模型做对比,最终选择泛化能力或性能比较好的模型
【监督学习与无监督学习的概念】
监督学习:从标记的数据集中进行机器学习任务。教计算机如何做事情。监督学习有2个主要的任务:回归任务;分类任务。
无监督学习:从未标记数据集中进行机器学习任务。让计算机自己去学习怎样做事情。
【监督学习与无监督学习的区别】
1、监督学习是一种目的明确的训练方式,你知道得到的是什么;而无监督学习则是没有明确目的的训练方式,你无法提前知道结果是什么。
2、监督学习需要给数据打标签;而无监督学习不需要给数据打标签。
3、监督学习由于目标明确,所以可以衡量效果;而无监督学习几乎无法量化效果如何。
这里我们使用机器学习最常用的一个库(sklearn)来完成我们的模型的搭建,下面是sklearn算法选择路径图。
【思考】数据集哪些差异会导致模型在拟合数据是发生变化
通常把数据集分为训练集和测试集。
对于训练好的模型,若在训练集表现差,在测试集表现同样会很差,这可能是欠拟合导致;若模型在训练集表现非常好,却在测试集上差强人意,则这便是过拟合导致的。
过拟合是指模型过度拟合数据。
欠拟合是指模型未能拟合大量数据。
过拟合与欠拟合也可以用 Bias 与 Variance 的角度来解释,欠拟合会导致高 Bias ,过拟合会导致高 Variance ,所以我们构建的模型需要在 Bias 与 Variance 之间做出一个权衡,从而达到一个泛化能力强的模型。
任务1:切割训练集和测试集
- 将数据集分为自变量和因变量
- 按比例切割训练集和测试集(一般测试集的比例有30%、25%、20%、15%和10%)
- 使用分层抽样
- 设置随机种子以便结果能复现
【思考】划分数据集的方法有哪些?
数据集的划分有三种方法:留出法,交叉验证法和自助法
1)留出法:直接将数据集D划分为两个互斥的集合,其中一个集合作为训练集S,另一个作为测试集T
2)k折交叉验证:通常将数据集D分为k份,其中的k-1份作为训练集,剩余的那一份作为测试集,这样就可以获得k组训练/测试集,可以进行k次训练与测试,最终返回的是k个测试结果的均值。
3)自助法:我们每次从数据集D中取一个样本作为训练集中的元素,然后把该样本放回,重复该行为m次,这样我们就可以得到大小为m的训练集,在这里面有的样本重复出现,有的样本则没有出现过,我们把那些没有出现过的样本作为测试集。对于数据量充足的时候,通常采用 留出法 或者 k折交叉验证法 来进行训练/测试集的划分;
对于数据集小且难以有效划分训练/测试集时使用 自助法。
这里使用留出法划分数据集。
【思考】为什么使用分层抽样,这样的好处有什么?
为了保证训练/测试集划分时数据分布的一致性,故采用分层抽样。
留出法与交叉验证法都是使用 分层采样 的方式进行数据采样与划分,而自助法则是使用 有放回重复采样 的方式进行数据采样。
- 切割数据集是为了后续能评估模型泛化能力
- sklearn中切割数据集的方法为
train_test_split
- 查看函数文档可以在jupyter noteboo里面使用
train_test_split?
后回车即可看到 - 分层和随机种子在参数里寻找
数据载入:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from IPython.display import Imagedata=pd.read_csv('clear_data.csv')
train=pd.read_csv('train.csv')
从clear_data.csv和train.csv中提取train_test_split()所需的参数
x=data
y=train['Survived']
从sklearn中导入切割数据集模块。
from sklearn.model_selection import train_test_split
train_test_split函数将数据随机拆分为训练集和数据集
train_test_split(
#被分割的数据,要求被分割的自变量和因变量长度是相等的
*arrays,
#测试集数据样本大小,若是浮点数,则表示测试集的占比;若是整数,则表示具体的测试集样本数量。默认占比25%
test_size=None,
#训练集数据样本大小,若是浮点数,则表示训练集的占比;若是整数,则表示具体的训练集样本数量
train_size=None,
#随机种子,默认无,若填整数,则每次生成数据相同可进行重复实验
random_state=None,
#是否先打乱数据的顺序再进行划分,默认是True
shuffle=True,
#按某一列进行分层采样
stratify=None,
)
随机种子 random_state:
当需要复现带有一定随机性的一些操作和算法时,就需要用到随机种子来固定随机的结果。
随机数是通过一些复杂的数学算法得到的,那么 随机种子(Random Seed)就是这些随机数的初始值。随机种子的初始值,是一直不变的。当使用random.seed()时,每次生成的随机数相同。
按照train_test_split函数切割本文数据集。
X_train, X_test, y_train, y_test = train_test_split( x, y,stratify=y, random_state=42)
【思考】 什么情况下切割数据集的时候不用进行随机选取?
需要复现实验结果,进行重复实验时,需要设置随机种子;若不需要复现实验结果,可在切割数据集时不用设置随机种子。
任务2:模型创建
【任务详解】
- 创建基于线性模型的分类模型(逻辑回归)
- 创建基于树的分类模型(决策树、随机森林)
- 分别使用这些模型进行训练,分别得到训练集和测试集的得分
- 查看模型的参数,并更改参数值,观察模型变化
首先导入线性模型中逻辑回归 & 树模型中随机森林模块
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
【逻辑回归】
逻辑回归是一种用于解决监督学习(Supervised Learning)问题的学习算法,属于分类问题。进行逻辑回归的目的,是使训练数据的标签值与预测出来的值之间的误差最小化。
逻辑回归模型解释可参考sklearn.linear_model.LogisticRegression
用法:
class sklearn.linear_model.LogisticRegression(penalty='l2', C=1.0, class_weight=None, random_state=None)
参数说明:
penalty:惩罚项。可选参数为l1,l2, elasticnet和None(表示无指定规范)
C:正则化强度的倒数。值越小,正则化强度越大,即防止过拟合的程度更大。
class_weight:用于标识分类模型中各种类型的权重,可以是一个字典或者’balanced’字符串。默认为None,不考虑权重。
random_state:随机数种子,可选参数,仅在正则化优化算法为sag,liblinear时有用。默认为无。
#采用逻辑回归默认参数
lr = LogisticRegression().fit(X_train, y_train) #1、创建逻辑回归模型;2、利用x,y训练集训练
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)))
#设置类别权重参数
lr2 = LogisticRegression(class_weight='balanced').fit(X_train, y_train)
print('训练集得分:{:.3f}'.format(lr2.score(X_train, y_train)))
print('测试集得分:{:.3f}'.format(lr2.score(X_test, y_test)))
【随机森林】
首先介绍决策树的概念。为了达到目标根据一定的条件进行选择的过程称为决策树。下图是一个关于是否可以贷款的决策树。
随机森林即由多个决策树组成的分类器,每个决策树并不相同,在构建决策树时,我们从训练数据中有放回的随机选取一部分样本,并且也不会使用数据的全部特征,而是随机选取部分特征进行训练。每棵树使用的样本和特征都不相同,训练出的结果也不相同。
随机森林是为了解决决策树的过拟合问题。这么做的原因:为开始训练前,无法知道哪部分数据存在异常样本,也无法知道哪些特征最能决定分类结果,随机过程降低了两个影响因素对于分类结果的影响。
随机森林模型解释可参考sklearn.ensemble.RandomForestClassifier
用法:class sklearn.ensemble.RandomForestClassifier(n_estimators=100, max_depth=None, min_samples_split=2, bootstrap=True, oob_score=False, n_jobs=None, random_state=None , class_weight=None)
参数说明:
n_estimators:决策时的数量
max_depth:最大树深度
min_samples_split:分裂一个内部节点所需的最小样本数。默认为2
bootstrap:在构建树时是否使用bootstrap示例。如果为False,则使用整个数据集来构建每棵树。
oob_score:是否使用外袋样本估计泛化评分。仅当bootstrap=True时可用。
n_jobs:并行运行的作业数量
random_state:设置随机种子
class_weight:设置类别权重
#采用随机森林默认参数
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(n_estimators=1000).fit(X_train, y_train)
print('训练集得分:{:.3f}'.format(rf1.score(X_train, y_train)))
print('测试集得分:{:.3f}'.format(rf1.score(X_test, y_test)))
#设置树最大深度
rf2 = RandomForestClassifier(max_depth=5).fit(X_train, y_train)
print('训练集得分:{:.3f}'.format(rf2.score(X_train, y_train)))
print('测试集得分:{:.3f}'.format(rf2.score(X_test, y_test)))
#设置是否使用整个数据集来构建每棵树
rf3 = RandomForestClassifier(bootstrap=False).fit(X_train, y_train)
print('训练集得分:{:.3f}'.format(rf3.score(X_train, y_train)))
print('测试集得分:{:.3f}'.format(rf3.score(X_test, y_test)))
【思考】 为什么线性模型可以进行分类任务,背后是怎么的数学关系?
线性模型的输出是一个实值,而分类任务的标记是离散值,怎么把这两者联系起来呢?其实广义线性模型已经给了我们答案,我们要做的就是找到一个单调可微的联系函数,把两者联系起来。
【思考】 对于多分类问题,线性模型是怎么进行分类的?
将多分类任务拆为若干个二分类任务,共有以下4种拆分方法。
一对一 (OvO):OvO将N个类别两两配对,从而产生N(N-1)/2个二分类任务
一对其余(OvR):OvR则是每次将一个类的样例作为正例、所有其他类的样例作为反例来训练N个分类器。
多对多 (MvM):MvM是每次将若干个类作为正类,若干个其他类作为反类。
ECOC:将编码的思想引入类别拆分,并尽可能在解码过程中具有容错性。
任务3:输出模型预测结果
【任务详解】
- 输出模型预测分类标签
- 输出不同分类标签的预测概率
监督模型在sklearn里面有个predict
能输出预测标签,predict_proba
则可以输出标签概率
1、逻辑回归模型的预测标签
lr.predict(X_train)
2、逻辑回归模型的分类标签预测概率
lr.predict_proba(X_train)
3、随机森林模型的预测标签
rf.predict(X_train)
4、随机森林模型的分类标签预测概率
rf.predict_proba(X_train)
3.2 模型评估
- 模型评估是为了知道模型的泛化能力。
- 交叉验证(cross-validation)是一种评估泛化性能的统计学方法,它比单次划分训练集和测试集的方法更加稳定、全面。
- 在交叉验证中,数据被多次划分,并且需要训练多个模型。
- 最常用的交叉验证是 k 折交叉验证(k-fold cross-validation),其中 k 是由用户指定的数字,通常取 5 或 10。
- 准确率(precision)度量的是被预测为正例的样本中有多少是真正的正例
- 召回率(recall)度量的是正类样本中有多少被预测为正类
- f-分数是准确率与召回率的调和平均
任务1:使用交叉验证评估模型
【任务详解】
- 用10折交叉验证来评估之前的逻辑回归模型
- 计算交叉验证精度的平均值
下图是一个5折交叉验证的数据分割图。
导入交叉验证模块
from sklearn.model_selection import cross_val_score
【10折交叉验证评估逻辑回归模型并计算分数平均值】
lr=LogisticRegression()
score=cross_val_score(lr, X_train, y_train, cv=10)
score.mean()
【10折交叉验证评估随机森林模型并计算分数平均值 】
rf=RandomForestClassifier()
score1=cross_val_score(rf, X_train, y_train, cv=10)
score1.mean()
【思考】 k折越多的情况下会带来什么样的影响?
当k值很大时,假设为n折,那么每次训练集的大小为n-1,几乎等于原始数据集的大小了,可以更好地学习到样本的整体分布,这种情况下模型的偏差会偏小,但是方差偏大。可以这么理解,n折交叉验证那么训练数据就会有n份,每份之间的数据差异并不大,所以他们拟合出的平均值结果对训练数据集进行预测,偏差会比较小,但是由于对于给定的数据集充分地进行了学习,导致整体的方差会偏大。
任务2:使用混淆矩阵、精确率、召回率等指标评估模型
【任务详解】
- 计算二分类问题的混淆矩阵
- 计算精确率、召回率以及f-分数
【思考】什么是二分类问题的混淆矩阵
混淆矩阵(Confusion Matrix),又称为可能性矩阵或误差矩阵,是表示精度评价的一种标准格式,用n行n列的矩阵形式来表示。
1、混淆矩阵的每一列代表了预测类别,每一列的总数表示预测为该类别的数据的数目;
2、每一行代表了数据的真实归属类别,每一行的数据总数表示该类别的数据实例的数目;每一列中的数值表示真实数据被预测为该类的数目。
混淆矩阵解释可参考sklearn.metrics.confusion_matrix
用法:sklearn.metrics.confusion_matrix(y_true, y_pred, *, labels=None, sample_weight=None, normalize=None)
参数说明:
y_true:真实值
y_pred:预测值
labels:类别标签
sample_weight:样本权重
normalize:是否对混淆矩阵进行标准化
准确率(Accuracy):准确率是最常用的分类性能指标。可以用来表示模型的精度,即模型识别正确的个数/样本的总个数。一般情况下,模型的准确度越高,说明模型的效果越好。
精确率(Precision):又称为查准率,表示在模型识别为正类的样本中,真正为正类的样本所占的比例。一般情况下,查准率越高,说明模型的效果越好。
召回率(Recall):又称为查全率,召回率表现出在实际正样本中,分类器能预测出多少。
F1分数:它被定义为查准率和查全率的调和平均数。
导入混淆矩阵和精确率等评价指标所在模块
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report
计算二分类问题的混淆矩阵
lr=LogisticRegression().fit(X_train,y_train)
y_pred=lr.predict(X_train)
confusion_matrix(y_train,y_pred,labels=[0,1])
计算精确率、召回率以及f-分数
print(classification_report(y_train,y_pred))
任务3:使用ROC曲线评估模型
【任务详解】
- 绘制ROC曲线
【思考】什么是ROC曲线,OCR曲线的存在是为了解决什么问题?
ROC曲线称为接受者操作特性曲线(receiver operating characteristic curve,简称ROC曲线)
同一个二元分类模型的阈值可能设置为高或低,每种阈值的设置会得出不同的混淆矩阵(FPR和TPR)。将同一模型每个阈值的(FPR, TPR) 坐标都画在ROC空间里,就成为特定模型的ROC曲线。(FPR, TPR公式见下图)
:方法1:通过求出FPR、TPR、thresholds的值,再画出ROC曲线
导入ROC模块
from sklearn.metrics import roc_curve
计算FPR、TPR、thresholds的值
fpr, tpr, thresholds = roc_curve(y_test, lr.decision_function(X_test), pos_label=1)
fpr, tpr, thresholds
画ROC曲线图
plt.plot(fpr, tpr)
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
方法2:直接通过ROC画图模块画图
导入画图ROC曲线模块
from sklearn.metrics import plot_roc_curve
画多根逻辑回归ROC曲线
lr = LogisticRegression().fit(X_train, y_train)
lr1 = LogisticRegression(C=1000).fit(X_train, y_train)
lr2 = LogisticRegression(class_weight='balanced').fit(X_train, y_train)lr_display=plot_roc_curve(lr,X_test,y_test,name='LR',response_method='decision_function')
plot_roc_curve(lr1,X_test,y_test,name='LR1',response_method='decision_function',ax=lr_display.ax_)
plot_roc_curve(lr2,X_test,y_test,name='LR2',response_method='decision_function',ax=lr_display.ax_)
画多根随机森林ROC曲线
rf = RandomForestClassifier().fit(X_train, y_train)
rf1 = RandomForestClassifier(n_estimators=1000).fit(X_train, y_train)
rf2 = RandomForestClassifier(max_depth=5).fit(X_train, y_train)rf_display=plot_roc_curve(rf,X_test,y_test,name='RF')
plot_roc_curve(rf1,X_test,y_test,name='RF1',ax=rf_display.ax_)
plot_roc_curve(rf2,X_test,y_test,name='RF2',ax=rf_display.ax_)
【思考】对于多分类问题如何绘制ROC曲线
ROC曲线是针对二分类的情况,对于多分类问题,ROC曲线的获取主要有两种方法:
方法1:每种类别下,都可以得到m个测试样本为该类别的概率(矩阵P中的列)。所以,根据概率矩阵P和标签矩阵L中对应的每一列,可以计算出各个阈值下的假正例率(FPR)和真正例率(TPR),从而绘制出一条ROC曲线。这样总共可以绘制出n条ROC曲线。最后对n条ROC曲线取平均,即可得到最终的ROC曲线。
方法2:首先,对于一个测试样本:1)标签只由0和1组成,1的位置表明了它的类别(可对应二分类问题中的‘’正’’),0就表示其他类别(‘’负‘’);2)要是分类器对该测试样本分类正确,则该样本标签中1对应的位置在概率矩阵P中的值是大于0对应的位置的概率值的。基于这两点,将标签矩阵L和概率矩阵P分别按行展开,转置后形成两列,这就得到了一个二分类的结果。所以,此方法经过计算后可以直接得到最终的ROC曲线。
上面的两个方法得到的ROC曲线是不同的,当然曲线下的面积AUC也是不一样的。 在python中,方法1和方法2分别对应sklearn.metrics.roc_auc_score函数中参数average值为’macro’和’micro’的情况。
【总结】本次动手学数据分析任务全部完成,一步一步,一个任务,一个任务的完成,DDL真的很有用,从中也学到了很多平时忽略的细节,这也是一个从原始数据开始进行数据清洗,数据可视化再到数据建模,完成一整个数据分析的过程,最重要的是学会动手查资料,查看方法的官方文档等。
Datawhale分组学习—动手学数据分析(五)相关推荐
- 组队学习-动手学数据分析-第二章第2、3节
复习:在前面我们已经学习了Pandas基础,第二章我们开始进入数据分析的业务部分,在第二章第一节的内容中,我们学习了数据的清洗,这一部分十分重要,只有数据变得相对干净,我们之后对数据的分析才可以更有力 ...
- 组队学习-动手学数据分析
第一章 数据载入及初步观察 1.1 载入数据 import numpy as np import pandas as pd import os #相对路径加载数据 df=pd.read_csv('tr ...
- 凌亮:动手学数据分析笔记
凌亮是华北电力大学数理系大二的学生,LSGO软件技术团队(Dreamtech算法组)成员,参加了多期Datawhale的组队学习. 这篇图文是他在线下组队学习时,为大家分享自己学习"动手学数 ...
- 【组队学习】【32期】动手学数据分析
动手学数据分析 航路开辟者:陈安东.金娟娟.杨佳达.老表.李玲.张文涛.高立业 领航员:范淑卷 航海士:武者小路.曾心怡 基本信息 内容属性:精品入门课系列 开源内容:https://github.c ...
- 【组队学习】【31期】动手学数据分析
动手学数据分析 航路开辟者:陈安东.金娟娟.杨佳达.老表.李玲.张文涛.高立业 领航员:陈玉立 航海士:陈安东.武帅.肖涵哲.叶前坤.沈豪 基本信息 开源内容:https://github.com/d ...
- 【组队学习】【27期】动手学数据分析
动手学数据分析 论坛版块: http://datawhale.club/c/team-learning/25-category/25 开源内容: https://github.com/datawhal ...
- 【组队学习】【26期】动手学数据分析
动手学数据分析 论坛版块: http://datawhale.club/c/team-learning/25-category/25 开源内容: https://github.com/datawhal ...
- 【Datawhale】动手学数据分析
动手学数据分析 第一章:数据载入及初步观察 载入数据 任务一:导入numpy和pandas import numpy as np import pandas as pd 任务二:载入数据 train_ ...
- Datawhale动手学数据分析打卡
1.1 第一章:数据载入及初步观察 1.1.1 任务一:导入numpy和pandas import numpy as np import pandas as pd 1.1.2 任务二:载入数据 (1) ...
最新文章
- spring注入----反射模式
- Shape Drawable
- ABAP:利用SAP定时器自动刷新ALV
- 大剑无锋之已知后续遍历bfegcda,中序badefcg,前序是?【面试推荐】
- jdbc java数据库连接 3)Statement接口之执行DDL和DML语句的简化
- 提升您的Hibernate引擎
- java为什么不推荐使用stack_栈和队列的面试题Java实现,Stack类继承于Vector这两个类都不推荐使用...
- MacOSX系统怎么开启Root账户?Mac电脑开启root权限教程
- 老年机按键串号_为什么老人机依然很多人在用?
- PHP curl 直接获取请求变量,不直接输出
- 程序员面试 IT 公司,这些细节一定要注意!
- Python迭代对象、迭代器、生成器
- 后台admin省市县镇公共组件
- presto、druid、sparkSQL、kylin的对比分析
- Oracle实例解析:编码与字符集
- SOA概念的三个比喻
- 超实用的Mac风扇控制系统:Macs Fan Control Pro mac中文版
- 详细直播平台开发细节,提供成品直播系统源码
- Python之qq自动发消息
- torchaudio安装与实例
热门文章
- WAIC 2022 | 洞见科技在可信AI论坛联合发布《可信人工智能产业生态发展报告》
- 手机续航测试 软件,5款手机续航测试:iPhone11Pro不是第一,华为Mate30Pro夺冠
- headers的GMT时间转时间戳
- CI1302智能语音芯片应用于智能玩具,可实现离线语音交互功能,响应快,童音识别率高
- Python爬虫获取网易云音乐 我的喜欢歌单 歌曲数据
- 中国区块链技术论文首次中标国际顶会!创新工场王嘉平团队创造历史
- python apply函数_python玄学之 apply函数的axis参数
- kvm linux 网络不稳定,kvm 虚拟机网络配置有时会报错问题
- SpringBoot+MyBatis极速搭建教程
- 错路狂奔已久,美国准备好成为科学强国了吗?