动手学数据分析 | 模型建立与评估(五)

接上篇动手学数据分析 | 数据可视化(四)

经过前面的学习,可以对数据本身进行增删查补、清理等处理,那么下面就要开始使用处理好的数据,数据分析的目的也就是运用数据以及结合业务来得到某些结果。分析的第一步就是建模,搭建一个预测模型或者其他模型;得到模型结果后,要分析模型是不是足够可靠,即进行模型评估。针对泰坦尼克号数据集,数据分析目的就是完成泰坦尼克号存活预测的任务。

目录

一、建立模型

1.切割训练集和测试集

2.模型创建

3.输出模型预测结果

二、模型评估

 1.交叉验证

2.混淆矩阵


下面代码为本篇内容的基本代码准备工作:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from IPython.display import Image

%matplotlib inline

最后一行代码是python的魔法命令,它们都以%或者%%开头,以%开头的为行命令,只对命令所在的行有效。%%开头的为单元命令,必须出现在单元的第一行,对整个单元的代码进行处理。%matplotlib可以将matplotlib的图表直接嵌入到Notebook中,或使用指定的界面库显示图表,可以在Ipython编译器里直接使用。它的功能是内嵌绘图,并且可以省略掉plt.show()这一步。参数指定matplotlib图表的显示方式,inline表示将图表嵌入到Notebook中。(此处参考%matplotlib inline 是什么意思_lee_沐的博客-CSDN博客_%matplotlib inline

plt.rcParams['font.sans-serif'] = ['SimHei']    #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False      #用来正常显示负号
plt.rcParams['figure.figsize'] = (10, 6)        #设置输出图片大小

get_ipython().run_line_magic('matplotlib', 'inline')


#载入清洗后的数据clear_data.csv和原始数据train.csv
train = pd.read_csv('train.csv')
data = pd.read_csv('clear_data.csv')

data.shape      #(891, 11)

一、建立模型

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

这里使用机器学习最常用的一个库sklearn来完成模型的搭建。

1.切割训练集和测试集

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

from sklearn.model_selection import train_test_split

#将数据集分为自变量和因变量,一般先取出X和y后再切割
X = data                #x是清洗好的数据
y = train['Survived']   #y是要预测的存活数据'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, 11), (223, 11))

train_test_split(train_data, train_target, test_size, random_state)是sklearn中切割数据集的函数。train_data表示所要划分的样本特征集;train_target表示所要划分的样本结果;test_size是样本占比,如果是整数的话就是样本的数量。random_state是随机数种子,即该组随机数的编号,设置随机种子以便结果能复现。如随机数种子设为1,在其他参数一样的情况下得到的随机数组是一样的;默认值为False,即每次切分比例虽相同,但切分结果不同。stratify是输入类数组对象, 默认值None。否则,以分层抽样方式拆分数据,并将其用作类标签。它可以保持split前类的分布,如训练集和测试集数量比例是A:B=4:1,即split前的比例(80: 20),通常在类分布不平衡情况下会用到。

2.模型创建

线性模型所在的模块为`sklearn.linear_model`,树模型所在的模块为`sklearn.ensemble`:

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

设置默认参数的逻辑回归模型(基于线性模型的分类模型)和简单调参的逻辑回归模型:

lr = LogisticRegression()
lr.fit(X_train, y_train)

#查看训练集和测试集score值:
print("Training set score: {:.2f}".format(lr.score(X_train, y_train)))   #Training set score: 0.80
print("Testing set score: {:.2f}".format(lr.score(X_test, y_test)))      #Testing set score: 0.79


#调整参数后的逻辑回归模型(但是效果并不好)
lr2 = LogisticRegression(C=20)
lr2.fit(X_train, y_train)
print("Training set score: {:.2f}".format(lr2.score(X_train, y_train)))
print("Testing set score: {:.2f}".format(lr2.score(X_test, y_test)))

第二步调参的模型中的参数C是正则化系数的倒数,默认为1.0,这个值越小正则化效果越强,训练的模型更泛化,但也更容易欠拟合。LogisticRegression()的用法具体可参考sklearn 逻辑回归(Logistic Regression)详解 | 程序员笔记

设置默认参数的随机森林模型(基于树的分类模型,该模型其实是决策树集成为了降低决策树过拟合的情况)和简单调参的随机森林模型:

rfc = RandomForestClassifier()
rfc.fit(X_train, y_train)
print("Training set score: {:.2f}".format(rfc.score(X_train, y_train)))   #Training set score: 1.00
print("Testing set score: {:.2f}".format(rfc.score(X_test, y_test)))      #Testing set score: 0.83

#调整参数后的随机森林分类模型
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)))

第二步调参的模型中设置的参数n_estimators是在利用最大投票数或平均值来预测前,想要建立子树的数量,较多的子树可以让模型有更好的性能,但同时让代码运行变慢。只要处理器能够承受的住,应该选择尽可能高的值,因为这使预测更好更稳定。RandomForestClassifier()的具体用法可参考机器学习——随机森林,RandomForestClassifier参数含义详解

3.输出模型预测结果

一般监督模型在sklearn中有`predict`输出预测标签,`predict_proba`输出标签概率

pred = lr.predict(X_train)               #输出模型预测分类标签
pred_proba = lr.predict_proba(X_train)   #输出不同分类标签的预测概率

二、模型评估

模型评估是为了知道模型的泛化能力。

交叉验证(cross-validation)是一种评估泛化性能的统计学方法,它比单次划分训练集和测试集的方法更加稳定、全面。在交叉验证中,数据被多次划分,并且需要训练多个模型。最常用的交叉验证是k折交叉验证(k-fold cross-validation),其中k是由用户指定的数字,通常取5或10。

准确率(precision)度量的是被预测为正例的样本中有多少是真正的正例,召回率(recall)度量的是正类样本中有多少被预测为正类。f-分数是准确率与召回率的调和平均。

 1.交叉验证

交叉验证在sklearn中的模块为`sklearn.model_selection`:

from sklearn.model_selection import cross_val_score

用10折交叉验证评估逻辑回归模型:

scores = cross_val_score(lr, X_train, y_train, cv=10)  #

scores   #k折交叉验证分数
# array([0.85074627, 0.76119403, 0.76119403, 0.80597015, 0.88059701,
#        0.85074627, 0.74626866, 0.82089552, 0.75757576, 0.75757576])

#计算交叉验证精度的平均值
print("Average cross-validation score: {:.2f}".format(scores.mean()))   #Average cross-validation score: 0.80

2.混淆矩阵

混淆矩阵的方法在sklearn中的`sklearn.metrics`模块,精确率、召回率以及f-分数可使用`classification_report`模块

from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report

#混淆矩阵
confusion_matrix(y_train, pred)     #混淆矩阵需要输入真实标签和预测标签
# array([[358,  54],
#        [ 78, 178]], dtype=int64)


# 精确率、召回率以及f1-score
print(classification_report(y_train, pred))
#               precision    recall  f1-score   support

#            0       0.82      0.87      0.84       412
#            1       0.77      0.70      0.73       256

#     accuracy                           0.80       668
#    macro avg       0.79      0.78      0.79       668
# weighted avg       0.80      0.80      0.80       668

3.ROC曲线

ROC曲线是显示Classification模型真正率和假正率之间折中的一种图形化方法。一个好的分类模型应该尽可能靠近图形的左上角,而一个随机猜测模型应位于连接点(TPR=0,FPR=0)和(TPR=1,FPR=1)的主对角线上。ROC曲线下方的面积(Area Under the ROC Curve, AUC)提供了评价模型平均性能的另一种方法,它的曲线下方所包围的面积越大越好。如果模型是完美的,那么AUC=1,如果模型是个简单的随机猜测模型,那么AUC=0.5。此处参考ROC曲线、FROC曲线、SROC曲线和LROC曲线_Never_Jiao的博客-CSDN博客_sroc曲线

from sklearn.metrics import roc_curve     #ROC曲线在sklearn中的模块为`sklearn.metrics`

#绘制ROC曲线
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)")
close_zero = np.argmin(np.abs(thresholds))   #找到最接近于0的阈值
plt.plot(fpr[close_zero], tpr[close_zero], 'o', markersize=10, label="threshold zero", fillstyle="none", c='k', mew=2)
plt.legend(loc=4)

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值