Task05 模型的建立与评估

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

1模型的建立

1.1 库的导入

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from IPython.display import Image
from sklearn.model_selection import train_test_split  #划分数据集
from sklearn.linear_model import LogisticRegression  #逻辑回归
from sklearn.ensemble import RandomForestClassifier   #随机森林
%matplotlib inline
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
plt.rcParams['figure.figsize'] = (10, 6)  # 设置输出图片大小

1.2 数据导入

#清洗后的数据
clear_data=pd.read_csv("clear_data.csv")
clear_data.head()

Task05 模型的建立与评估_第1张图片

#原始数据
train=pd.read_csv("train.csv")
train.head()

Task05 模型的建立与评估_第2张图片

可以看出,clear_data是train清洗完后的结果,它删除了如name、ticket、cabin这些对预测没有用的数据,并对有缺失值的数据进行插补,将sex和embarked用one-hot进行编码。

1.3 模型建立

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

1.3.1 划分训练集和测试集

数据集的三种划分方式:留出法、交叉验证、自助法。

留出法:是直接将数据集 D 划分为两个互斥的集合,其中一个集合作为训练集 ,另一个作为测试集 。我们需要注意的是在划分的时候要尽可能保证数据分布的一致性,即避免因数据划分过程引入额外的偏差而对最终结果产生影响。为了保证数据分布的一致性,通常我们采用 分层采样 的方式来对数据进行采样。

k 折交叉验证:通常将数据集 D 分为 k 份,其中的 k-1 份作为训练集,剩余的那一份作为测试集,这样就可以获得 k 组训练/测试集,可以进行 k 次训练与测试,最终返回的是 k 个测试结果的均值。一般为十折交叉验证。K=1时称为留一法。

自助法:我们每次从数据集D中取一个样本作为训练集中的元素,然后把该样本放回,重复该行为 m 次,这样我们就可以得到大小为m的训练集,在这里面有的样本重复出现,有的样本则没有出现过,我们把那些没有出现过的样本作为测试集。进行这样采样的原因是因为在D中约有 36.8% 的数据没有在训练集中出现过。

(以上:来自https://blog.csdn.net/weixin_38753213/article/details/112690712)

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

  • 将数据集分为自变量和因变量
  • 按比例切割训练集和测试集(一般测试集的比例有30%、25%、20%、15%和10%)
  • 使用分层抽样
  • 设置随机种子以便结果能复现
#确定自变量和因变量
y=train.Survived
X=clear_data

#以测试集30%的比例切割测试集和训练集,并设置随机种子random_state=1,采用分层采样。
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=1,stratify=y) 

X_train.shape,X_test.shape
#结果:((623, 11), (268, 11))

1.3.2 模型创建和预测

我们使用逻辑回归和随机森林对泰坦尼克号的数据进行预测。逻辑回归和随机森林都是用于分类的模型。

使用逻辑回归建立模型

#逻辑回归(不调参数)
model_lr =  LogisticRegression()    #模型建立
model_lr.fit(X_train,y_train)       #对训练数据进行模型拟合
y_predict = model_lr.predict(X_test)    #对测试集进行预测
model_lr.score(X_train,y_train)    #训练集得分
model_lr.score(X_test,y_test)      #测试集得分

#结果:
#0.8073836276083467
#0.7947761194029851
#可以看到训练集的预测得分为0.807、测试集的预测得分为0.795。
#逻辑回归(改变参数)
model_lr =  LogisticRegression()    #模型建立
model_lr.fit(X_train,y_train)       #对训练数据进行模型拟合
y_predict = model_lr.predict(X_test)    #对测试集进行预测
model_lr.score(X_train,y_train)    #训练集得分
model_lr.score(X_test,y_test)      #测试集得分

#结果:
#0.8009630818619583
#0.7947761194029851
#可以看到训练集的预测得分为0.801、测试集的预测得分为0.795。

逻辑回归的具体参数可参考:https://blog.csdn.net/weixin_50304531/article/details/109717609

使用随机森林建立模型

#随机森林(不改参数)
model_rf=RandomForestClassifier()
model_rf.fit(X_train,y_train)
y_predict=model_rf.predict(X_test)
model_rf.score(X_train,y_train)
model_rf.score(X_test,y_test)

#结果:
#1.0
#0.8097014925373134
#可以看到训练集的预测得分为1.0、测试集的预测得分为0.81。
#随机森林(改变参数)
model_rf=RandomForestClassifier(n_estimators=100, max_depth=5)
model_rf.fit(X_train,y_train)
y_predict=model_rf.predict(X_test)
model_rf.score(X_train,y_train)
model_rf.score(X_test,y_test)

#0.8764044943820225
#0.8208955223880597
#可以看到训练集的预测得分为0.876、测试集的预测得分为0.821。

随机森林的具体参数可参考:https://blog.csdn.net/ustbclearwang/article/details/81237516

1.4 模型的评估

  • 交叉验证可用来评估泛化性能
  • 通常看混淆矩阵(如下图)来评估模型的效果,常用的指标有:准确率、精确率、召回率、F值。
  • 准确率(accuracy)度量的是预测正确的值占总观测对象的比例。
  • 精确率(precision)度量的是被预测为正例的样本中有多少是真正的正例。
  • 召回率(recall)度量的是正类样本中有多少被预测为正类。又称为灵敏度。
  • f-分数是准确率与召回率的调和平均

Task05 模型的建立与评估_第3张图片

#交叉验证
from sklearn.model_selection import cross_val_score
model_lr=LogisticRegression(C=100)
scores=cross_val_score(model_lr,X_train,y_train,cv=10)
scores

#结果:
#array([0.79365079, 0.6984127 , 0.77777778, 0.79032258, 0.85483871,
#       0.80645161, 0.87096774, 0.74193548, 0.79032258, 0.80645161])
#混淆矩阵和评价指标
from sklearn.metrics import confusion_matrix
model_lr=LogisticRegression(C=100)
model_lr.fit(X_train,y_train)
pred=model_lr.predict(X_test)
confusion_matrix(y_test,pred)  #计算混淆矩阵

#结果
#array([[145,  20],
#       [ 35,  68]], dtype=int64)

from sklearn.metrics import classification_report  #精确率、召回率和F值
print(classification_report(y_test,pred))

Task05 模型的建立与评估_第4张图片

#ROC曲线 横坐标是假阳性率、纵坐标是真阳性率
from sklearn.metrics import roc_curve
fpr,tpr,thresholds = roc_curve(y_test, model_lr.decision_function(X_test))  #decision_function不是很理解是干啥的。
plt.plot(fpr,tpr,label="ROC Curve")
plt.xlabel("FPR")
plt.ylabel("TPR(recall)")
#找到最接近于0的阈值 ROC曲线可以用于评价一个分类器,最接近0的阈值可以找到最佳的分类结果,是为了得到TPR最大,FPR最小的结果。可以识别更多正确的样本。
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)

Task05 模型的建立与评估_第5张图片

ROC曲线下的面积大小为AUC值,AUC的取值一般在0.5-1之间,越大说明模型的性能越好。

明天要考英语了,先这样吧,考完再写详细一点。

你可能感兴趣的:(Task05 模型的建立与评估)