建模
数据分析我认为最重要的部分就是运用我们目前已有的数据建立模型,对未知的东西进行一个预测。当然数据本身也是非常重要的,所以需要前面的增删查补,对数据进行一个规整,以此可以训练出一个健壮的模型。
首先是导入包
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from IPython.display import Image
前面三个库是老朋友了,就不做过多的介绍了。
- seaborn
seaborn和matplotlib一样是一个数据可视化的库,但不一样的地方在于seaborn是在matplotlib的基础上及逆行了更高级的API封装,可以通过更少的代码去调用matplotlib的方法,而且它的默认绘图风格和色彩搭配都更具吸引力,不是说matplotlib不行,matplotlib可以制作具有更多特色的图。
- IPython.display.Image
不好意思暂时没搞懂用来干嘛的哈哈哈,没看明白。 网页链接:Module: display — IPython 3.2.1 documentation
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
plt.rcParams['figure.figsize'] = (10, 6) # 设置输出图片大小
通常matplotlib制作图标标题时,最容易遇到中文字符乱码的问题,在输出图表之前写入plt.rcParams['font.sans-serif'] = ['SimHei']
代码,可以避免这个问题。例如:
加代码前:
加代码后:
切割训练集和测试集
训练模型时,通常不会将所有的数据一股脑丢进去进行训练,否则训练出来的结果我们没有办法去估量它到底是不是一个良好的模型,所以我们需要保留一部分的数据,用于测试或者验证,看看模型有没有举一反三的能力,如果训练出来的模型只能用于当前数据,而对新数据无法进行预测,那么这个模型将意义不大。一般的数据集会被分为:训练集、验证集和测试集。
- 训练集:训练集的数据都是用于训练模型的参数
- 验证集:验证集的数据是用于对模型的参数进行调优,并初步评估模型是否正确
- 测试集:测试集的数据用于测试模型的泛化能力,以”未知的数据“这个身份进行测试,以此来确定最终模型
但在一般的模型里,用的较多的就是训练集和测试集,而没有验证集,这个先不说。
对数据集进行切割时,最常见的比例就是7:3和8:2(训练集:测试集),吴恩达老师说过:80%的数据+20%的模型=更好的机器学习,当然不一定只能遵守”二八定律“,学习者应该根据具体数据进行人为的判断,尝试更多切割比例来找到一个对模型训练最优的。(不过我觉得训练集必须得比测试集多,没试过”以小博大“)
载入数据
# 读取原数据数集
train = pd.read_csv('train.csv')
#读取清洗过的数据集
data = pd.read_csv('clear_data.csv')
X = data
y = train['Survived']
这里原数据和清洗过的数据基本上是一样的,只不过清洗过的数据少了”Survived“,所以清洗过的数据我们将它作为特征,而原数据里的"Survived"作为标签。
导入切割数据集的库
from sklearn.model_selection import train_test_split
train_test_split语法:
X_train,X_test, y_train, y_test =cross_validation.train_test_split(X,y,test_size, random_state)
参数说明:
- X:待划分的样本特征集合
- y:待划分的样本标签
- test_size: 若在0~1之间,为测试集样本数目与原始样本数目之比;若为整数,则是测试集样本的数目。
- random_state:随机数种子
- X_train:划分出的训练集数据(返回值)
- X_test:划分出的测试集数据(返回值)
- y_train:划分出的训练集标签(返回值)
- y_test:划分出的测试集标签(返回值)
- shuffle:是否打乱数据的顺序,再划分,默认True
- stratify:none或者array/series类型的数据,表示按这列进行分层采样
train_test_split()
可以对数据集进行随机分组,设置的随机种子数不同,最后分组后的数据也就不同,通常为了保证代码的可复现,随机种子数一般保持不变。stratify参数默认为none,可以选择根据某列来进行分层抽样。
创建模型
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)))
print("Testing set score: {:.2f}".format(lr.score(X_test, y_test)))
# 输出结果
Training set score: 0.80
Testing set score: 0.79
参数调整
首次跑通模型时,常常需要进一步对模型的参数进行修改,以便寻找出良好的模型
# 调整参数后的逻辑回归模型
lr2 = LogisticRegression(C=100)
lr2.fit(X_train, y_train)
# 查看训练集和测试集score值
print("Training set score: {:.2f}"