数据建模与评估
本文记录2022年3月组队学习-动手学数据分析教程知识点,采用kaggle上泰坦尼克的任务,实战数据分析全流程。
教程内容开源地址:
github
: https://github.com/datawhalechina/hands-on-data-analysis
gitee
:https://gitee.com/datawhalechina/hands-on-data-analysis
前面我们已经做足了数据的准备,研究数据本身的特征,现在我们要进一步对数据进行挖掘,找到背后的隐藏信息以及数据的潜在规律并建立模型进行预测。然后基于可能的情况,做出决策的分析与调整。
本篇主要包括机器学习库sklearn
搭建模型的过程,以及得到模型后怎么分析我们的模型是不是足够的可靠,因此我们要对模型进行评估。
sklearn
用户指南:https://scikit-learn.org.cn/lists/2.html
5.1 准备
本次实验平台为: Jupyter Notebook
、Numpy
、Pandas
、sklearn
# 导入基本库
import pandas as pd
import numpy as np
# 导入清洗后数据集
data = pd.read_csv("clear_data.csv")
5.2 模型搭建
5.2.1 模型的选择与搭建的逻辑
知识点:
- 在进行模型选择之前我们需要先知道数据集最终是进行监督学习还是无监督学习,主要区别在于是否有标签用于测试的数据中,以及是否需要对数据进行分类。举个例子,类似于天气晴天与阴天的分类,当天天气情况作为一种分类标签,而比如鸡尾酒会等聚类分析属于无监督学习.
- 模型的选择一方面是通过我们的任务来决定的。除了根据我们任务来选择模型外,还可以根据数据样本量以及特征的稀疏性来决定,刚开始我们总是先尝试使用一个基本的模型来作为其baseline,进而再训练其他模型做对比,最终选择泛化能力或性能比较好的模型。
我们这里使用一个机器学习最常用的一个库(sklearn)来完成我们模型的搭建。
5.2.2 训练集与测试集划分
知识点:
- 一般在进行模型创建之前会将数据切割成训练集和测试集,有时候也要有验证集,这样都是为了保证模型的泛化能力,在具体的数据切割过程中有很多的切割方法,本次主要分享留出法和交叉验证法。
- 留出法:按照同数据集分步划分成训练和测试集保证样本类别比例相似,又称为分层采样。但如果训练集包含大部分样本,训练时极大接近原始数据集,测试集数量相对较小,评估结果不太可信。
- 交叉验证法:将数据集划分为k个大小相同的互斥子集,然后每次用k-1作为训练集,余下的做测试集,又称为
k折交叉验证法
。训练集样本多,模型能够得到充分训练,但模型的泛化能力较差。当只留下一个样本时,我们称之为留一法。适用于样本量比较少的情况。 - **自助法:**每次随机挑选一个样本,拷贝后放入新数据集,使得再次也有可能被挑选中,重复操作m次。适用于数据集少,难以划分训练/测试集是有用,对集成学习有很大帮助。
切割数据集是为了后续能评估模型泛化能力,sklearn中切割数据集的方法为train_test_split
。
- 在
train_test_split
中, 我们需要给定数据集的自变量和因变量对应X与Y的位置,另外要确定split分割方法是否随机还是直接分层划分,也是根据我们的数据特性来的。 train_test_split(arrays, test_size, train_size, random_state, shuffle, stratify)
arrays
,#要分割的数据,被分割的数据因变量和自变量的数量是相同的。test_size
,train_size
训练集与测试集大小。random_state
随机种子若为整数表示每次结果相同,可重复实验;若为0或不填表示随机分割,不可复现shuffle
打乱数据。stratify
按分层采样。
from sklearn.model_selection import train_test_split
X = data
y = train['Survived']
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=0)
X_train<