第三章 模型搭建和评估
完成泰坦尼克号存活预测
3.1建模
任务一:切割训练集和测试集
这里使用留出法划分数据集
- 将数据集分为自变量和因变量
- 按比例切割训练集和测试集(一般测试集的比例有30%、25%、20%、15%和10%)
- 使用分层抽样
- 设置随机种子以便结果能复现
任务提示1
- 切割数据集是为了后续能评估模型泛化能力
- sklearn中切割数据集的方法为
train_test_split
- 查看函数文档可以在jupyter noteboo里面使用
train_test_split?
后回车即可看到 - 分层和随机种子在参数里寻找
要从clear_data.csv和train.csv中提取train_test_split()所需的参数
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from IPython.display import Image
%matplotlib inline
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
plt.rcParams['figure.figsize'] = (10, 6) # 设置输出图片大小
#读取原始数据
train = pd.read_csv('train.csv')
#读取清洗过后的数据
clear_data = pd.read_csv('clear_data.csv')
from sklearn.model_selection import train_test_split
x=clear_data
y=train['Survived']
#划分训练集和测试集
x_train,x_test,y_train,y_test= train_test_split(x,y,stratify=y,random_state=0)
x_train.describe()
x_test.describe()
【参考】https://zhuanlan.zhihu.com/p/248634166
任务二:模型创建
- 创建基于线性模型的分类模型(逻辑回归)
- 创建基于树的分类模型(决策树、随机森林)
- 分别使用这些模型进行训练,分别的到训练集和测试集的得分
- 查看模型的参数,并更改参数值,观察模型变化
提示
- 逻辑回归不是回归模型而是分类模型,不要与
LinearRegression
混淆 - 随机森林其实是决策树集成为了降低决策树过拟合的情况
- 线性模型所在的模块为
sklearn.linear_model
- 树模型所在的模块为
sklearn.ensemble
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn import tree
#模型比较
#逻辑回归
lr = LogisticRegression()
lr.fit(x_train, y_train)
print("Score_LRtrain =",round(lr.score(x_train, y_train),3))
print("Score_LRtest =",round(lr.score(x_test, y_test),3))
#决策树
model = tree.DecisionTreeClassifier()
model.fit(x_train, y_train)
print("Score_DTtrain =",round(model.score(x_train, y_train),3))
print("Score_DTtest =",round(model.score(x_test, y_test),3))
#随机森林
rf = RandomForestClassifier()
rf.fit(x_train, y_train)
print("Score_RFtrain =",round(rf.score(x_train, y_train),3))
print("Score_RFtest =",round(rf.score(x_test, y_test),3))
#调参后模型比较
#逻辑回归
lr = LogisticRegression(C=0.9)
lr.fit(x_train, y_train)
print("Score_LRtrain_new =",round(lr.score(x_train, y_train),3))
print("Score_LRtest_new =",round(lr.score(x_test, y_test),3))
#决策树
model = tree.DecisionTreeClassifier(max_depth=10)
model.fit(x_train, y_train)
print("Score_DTtrain_new =",round(model.score(x_train, y_train),3))
print("Score_DTtest_new =",round(model.score(x_test, y_test),3))
#随机森林
rf = RandomForestClassifier(n_estimators=100,max_depth=10)
rf.fit(x_train, y_train)
print("Score_RFtrain_new =",round(rf.score(x_train, y_train),3))
print("Score_RFtest_new =",round(rf.score(x_test, y_test),3))
任务三:输出模型预测结果
- 输出模型预测分类标签
- 输出不同分类标签的预测概率
提示3
- 一般监督模型在sklearn里面有个
predict
能输出预测标签,predict_proba
则可以输出标签概率
#逻辑回归
y_predict_train=lr.predict(x_train)
predicted_probs_train = lr.predict_proba(x_train)
#决策树
y_predict_train=model.predict(x_train)
predicted_probs_train = model.predict_proba(x_train)
#随机森林
y_predict_train=rf.predict(x_train)
predicted_probs_train = rf.predict_proba(x_train)