第三章 建模与模型评价
第一节建模
使用泰坦尼克号的数据集,完成泰坦尼克号存活预测的任务
#第一步导入包
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from IPython.display import Image
import os
%matplotlib inline #matplotlib inline是IPython的魔法函数,可以在IPython编译器里直接使用,作用是内嵌画图,省略掉plt.show()这一步,直接显示图像。
# 画图的提前设置
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
plt.rcParams['figure.figsize'] = (10, 6) # 设置输出图片大小
读取数据,比较一下原始数据和清理后数据的差别
清洗后的数据讲分类特征变成了数值特征one-hot编码,去除了字符串
#读取原始数据集
os.getcwd() # 查看相对路径
train = pd.read_csv('train.csv')
#查看数据的一些特征
train.shape
train.info
train.head()
train.ndim
# 读取之前清洗过的数据
clear_data = pd.read_csv('clear_data.csv')
clear_data.head()
调用sklearn进行搭建模型
任务一:切割训练集和测试集
划分数据集的方式
sklearn中切割数据有多种方式:train_test_split(普通交叉随机抽样验证)、KFold(K折交叉验证)、StratifiedKFold:(分层K折抽样验证)
为什么使用分层抽样
更加灵活
任务提示1
切割数据集是为了后续能评估模型泛化能力
sklearn中切割数据集的方法为train_test_split
查看函数文档可以在jupyter noteboo里面使用train_test_split?后回车即可看到
分层和随机种子在参数里寻找
from sklearn.model_selection import train_test_split
#划分x和y
x_data = clear_data
y_data = train['Survived']
#对数据集进行分割
x_train, x_test, y_train, y_test = train_test_split(x_data, y_data, stratify=y_data, random_state=1) # random_state=1 设置随机数种子,保证每次一致;test_size默认值为0.25;设置stratify参数,可以处理数据不平衡问题
#分别查看分裂数据的特征
x_train.shape
x_test.shape
y_train.shape
y_test.shape
什么情况下切割数据集的时候不用进行随机选取
在数据集本身已经是随机处理之后的,或者说数据集非常大,内部已经足够随机了
#任务二:模型创建
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
#调用逻辑回归模型
lr = LogisticRegression()
# 对模型进行训练
lr.fit(x_train,y_train)
#查看训练集和测试集的得分
print("Training set score: {:.2f}".format(lr.score(x_train, y_train)))
print("Testing set score: {:.2f}".format(lr.score(x_test, y_test)))
#调用随机深林模型
rfc= RandomForestClassifier()
rfc.fit(x_train, y_train)
print("Training set score: {:.2f}".format(rfc.score(x_train, y_train)))
print("Testing set score: {:.2f}".format(rfc.score(x_test, y_test)))
任务三:输出模型预测结果
输出模型预测分类标签
输出不同分类标签的预测概率
#预测标签
pred = lr.predict(x_train)
pred[:5]
#预测标签概率
pred_proba = lr.predict_proba(x_train)
pred_proba[:10]
预测标签的概率对我们有什么帮助?
获取预测标签的概率分布,取最大的概率,可以得到最有可能的分类结果,跟贝叶斯的概率还有点类似
#第二节 模型评估
模型评估是为了知道模型的泛化能力。
交叉验证(cross-validation)是一种评估泛化性能的统计学方法,它比单次划分训练集和测试集的方法更加稳定、全面。
在交叉验证中,数据被多次划分,并且需要训练多个模型。
最常用的交叉验证是 k 折交叉验证(k-fold cross-validation),其中 k 是由用户指定的数字,通常取 5 或 10。
准确率(precision)度量的是被预测为正例的样本中有多少是真正的正例
召回率(recall)度量的是正类样本中有多少被预测为正类
f-分数是准确率与召回率的调和平均
from sklearn.metrics import confusion_matrix
# 训练模型
lr2 = LogisticRegression(C=100)
lr2.fit(x_train, y_train)
# 模型预测结果
pred = lr2.predict(x_train)
# 计算混淆矩阵
confusion_matrix(y_train, pred)
from sklearn.metrics import classification_report
# 精确率、召回率以及f1-score
print(classification_report(y_train, pred))
任务三:ROC曲线
ROC曲线在sklearn中的模块为sklearn.metrics
ROC曲线下面所包围的面积越大越好
from sklearn.metrics import roc_curve
fpr, tpr, thresholds = roc_curve(y_test, lr2.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)
感谢datawhale的组织,完整的敲完了代码